基本的阈值分割有下面这几种:
按图中由上到下的顺序是:
1.二进制阈值化(准确说是二值阈值化,因为这种情况下像素灰度取值只有两种,但并不是只能为0和1,实际上最大值是调用函数时自行规定的)。这种情况下如果两个取值是0和255那么就是当像素灰度大于阈值时变为255(白色),小于等于阈值都会变成0(黑色),对应的正是二值图像。
2.反二进制阈值化(是上面那种情况的反例)
3.截断阈值化
当大于阈值时灰度级就固定为阈值,灰度小于等于阈值的像素则保持不变,给图像带来的整体效果是看起来变得暗了一些。
4.反阈值化为0
这种情况是当灰度值大于阈值时就变为0,其余不变。会使原本明亮的像素变暗。
5.阈值化为0
当灰度值小于等于阈值就变为0,大于阈值时不变。
代码(这里我是用的不是灰度图像,而是使用了RGB图像):
#图像阈值化处理
import cv2 as cv
img = cv.imread("D:\\OpenCV\\testimg\\lena.png",cv.IMREAD_UNCHANGED)
#1.二进制阈值化,超过阈值化为255,小于等于则化为0
thre2,img2 = cv.threshold(img,128,255,cv.THRESH_BINARY)
cv.imshow("origin",img)
cv.imshow("threshold binary",img2)
#2.反二进制阈值化,规则跟二进制阈值化相反
thre3,img3 = cv.threshold(img,128,255,cv.THRESH_BINARY_INV)
cv.imshow("INVERSE threshold binary",img3)
#3.截断阈值化,大于阈值化为阈值,其余不变
thre4,img4 = cv.threshold(img,128,255,cv.THRESH_TRUNC)
cv.imshow("THRESH_TRUNC",img4)
#4.反阈值化为0,大于阈值化为0,其余不变
thre5,img5 = cv.threshold(img,128,255,cv.THRESH_TOZERO_INV)
cv.imshow("THRESH_TOZERO_INV",img5)
#5.阈值化为0,小于等于阈值变为0,大于阈值不变
thre6,img6 = cv.threshold(img,128,255,cv.THRESH_TOZERO)
cv.imshow("THRESH_TOZERO",img6)
cv.waitKey()
cv.destroyAllWindows()
运行结果: