阙值处理是指剔除图像内像素值高于一定值或低于一定值的像素点,例如,设定阙值为127,然后
1.将图像内所有像素值大于 127 的像素点的值设为 255
2.将图像内所有像素值小于或等于 127 的像素点的值设为0
OpenCV3.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.1.1 二值化阈值处理 (cv2.THRESH_BINARY)
二值化阈值处理会将原始图像处理为仅有两个值的二值图像,其示意图如图,其针对像素点的处理方式:
1.对于灰度值大于阔值 thresh 的像素点,将其灰度值设定为最大值。
2.对于灰度值小于或等于阙值 thresh 的像素点,将其灰度值设定为0
如果使用表达式表示,其目标值的产生规则为:
式中, thresh 是选定的特定阈值
在8 位图像中,最大值是 255.因此,在对8 位灰度图像进行二值化时,如果将阈值设定为 127,那么
1.所有大于 127 的像素点会被处理为 255
2.其余值会被处理为0
为了方便,在后续说明中,我们都以8 位图像为例,即像素值最大值为 255
【例 6.1】使用函数 cv2.threshold() 对数组进行二值化阅值处理,观察处理结果
根据题目要求,编写代码如下:
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=
[[123 138 81 99 19]
[146 154 36 16 251]
[166 206 237 59 26]
[117 74 53 16 188]]
t= 127.0
rst=
[[ 0 255 0 0 0]
[255 255 0 0 255]
[255 255 255 0 0]
[ 0 0 0 0 255]]
【例 6.2】使用函数 cv2.threshold() 对图像进行二值化阔值处理
import cv2
img=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lena.bmp")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()
6.1.2 反二值化阈值处理 cv2.THRESH_BINARY_INV
反二值化阈值处理的结果也是仅有两个值的二值图像,与二值化阈值处理的区别在于,二者对像素值的处理方式不同,反二值化阅值处理针对像素点的处理方式为
1.对于灰度值大于阈值的像素点,将其值设定为0
2.对于灰度值小于或等于阈值的像素点,将其值设定为 255
反二值化阈值处理方式的示意图如图 6-5 所示
如果使用表达式来表示,其目标值的产生规则为
式中, thresh 是选定的阈值
【例 6.3】使用函数 cv2.threshold() 对数组进行反二值化阈值处理,观察处理结果
根据题目要求,编写代码如下:
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=
[[ 43 19 1 184 114]
[199 195 246 22 148]
[157 162 26 213 104]
[232 172 47 72 123]]
t= 127.0
rst=
[[255 255 255 0 255]
[ 0 0 0 255 0]
[ 0 0 255 0 255]
[ 0 0 255 255 255]]
【例 6.4】使用函数cv2.threshold() 对图像进行反二值化阅值处理
根据题目要求,编写代码如下
import cv2
img=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\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()
6.1.3 反二值化阈值处理 cv2.THRESH_BINARY_INV
截断阈值化处理会将图像中大于阈值的像素点的值设定为阈值,小于或等于该阔值的像素点的值保持不变。这种处理方式的示意图如图 6-7 所示
例如,阈值选取为 127,则截断阈值化处理时
1.对于像素值大于 127 的像素点,其像素值将被设定为 127
2.对于像素值小于或等于 127 的像素点,其像素值将保持不变
如果使用表达式表示,那么其目标值的产生规则为
【例 6.5】使用函数 cv2.threshold() 对数组进行截断阀值化处理,观察处理结果
根据题目要求,编写代码如下:
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_TRUNC)
print("img=\n",img)
print("t=",t)
print("rst=\n",rst)
img=
[[ 68 136 250 6 91]
[141 6 41 199 45]
[244 56 19 80 163]
[155 32 147 231 35]]
t= 127.0
rst=
[[ 68 127 127 6 91]
[127 6 41 127 45]
[127 56 19 80 127]
[127 32 127 127 35]]
【例 6.6 】使用函数 cv2.threshold() 对图像进行截断阀值化处理,观察处理结果
import cv2
img=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lena.bmp")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()
6.1.4 超阈值零处理(cV2. THRESH_TOZERO_INV)
超阈值零处理会将图像中大于阈值的像素点的值处理为 0,小于或等于该阈值的像素值保持不变。即先选定一个阈值,然后对图像做如下处理:
1.对于像素值大于阈值的像素点,其像素值将被处理为0
2.对于像素值小于或等于阈值的像素点,其像素值将保持不变。
超阅值零处理的工作原理如图 6-9 所示
例如,阙值选取为 127,则
1.对于像素值大于 127 的像素点,其值将被设定为0
2.对于像素值小于或等于 127 的像素点,其值将保持不变
如果使用表达式表示,其目标值的产生规则为
【例 6.7】使用函数 cv2.threshold() 对数组进行超阈值零处理,观察处理结果
根据题目要求,编写代码如下
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_TOZERO_INV)
print("img=\n",img)
print("t=",t)
print("rst=\n",rst)
img=
[[ 77 176 66 171 223]
[218 158 82 117 74]
[175 146 110 155 82]
[ 84 58 79 2 52]]
t= 127.0
rst=
[[ 77 0 66 0 0]
[ 0 0 82 117 74]
[ 0 0 110 0 82]
[ 84 58 79 2 52]]
【例 6.8】使用函数 cv2.threshold() 对图像进行超值零处理
根据题目要求,编写代码如下:
import cv2
img=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\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()
6.1.5 低阈值零处理(cv2.THRESH_TOZERO)
低阈值零处理会将图像中小于或等于阅值的像素点的值处理为 0,大于阈值的像素点的值保持不变,即先选定一个阅值,然后对图像做如下处理
1.对于像素值大于像素点的值的像素点,其值将保持不变
2.对于像素值小于或等于值的像素点,其值将被处理为0
其示意图如图 6-11 所示
例如,阅值选取为 127,则:
1.对于像素值大于 127 的像素点,其像素值将保持不变
2.对于像素值小于或等于 127 的像素点,其像素值将被设定为0
如果使用表达式表示,其目标值的产生规则为
【例 6.9】使用函数 cv2.threshold() 对数组进行低阙值零处理,观察处理结果
根据题目要求,编写代码如下:
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_TOZERO)
print("img=\n",img)
print("t=",t)
print("rst=\n",rst)
img=
[[211 103 158 2 20]
[183 62 158 139 145]
[ 3 154 130 10 103]
[145 82 194 200 122]]
t= 127.0
rst=
[[211 0 158 0 0]
[183 0 158 139 145]
[ 0 154 130 0 0]
[145 0 194 200 0]]
【例 6.10】使用函数 cv2.threshold() 对图像进行低阈值零处理
根据题目要求,编写代码如下:
import cv2
img=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lena.bmp")
t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()