🍹5.五种处理方式汇总
👇将以上五种阈值处理方式汇总对比其效果:
import cv2 image = cv2.imread(""sunflowers.jpg".jpg") # 因为原图尺寸过大,不方便展示,所以先缩放一倍。 image = cv2.resize(image, None, fx=0.5, fy=0.5) # 转化为灰度图像 image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) print(image_Gray.shape) # 二值化阈值处理 t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY) # 反二值化阈值处理 t2, dst2 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY_INV) # 低于阈值零处理 t3, dst3 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TOZERO) # 超出阈值零处理 t4, dst4 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TOZERO_INV) # 截断处理 t5, dst5 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TRUNC) # 分别显示经过5种阈值类型处理后的图像 cv2.imshow("BINARY", dst1) cv2.imshow("BINARY_INV", dst2) cv2.imshow("TOZERO", dst3) cv2.imshow("TOZERO_INV", dst4) cv2.imshow("TRUNC", dst5) cv2.waitKey() cv2.destroyAllWindows()
这五种阈值处理的方法,的处理出的图像轮廓多少还是会有些模糊不清,不利于程序做进一步的处理。使用自适应处理可以有效改善该问题。
🍹6. 自适应处理
自适应处理是一种改进过的阈值处理技术,其阈值是对图像区域中的某一正方形区域内的所有色素值使用指定的算法而得到的,从而而对像素进行相应的处理。自适应处理本身不属于阈值处理方法,算是对阈值处理的改进,其使用过程中可以选择使用二值化处理或反二值化处理的处理方式。
OpenCV中,做自适应处理使用的是cv2.adaptiveThreshold方法,
该方法语法如下
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
其中,
adaptiveMethod 是自适应阈值的计算方法,该方法有两种,
- cv2.ADAPTIVE_THRESH_MEAN_C : 对一个正方形区域内的所有像素进行平均加权。
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C : 根据高斯函数按照像素与中心店的距离对一个正方形区域内的所有像素进行加权计算。
thresholdType 即阈值处理类型。可以是二值化处理(cv2.THRESH_BINARY)或反二值化处理(cv2.THRESH_BINARY_INY)。
blockSize 计算阈值算法中的正方形区域的边长大小。
C 常量 最终的阈值等于均值减去这个常量 或 加权值减去这个常量
dst 经过阈值处理后的图像。
下边分别使用两种阈值计算方法对图片进行自适应处理,两种方法得到的结果有一定的细微差异。
✨平均法 cv2.ADAPTIVE_THRESH_MEAN_C
import cv2 image = cv2.imread("sunflowers.jpg") image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) athdMEAM = cv2.adaptiveThreshold(image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3) cv2.imshow("MEAN_C", athdMEAM) cv2.waitKey() cv2.destroyAllWindows()
✨高斯法 cv2.ADAPTIVE_THRESH_GAUSSIAN_C
import cv2 image = cv2.imread("sunflowers.jpg") image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) athdGAUS = cv2.adaptiveThreshold(image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3) cv2.imshow("GAUSSIAN_C", athdGAUS) cv2.waitKey() cv2.destroyAllWindows()
🍹7. Otsu方法
除了自适应处理外,Opencv还提供了Otsu方法来遍历所有可能的阈值,从而得出最合适的阈值。
Ostu方法不是独立的函数方法,其实现基于上边实现五种阈值处理的threshold() 方法,只是需要在其阈值处理类型参数type后方 续写上 + cv2.THRESH_OTSU 字样(非字符串)。
👇示例如下,依然操作向日葵:
import cv2 image = cv2.imread("sunflowers.jpg") # 灰度处理 image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # t=127的二值化处理 t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY) # OTSU的二值化处理 t2, dst2 = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 打印最佳阈值 print(t2) cv2.imshow("BINARY", dst1) cv2.imshow("OTSU", dst2) cv2.waitKey() cv2.destroyAllWindows()
程序执行结果如下:
👇程序执行效果如下,左图为阈值为127时的二值化处理结果,右图为阈值最佳时的二值化处理结果,此时阈值为147.0。可以看出,右图中的向日葵的轮廓明显要比左图相对更为清晰。