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

目录

一、图像二值化

1.效果

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

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.源码一

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

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

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

代码如下(示例):

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()
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容