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