基于梵·高《向日葵》的图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法)【Python-Open_CV系列(六)】
ʚʕ̯•͡˔•̯᷅ʔɞ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ
🍹欢迎来到小酒主页指导
☀️本期文章将学习基于梵·高《向日葵》的图像阈值处理专题(二值处理、反二值处理、截断处理、自适应处理及Otsu方法) – Open_CV系列博文第六篇,我是博主侯小啾。✨
✨我的博客主页:云雀编程巢🌹꧔ꦿ
🌹꧔ꦿ如果博文内容对你有帮助,请点个赞+关注+收藏✨
ʚʕ̯•͡˔•̯᷅ʔɞ上期回顾👇
🌹꧔ꦿ最后一个传送门:
✨OpenCV图像处理基本操作 【Python-Open_CV系列(一)】
✨OpenCV像素处理基本操作 【Python-Open_CV系列(二)】
✨OpenCV之 BGR、GRAY、HSV色彩空间&色彩通道专题 【Python-Open_CV系列(三)】
✨OpenCV绘制图像与文字(可作为脚手架代码)(python) 【Python-Open_CV系列(四)】
✨OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】
如果您有任何疑问,请随时在评论部分分享。 🍹
🍹1. 什么是阈值处理?
在图像处理中,阈值处理是一种非常重要的处理方法。阈值化就是给像素值设置一个阈值,然后将所有像素值与目标阈值进行比较。根据像素值与阈值的关系,对像素值进行相应的调整,以达到预期的影响画面的效果。阈值化在计算机视觉技术中心非常重要。经过阈值处理后,像素可能肉眼看起来不是很好,但对于程序来说,图片上的人或物体通常更容易找到特征进行识别。出去。从而达到识别的目的。
阈值处理常用的方法:threshold()方法。
✨ 它的语法如下:
threshold(src, thresh, maxval, type, dst=None)
- src:
原始图像 - thresh:
临界点 - maxval:
阈值处理采用的最大值,通常选择255作为最大值,即白色。 - type:
阈值类型。
常见的阈值类型
类型 | 含义 |
---|---|
cv2.THRESH_BINARY | 二值化阈值处理 |
cv2.THRESH_BINARY_INY | 反二值化阈值处理 |
cv2.THRESH_TOZERO | 低于阈值零处理 |
cv2.THRESH_TOZERO_INV | 超出阈值零处理 |
cv2.THRESH_TRUNC | 截断阈值处理 |
🍹2.二值化处理 与 反二值化处理
二值化处理也称为二值化阈值处理,将每个像素值与指定的阈值进行比较,大于阈值的像素值变为最大值,小于阈值的像素值变为零。最终,像素中只能保留两个像素值,就可以得到一张“黑或白”的图像(不同于灰度处理)。
反二值化处理的处理结果与二值化处理相反,得到的也是只有黑白两种颜色的图像,不同之处在于大于阈值的像素值变为0,小于阈值的变为阈值处理采用的最大值。
下面以二值化处理的方法为例,
选择图片素材:
✨梵高《向日葵》✨
以127作为阈值,255为阈值处理最大值为例,读取图像时,需要先将图像转化为灰度图像。
import cv2
# 将图像读成灰度图像
img = cv2.imread("sunflowers.jpg", 0)
# 做二值化处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 其中返回的t即我们选择的阈值127。
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
处理效果:
👇类似地,去二值化“向日葵”:
import cv2
img = cv2.imread("sunflowers.jpg", 0)
# 反二值化阈值处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
🍹3. 零处理
零处理包括低于阈值零处理和超出阈值零处理(也称低阈值零处理和高阈值零处理)。低于阈值零处理将低于阈值的像素值变为0,超出阈值零处理则将高于阈值的像素值变为0。
import cv2
img = cv2.imread("sunflowers.jpg", 0)
# 低于阈值零处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
img = cv2.imread("sunflowers.jpg", 0)
# 超出阈值零处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
👇超阈值零处理效果渲染:
🍹4. 截断处理
截断过程也称为截断阈值过程。大于阈值的像素值变为与阈值相同,小于阈值的像素值保持不变。
经过截断处理后,图像整体颜色会变暗,亮度会降低,原本浅色区域的颜色会变浅。
代码示例如下:
import cv2
# 将图像读成灰度图像
img = cv2.imread("sunflowers.jpg", 0)
# 截断处理
t, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
🍹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。可以看出,右图中的向日葵的轮廓明显要比左图相对更为清晰。
本次分享就到这里,如果您有更棒的理解或者技术方案,或是疑问,欢迎随时在评论区分享或交流!我们下期blog见。
竹子🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ
文章出处登录后可见!