阈值处理(Thresholding)是一种常用的图像处理技术,在机器学习和计算机视觉中经常被用于二值化图像或二分类任务。它基于设定一个阈值来将像素值进行分类,将像素值大于或小于阈值的部分分为两个不同的类别,从而得到二值化的图像或进行二分类预测。
在图像处理中的阈值处理:
图像二值化:将灰度图像转换为二值图像,其中像素值大于或等于阈值的部分设为一个值(通常为255),而小于阈值的部分设为另一个值(通常为0)。
自适应阈值处理:根据图像局部的灰度特点来自动调整不同区域的阈值,适应图像的不同部分。
在二分类任务中的阈值处理:
对于分类模型的输出概率:将模型输出的概率值与阈值进行比较,大于阈值的样本被划分为一个类别,小于阈值的样本被划分为另一个类别。
对于回归模型的输出:将模型输出的连续值与阈值进行比较,大于阈值的样本被划分为一个类别,小于阈值的样本被划分为另一个类别。
OpenCV 提供了函数 cv2.threshold()和函数 cv2.adaptiveThreshold(),用于实现阈值处理
OpenCV 3.0 使用 cv2.threshold()函数进行阈值化处理,该函数的语法格式为:
retval, dst = cv2.threshold( src, thresh, maxval, type )
式中:
retval 代表返回的阈值。
dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型。
src 代表要进行阈值分割的图像,可以是多通道的,8 位或 32 位浮点型数值。
thresh 代表要设定的阈值。
maxval 代表当 type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 类型时,需要设定的最大值。
type 代表阈值分割的类型,具体类型值如表 6-1 所示。
二值化阈值处理会将原始图像处理为仅有两个值的二值图像,其示意图如图 6-3 所示。其
针对像素点的处理方式为:
在 8 位图像中,最大值是 255。因此,在对 8 位灰度图像进行二值化时,如果将阈值设定
为 127,那么:
为了方便,在后续说明中,我们都以 8 位图像为例,即像素值最大值为 255。
import cv2
import numpy as np
img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print("img=\n",img)
print("t=",t)
print("rst=\n",rst)
运行结果:
img=
[[235 26 81 7 121]
[ 81 82 15 64 40]
[156 250 246 30 226]
[136 202 129 243 65]]
t= 127.0
rst=
[[255 0 0 0 0]
[ 0 0 0 0 0]
[255 255 255 0 255]
[255 255 255 255 0]]
import cv2
img=cv2.imread("lena.png")
#将图像转换为灰度图像
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
左图是原始图像,右图是二值化阈值处理结果。
反二值化阈值处理的结果也是仅有两个值的二值图像,与二值化阈值处理的区别在于,二
者对像素值的处理方式不同。反二值化阈值处理针对像素点的处理方式为:
对于灰度值大于阈值的像素点,将其值设定为 0。
对于灰度值小于或等于阈值的像素点,将其值设定为 255。
反二值化阈值处理方式的示意图如图 6-5 所示。
import cv2
import numpy as np
img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
print("img=\n",img)
print("t=",t)
print("rst=\n",rst)
运行程序,结果如下所示:
img=
[[ 56 64 150 48 41]
[108 165 112 213 110]
[122 244 10 213 46]
[247 30 90 0 26]]
t= 127.0
rst=
[[255 255 0 255 255]
[255 0 255 0 255]
[255 0 255 0 255]
[ 0 255 255 255 255]]
大于127的置为0,小于127的置为255
后面还有
截断阈值化处理(cv2.THRESH_TRUNC)
超阈值零处理(cv2.THRESH_TOZERO_INV)
低阈值零处理(cv2.THRESH_TOZERO)
感兴趣的同学自己去多实操几遍