6.1 阙值处理 threshold函数

阙值处理是指剔除图像内像素值高于一定值或低于一定值的像素点,例如,设定阙值为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 所示

47f412c30d413135d275945c1c069a5.jpg

6.1.1 二值化阈值处理 (cv2.THRESH_BINARY)

二值化阈值处理会将原始图像处理为仅有两个值的二值图像,其示意图如图,其针对像素点的处理方式:

1.对于灰度值大于阔值 thresh 的像素点,将其灰度值设定为最大值。
2.对于灰度值小于或等于阙值 thresh 的像素点,将其灰度值设定为0

059e912beea9587fdd0d10d3df0bec4.jpg

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

式中, 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()

1562250464(1).png

6.1.2 反二值化阈值处理 cv2.THRESH_BINARY_INV

反二值化阈值处理的结果也是仅有两个值的二值图像,与二值化阈值处理的区别在于,二者对像素值的处理方式不同,反二值化阅值处理针对像素点的处理方式为

1.对于灰度值大于阈值的像素点,将其值设定为0
2.对于灰度值小于或等于阈值的像素点,将其值设定为 255

反二值化阈值处理方式的示意图如图 6-5 所示

d0d9d6b8758057c99b9981e496bf886.jpg

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

式中, 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()
1562250900(1).png

6.1.3 反二值化阈值处理 cv2.THRESH_BINARY_INV

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

ae021f03715f7fc9fd1a5fe0a66302e.jpg

例如,阈值选取为 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()


1562251306(1).png

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

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

1.对于像素值大于阈值的像素点,其像素值将被处理为0
2.对于像素值小于或等于阈值的像素点,其像素值将保持不变。

超阅值零处理的工作原理如图 6-9 所示

d5f5482679552742a66fbda7b6c680b.jpg

例如,阙值选取为 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()

1562252569(1).png

6.1.5 低阈值零处理(cv2.THRESH_TOZERO)

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

1.对于像素值大于像素点的值的像素点,其值将保持不变
2.对于像素值小于或等于值的像素点,其值将被处理为0

其示意图如图 6-11 所示

98a84c5c354b36642c526f760b01969.jpg

例如,阅值选取为 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()
1562253052(1).png

你可能感兴趣的:(6.1 阙值处理 threshold函数)