阈值处理是指剔除图像内像素值高于或者低于一定值的像素点
函数cv2,threshold()和cv2.adaptiveThreshold()用于实现阈值处理
retval,dst=cv2.threshold (src,thresh,maxval,type)
retval:返回的阈值
dst: 阈值分割结果图像,与原图像大小类型相同
src: 要进行阈值分割的图像
thresh: 要设定的阈值
maxval:当type参数为THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设定的最大值
type: 代表阈值分割的类型
二值化阈值处理是指将原始图像处理为仅有两个值的二值图像
对于灰度值大于阈值thresh的像素点,将其灰度值设定为最大值。
对于灰度值小于或等于阈值thresh的像素点,将其灰度值设定为0。
示例:
import cv2
img=cv2.imread ("lena.png")
t,rst=cv2.threshold ( img,127,255,cv2.THRESH_BINARY)
cv2.imshow ("img",img)
cv2.imshow ( "rst",rst)
cv2.waitKey ()
cv2.destroyAllWindows ()
对于灰度值大于阈值的像素点,将其值设定为0。
对于灰度值小于或等于阈值的像素点,将其值设定为255。
示例:
import cv2
img=cv2.imread ( "lena.png")
t,rst=cv2.threshold (img,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow ("img",img)
cv2.imshow ("rst",rst)
cv2.waitKey ()
cv2.destroyAllWindows ()
将图像中大于阈值的像素点的值设定为阈值,小于或等于该阈值的像素点保持不变
示例:
import cv2
img=cv2.imread ( "lena.png")
t,rst=cv2.threshold (img,127,255,cv2.THRESH_TRUNC)
cv2.imshow ("img",img)
cv2.imshow ("rst",rst)
cv2.waitKey ()
cv2.destroyAllWindows ()
结果:
将图像大于阈值的像素点设置为0,小于或等于该阈值的像素点的值保持不变。
示例:
import cv2
img=cv2.imread ( "lena.png")
t,rst=cv2.threshold (img,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow ("img",img)
cv2.imshow ("rst",rst)
cv2.waitKey ()
cv2.destroyAllWindows ()
结果:
将小于或等于阈值的像素点的值处理为0,大于阈值的像素点的值保持不变。
import cv2
img=cv2.imread ( "lena.png")
t,rst=cv2.threshold (img,127,255,cv2.THRESH_TOZERO)
cv2.imshow ("img",img)
cv2.imshow ("rst",rst)
cv2.waitKey ()
cv2.destroyAllWindows ()
结果:
使用变换的阈值完成对图像的阈值处理,称作自适应阈值处理。
通过计算每个像素点周围临近区域的加权平均值获得阈值,使用该阈值对当前的像素点进行处理。适用于处理明暗差异大的图像。
dst=cv.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
dst: 自适应阈值处理结果。
src:原始图像。该图像必须是8位单通道的图像。
maxValue: 最大值。
adaptiveMethod: 自适应方法。
thresholdType: 阈值处理方式,该值必须是cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。
blockSize: 块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为3。
C是常量
cv.ADAPTIVE_THRESH_MEAN_C: 邻域所有像素点的权重值是一致的
cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 与邻域各个像素点到中心点的距离有关,高斯方程得到各个点的权重值。
示例:
import cv2
img=cv2.imread ( "computer.png",0) #将图像调整为单通道的灰度图像
t1,thd=cv2.threshold (img,127,255,cv2.THRESH_BINARY)
athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3) #采用方法ADAPTIVE_THRESH_MEAN_C
athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
cv2.imshow ("img",img)
cv2.imshow ("thd",thd)
cv2.imshow ("athdMEAN",athdMEAN)
cv2.imshow ("athdGAUS",athdGAUS)
cv2.waitKey ()
cv2.destroyAllWindows ()
使用函数cv2.threshold()函数进行阈值处理,需要自定义一个阈值,以此作为图像阈值处理的依据。用于处理色彩均匀的图像,阈值通常为127。
otsu方法会历遍所有可能阈值,找到最佳值。
t,otsu=cv2.threshold (img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
对参数type增加参数cv2.THRESH_OTSU,要把阈值设为0,返回值是阈值的最优值。
示例:对一幅图像tiffany进行127的阈值处理和otsu方法的阈值处理,对比
import cv2
img=cv2.imread ("tiffany.png",0)
t1,thd=cv2.threshold ( img,127,255,cv2.THRESH_BINARY)
t2,otsu=cv2.threshold ( img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow ("img", img)
cv2.imshow ("thd",thd )
cv2.imshow ( "otus",otsu)
cv2.waitKey ()
cv2.destroyAllWindows ()