目标:
1. 明白阈值处理的作用及应用场景
2. 这段内容比较简单
说明:阈值函数是指剔除图像内像素值高于一定值或者低于一定值的像素点
1. cv2.threshold()函数
函数:ret, dst = cv2.threshold(src, thresh, maxval, type)
参数说明:
src
:输入图像(必须是单通道灰度图)。thresh
:设定的阈值。maxval
:当像素值超过阈值(或满足特定条件)时,赋予的最大值(通常为 255,即白色)。type
:阈值处理的类型(核心参数,决定比较规则)。
返回值:
ret
:实际使用的阈值(通常与输入的thresh
相同)。dst
:处理后的输出图像。
(1)二值化阈值处理(cv2.THRESH_BINARY)
说明:二值阈值话将原始图像处理仅为两个值得二值图像
- 对于灰度值大于阈值thresh的像素点,将其灰度值设定为最大值
- 对于灰度值小于或等于阈值thresh的像素点,将其灰度值设定为0
例如:在8位图像中,最大值为255,。我们的设定阈值为127
- 所有大于127的像素点都会处理为255
- 其他值会被处理为0
实例:
import cv2
img1 = cv2.imread("1.JPG",flags=cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,127,255,cv2.THRESH_BINARY)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
若图像不是单通道,则结果如下图:
(2)反二值化阈值处理(cv2.THRESH_BINARY_INV)
说明:跟上述反过来
- 对于灰度值大于阈值的像素点,将其值设定为0
- 对于灰度值小于或等于阈值的像素点,将其值设定为255
(3)截断阈值化处理(cv2.THRESH_TRUNC
)
说明:该方法会将大于阈值的像素点的值设定为阈值,小于或者等于该阈值的像素点保持不变
例如:阈值选取127
- 对于像素值大于127的像素点,其像素值被设定为127
- 对于像素值小于或者等于127的像素点,其像素值保持不变
实例:
import cv2
img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,127,255,cv2.THRESH_TRUNC)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
(4)超阈值领处理(cv2.THRESH_TOZERO
)
说明:超阈值领处理会将大于阈值的像素点处理为0,小于或者等于该阈值的像素点保持不变。
例如:阈值选取127
- 对于像素值大于阈值的像素点其阈值会被处理0
- 对于像素值小于或者等于阈值的像素点,其像素值保持不变
实例:
import cv2
img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,127,255,cv2.THRESH_TOZERO_INV)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
(5)低阈值零处理
说明:低阈值零处理会将图像中小于或者等于阈值的像素点的值处理为0,大于阈值的像素点的值保持不变。
- 对于像素值大于阈值的像素点,其值保持不变
- 对于像素值小于或者等于阈值的像素点,其值将被处理为0
实例:
import cv2
img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,127,255,cv2.THRESH_TOZERO)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
(6)Otsu处理
说明:直接设定个阈值对像素很不友好,例如:你的最大像素为125,而自己设定的阈值为127,。
Otsu会遍历所有可能阈值,从而找到最佳阈值。
ret, th = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
与普通阈值分割区别:
- 参数type增加了一个参数值“cv2.THRESH_OTSU”
- 设定的阈值为0
- 返回值ret是Otsu方法计算得到并使用最优阈值
实例:
import cv2
img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,0,255,cv2.THRESH_TOZERO+cv2.THRESH_OTSU)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
print(dst)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()
结果:之前设定的阈值为127,目前自动设定为129
(7)自适应阈值处理
说明:使用变化的阈值完成图像的阈值处理,主要方式为计算每个像素点周围临近区域的加权平均值获得阈值,并用该阈值对像素点进行处理。
函数:dst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)
参数说明:
src
:输入图像(必须是单通道灰度图)。maxval
:满足阈值条件时赋予的最大值(通常为 255)。adaptiveMethod
:计算局部阈值的方法(2 种):cv2.ADAPTIVE_THRESH_MEAN_C
:局部阈值 = 局部区域的平均值 - Ccv2.ADAPTIVE_THRESH_GAUSSIAN_C
:局部阈值 = 局部区域的高斯加权平均值 - C
thresholdType
:阈值处理类型(只能是二进制阈值或反二进制阈值):cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
blockSize
:局部区域的大小(必须是奇数,如 3、5、7...,表示以当前像素为中心的blockSize×blockSize
窗口)。C
:常数(从局部平均值或加权平均值中减去的数值,用于调整阈值的偏移量,可正可负)。
import cv2
img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
# dst,img2 = cv2.threshold(img1,0,255,cv2.THRESH_TOZERO+cv2.THRESH_OTSU)
img2=cv2.adaptiveThreshold(img1,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,3)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
注意事项:输入必须是单通道灰度图,彩色图需先转换(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))。blockSize必须是奇数(确保窗口有中心像素)。