目录
简单阈值处理方法
ret,dst = cv2.threshold(src,thresh,maxval,type)
- ret:返回的阈值
- dst:返回的图像
- src:已通过cv2,read获取的图片
- thresh:设定的阈值 一般为127 为0~255的中间
- maxval:当像素值超过了阈值,所赋予的值
- type:二值化操作的类型
type类型包括
- cv2.THRESH_BINARY:二进制阈值处理。如果像素值大于阈值,则将其设置为最大值;否则将其设置为 0
- cv2.THRESH_BINARY_INV:反二进制阈值处理。如果像素值大于阈值,则将其设置为 0;否则将其设置为最大值
- cv2.THRESH_TRUNC: 截断阈值处理。如果像素值大于阈值,则将其设置为阈值;否则保持不变
- cv2.THRESH_TOZERO:零阈值处理。如果像素值大于阈值,则保持不变;否则将其设置为 0
- cv2.THRESH_TOZERO_INV:反零阈值处理。如果像素值大于阈值,则将其设置为 0;否则保持不变
#超过阈值的部分取maxval,否则取0
ret,binary = cv2.threshold(starSky_Gary,127,255,cv2.THRESH_BINARY)
#前者的反转
ret,binary_inv = cv2.threshold(starSky_Gary,127,255,cv2.THRESH_BINARY_INV)
#大于阈值部分设为阈值,否则不变
ret,trunc = cv2.threshold(starSky_Gary,127,255,cv2.THRESH_TRUNC)
#大于阈值部分不变,否则为0
ret,toZero = cv2.threshold(starSky_Gary,127,255,cv2.THRESH_TOZERO)
#Thresh_Tozero的反转
ret,toZero_inv = cv2.threshold(starSky_Gary,127,255,cv2.THRESH_TOZERO_INV)
titles = ['Origin','Binary','Binary_Inv','Trunc','ToZero','ToZero_Inv']
images = [starSky_Gary,binary,binary_inv,trunc,toZero,toZero_inv]
for i in range(6):
plt.subplot(2,3,i+1)
plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
效果
OTSU算法
OTSU算法 即大津算法 又叫类间方差阈值分割法 只要找到类间方差最大的阈值 就是最大阈值 可以使得前景色和后景色分割更加明显
类间方差就是两个类别之间的差异
原理
在大津法中,它是通过计算前景色(A部分)与背景色(B部分)的加权平均值来计算的。具体来说,设阈值为T,图像中灰度值小于等于T的像素点为类别A,灰度值大于T的像素点为类别B。设ωA和ωB分别为类别A和类别B中像素点的数量占总像素点数量的比例,μA和μB分别为类别A和类别B中像素点的灰度值平均值,则类间方差σ²(T)可以表示为:
σ²(T) = ωA(T)(μA(T) - μ(T))² + ωB(T)(μB(T) - μ(T))²
其中μ(T)为整幅图像的灰度值平均值。
大津法通过枚举所有可能的阈值T,计算每个阈值下的类间方差,并选择使类间方差最大的阈值作为最佳阈值。
优点
- 自动计算最佳阈值
- 算法简单 不受图像亮度和对比度的影响
案例
#自适应阈值分割 otsu 大律法 它将与其他二值化方法一起使用 当阈值为0 最大值为255的时候 otsu将自动计算最佳阈值(即类间方差最大)
ret,ostu_binary = cv2.threshold(starSky_Gary,0,255,cv2.THRESH_OTSU+cv2.THRESH_BINARY)
Images.ImageShow('OSTU',ostu_binary)
效果
TRANGLE算法
OpenCV 中cv2.threshold()函数中使用的一个标志。它用于使用三角算法确定图像二值化的阈值,适用于单峰直方图
原理
一种自适应阈值分割方法,它使用三角算法来处理像素点,适用于单峰图。它的原理是通过计算图像的灰度直方图,寻找直方图中两侧边界和最大值,然后检测最大波峰是否在亮的一侧,如果不是则翻转直方图。最后,计算阈值得到阈值 T,如果前面已经翻转了,则阈值要用 255
OTSU的区别
OTSU适用于双峰图 而TRANGLE适用于单峰图
案例
#TRIANGLE用于使用三角算法确定图像二值化的阈值
ret,triangle_bianry = cv2.threshold(starSky_Gary,0,255,cv2.THRESH_TRIANGLE+cv2.THRESH_BINARY)
Images.ImageShow('TRANGLE',triangle_bianry)