当前位置:主页 > 软件编程 > Python代码 >

详解Python+OpenCV实现图像二值化

时间:2023-01-05 11:09:59 | 栏目:Python代码 | 点击:

一、图像二值化

1.效果

2.源码

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
 
# img = cv2.imread('test.jpg')                         #这几行是对图像进行降噪处理,但事还存在一些问题。
 
# dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
 
# plt.subplot(121),plt.imshow(img)
# plt.subplot(122),plt.imshow(dst)
# plt.show()
fn = "cell.png"
if __name__ == '__main__':
    print('loading %s' % fn)
    img = cv2.imread(fn)               #读取图像 修改上方 fn的路径即可 
    sp = img.shape
    print(sp)                          #在编译结果处显示图片的信息 这行没啥用 
    
    # 获取图像大小
    sz1 = sp[0]                         #长 
    sz2 = sp[1]                         #宽 
    print('width:%d\nheight:%d' % (sz2,sz1)) #控制窗口显示的比例 
    # 创建一个窗口显示图像
    cv2.namedWindow('img')              #这行没啥用 控制显示图片窗口的名字 
    cv2.imshow('img',img)               #显示图片 
    # 复制图像矩阵,生成与源图像一样的图像,并显示
    myimg2 = img.copy();
    cv2.namedWindow('myimg2')           #这行没啥用 控制显示图片窗口的名字 
    cv2.imshow('myimg2',myimg2)
    # 复制并转换为灰度化图像并显示
    myimg1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度值函数 
    cv2.namedWindow('myimg1')
    cv2.imshow('myimg1',myimg1)            #显示灰度处理后的函数  
    cv2.imwrite('gray.jpg', myimg1)     #保存当前灰度值处理过后的文件 
    cv2.waitKey()         #第一个参数是保存文件的名称,必须加jgp,png等的后缀否则报错。第二个参数是保存的对象
    cv2.destroyAllWindows()

二、图像二值化(调节阈值)

1.源码一

代码如下(示例):

import cv2

def nothing():  # 定义回调函数
    pass

def image_processing(img, Gauss_flag=1, Color_flag=1, Gray_flag=0):  # 图像预处理
    # 高斯滤波器平滑图像
    if Gauss_flag == 1:
        img = cv2.GaussianBlur(img, (3, 3), 0)
    # 均衡彩色图像的直方图
    if Color_flag == 1:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
    # 均衡灰度图像的直方图
    if Gray_flag == 1:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 将彩色图像转为灰度图像
        img = cv2.equalizeHist(img)

    return img

def image_canny(img):  # 图像边缘检测

    # 设置窗口
    cv2.namedWindow('Canny')

    # 创建滑动条,分别控制各个参数
    cv2.createTrackbar('threshold1', 'Canny', 50, 300, nothing)  # 阈值1
    cv2.createTrackbar('threshold2', 'Canny', 100, 300, nothing)  # 较大的阈值2用于检测图像中明显的边缘
    # cv2.createTrackbar('apertureSize', 'Canny', 0, 2, nothing)  # Sobel算子大小(3,5,7)
    cv2.createTrackbar('L2gradient', 'Canny', 0, 1,
                       nothing)  # 参数(布尔值):true:使用更精确的L2范数(两个方向的倒数的平方和再开放),false:使用L1范数(直接将两个方向导数的绝对值相加)

    while (1):
        # 返回滑动条所在位置的值
        threshold1 = cv2.getTrackbarPos('threshold1', 'Canny')  # 阈值1
        threshold2 = cv2.getTrackbarPos('threshold2', 'Canny')  # 阈值2
        L2gradient = cv2.getTrackbarPos('L2gradient', 'Canny')  # 参数
        # aperturesize = cv2.getTrackbarPos('apertureSize', 'Canny')  # Sobel算子大小
        # size = aperturesize * 2 + 3  # Sobel算子大小(3,5,7)

        # Canny边缘检测
        img_edges = cv2.Canny(img, threshold1, threshold2, L2gradient=L2gradient)

        # 显示边缘化图像
        cv2.imshow('Canny', img_edges)

        if cv2.waitKey(1) == ord('q'):  # 按q退出
            break
        elif cv2.waitKey(1) == ord('s'):  # 按s保存图像到原图像所在目录,命名为output.jpg,再退出!

            cv2.imwrite('\\'.join(img_path.split('\\')[:-1]) + '\\output.jpg', img_edges)
            print("图像成功保存")
            break

    cv2.destroyAllWindows()

if __name__ == "__main__":
    img_path = input("请输入图片地址(如E:\\Code\\xx.jpg):")  # 输入原图像地址
    guass_flag = int(input("是否进行高斯滤波(输入1进行,输入0不进行):"))  # 输入1为进行高斯滤波,输入0为不进行
    color_flag = int(input("是否均衡彩色图像(输入1进行,输入0不进行):"))  # 输入1为进行彩色图像均衡,输入0为不进行
    gray_flag = int(input("是否均衡灰度图像(输入1进行,输入0不进行):"))  # 输入1为进行灰度图像均衡,输入0为不进行
    # 载入图像
    image = cv2.imread(img_path)
    # 图像预处理
    img = image_processing(image, Gauss_flag=guass_flag, Color_flag=color_flag, Gray_flag=gray_flag)
    # 显示原图像
    cv2.imshow('Original', image)
    # 显示预处理后图像
    cv2.imshow('Pretreatment', img)
    # 图像边缘检测
    image_canny(img)

2.源码二

代码如下(示例):

import cv2
#载入图片
img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png')
#设置窗口
cv2.namedWindow('Canny')
#定义回调函数
def nothing(x):
    pass
#创建两个滑动条,分别控制threshold1,threshold2
cv2.createTrackbar('threshold1','Canny',50,400,nothing)
cv2.createTrackbar('threshold2','Canny',100,400,nothing)
while(1):
    #返回滑动条所在位置的值
    threshold1=cv2.getTrackbarPos('threshold1','Canny')
    threshold2=cv2.getTrackbarPos('threshold2','Canny')
    #Canny边缘检测
    img_edges=cv2.Canny(img_original,threshold1,threshold2)
    #显示图片
    cv2.imshow('original',img_original)
    cv2.imshow('Canny',img_edges)  
    if cv2.waitKey(1)==ord('q'):
        break
cv2.destroyAllWindows()

您可能感兴趣的文章:

相关文章