Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm

(六)阈值处理

阈值处理是指剔除图像内像素值高于一定值或者低于一定值的像素点。例如,设定阈值为127,然后:
● 将图像内所有像素值大于127的像素点的值设为255。
● 将图像内所有像素值小于或等于127的像素点的值设为0。
按照上述阈值处理方式将一幅灰度图像处理为一幅二值图像,有效地实现了前景和背景的分离。
OpenCV提供了函数cv2.threshold()和函数cv2.adaptiveThreshold(),用于实现阈值处理。

6.1 threshold函数
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代表阈值分割的类型,具体类型值如下表所示。

python 可以使用hold on吗 threshold python_python 可以使用hold on吗


上述公式相对抽象,可以将其可视化,具体如下图所示。

python 可以使用hold on吗 threshold python_python 可以使用hold on吗_02

6.1.1 二值化阈值处理(cv2.THRESH_BINARY)
二值化阈值处理会将原始图像处理为仅有两个值的二值图像,其示意图如图6-3所示。其针对像素点的处理方式为:
● 对于灰度值大于阈值thresh的像素点,将其灰度值设定为最大值。
● 对于灰度值小于或等于阈值thresh的像素点,将其灰度值设定为0。

python 可以使用hold on吗 threshold python_python 可以使用hold on吗_03


如果使用表达式表示,其目标值的产生规则为:

python 可以使用hold on吗 threshold python_图像处理_04

式中,thresh是选定的特定阈值。
在8位图像中,最大值是255。因此,在对8位灰度图像进行二值化时,如果将阈值设定为127,那么:
● 所有大于127的像素点会被处理为255。
● 其余值会被处理为0。
为了方便,在后续说明中,我们都以8位图像为例,即像素值最大值为255。

eg1:使用函数cv2.threshold()对图像进行二值化阈值处理。
代码如下:

import cv2
img=cv2.imread("lena.bmp")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示,左图是原始图像,右图是二值化阈值处理结果。

python 可以使用hold on吗 threshold python_python 可以使用hold on吗_05

python 可以使用hold on吗 threshold python_阈值_06

6.1.2 反二值化阈值处理(cv2.THRESH_BINARY_INV)
反二值化阈值处理的结果也是仅有两个值的二值图像,与二值化阈值处理的区别在于,二者对像素值的处理方式不同。反二值化阈值处理针对像素点的处理方式为:
● 对于灰度值大于阈值的像素点,将其值设定为0。
● 对于灰度值小于或等于阈值的像素点,将其值设定为255。
反二值化阈值处理方式的示意图如下图所示。

python 可以使用hold on吗 threshold python_图像处理_07


如果使用表达式来表示,其目标值的产生规则为:

python 可以使用hold on吗 threshold python_阈值_08


式中,thresh是选定的阈值。

eg2:使用函数cv2.threshold()对图像进行反二值化阈值处理。
代码如下:

import cv2
img=cv2.imread("lena.bmp")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示,其中左图是原始图像,右图是反二值化阈值处理结果。

python 可以使用hold on吗 threshold python_像素点_09

python 可以使用hold on吗 threshold python_python 可以使用hold on吗_10

6.1.3 截断阈值化处理(cv2.THRESH_TRUNC)

截断阈值化处理会将图像中大于阈值的像素点的值设定为阈值,小于或等于该阈值的像素点的值保持不变。这种处理方式的示意图如下图所示。

python 可以使用hold on吗 threshold python_Python-OpenCV_11

例如,阈值选取为127,则截断阈值化处理时:
● 对于像素值大于127的像素点,其像素值将被设定为127。
● 对于像素值小于或等于127的像素点,其像素值将保持改变。
如果使用表达式表示,那么其目标值的产生规则为:

python 可以使用hold on吗 threshold python_图像处理_12

eg3:使用函数cv2.threshold()对图像进行截断阈值化处理。
代码如下:

import cv2
img=cv2.imread("lena.bmp")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示,其中左图是原始图像,右图是截断阈值化处理结果。

python 可以使用hold on吗 threshold python_Python-OpenCV_13

python 可以使用hold on吗 threshold python_Python-OpenCV_14

6.1.4 超阈值零处理(cv2.THRESH_TOZERO_INV)

超阈值零处理会将图像中大于阈值的像素点的值处理为0,小于或等于该阈值的像素点的值保持不变。即先选定一个阈值,然后对图像做如下处理:

● 对于像素值大于阈值的像素点,其像素值将被处理为0。

● 对于像素值小于或等于阈值的像素点,其像素值将保持不变。

超阈值零处理的工作原理如下图所示。

python 可以使用hold on吗 threshold python_Python-OpenCV_15

例如,阈值选取为127,则:
● 对于像素值大于127的像素点,其值将被设定为0。
● 对于像素值小于或等于127的像素点,其值将保持改变。
如果使用表达式表示,其目标值的产生规则为:

python 可以使用hold on吗 threshold python_python 可以使用hold on吗_16


eg4:使用函数cv2.threshold()对图像进行超阈值零处理。

代码如下:

import cv2
img=cv2.imread("lena.bmp")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示,其中左图是原始图像,右图是超阈值零处理结果。

python 可以使用hold on吗 threshold python_像素点_17

python 可以使用hold on吗 threshold python_Python-OpenCV_18

6.1.5 低阈值零处理(cv2.THRESH_TOZERO)
低阈值零处理会将图像中小于或等于阈值的像素点的值处理为0,大于阈值的像素点的值保持不变。即先选定一个阈值,然后对图像做如下处理:
● 对于像素值大于阈值的像素点,其值将保持不变。
● 对于像素值小于或等于阈值的像素点,其值将被处理为0。
其示意图如下图所示。

python 可以使用hold on吗 threshold python_图像处理_19


例如,阈值选取为127,则:

● 对于像素值大于127的像素点,其像素值将保持改变。

● 对于像素值小于或等于127的像素点,其像素值将被设定为0。

如果使用表达式表示,其目标值的产生规则为:

python 可以使用hold on吗 threshold python_python 可以使用hold on吗_20


eg5:使用函数cv2.threshold()对图像进行低阈值零处理。

根据题目要求,编写代码如下:

import cv2
img=cv2.imread("lena.bmp")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示,其中左图是原始图像,右图是低阈值零处理结果。

python 可以使用hold on吗 threshold python_阈值_21

python 可以使用hold on吗 threshold python_阈值_22