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

2022-07-15,,,,

一、图像二值化

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()

到此这篇关于详解python+opencv实现图像二值化的文章就介绍到这了,更多相关python opencv图像二值化内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

《详解Python+OpenCV实现图像二值化.doc》

下载本文的Word格式文档,以方便收藏与打印。