闕值處理是指剔除圖像內(nèi)像素值高于一定值或低于一定值的像素點(diǎn)驹针,例如,設(shè)定闕值為127,然后
1.將圖像內(nèi)所有像素值大于 127 的像素點(diǎn)的值設(shè)為 255
2.將圖像內(nèi)所有像素值小于或等于 127 的像素點(diǎn)的值設(shè)為0
OpenCV3.0 使用 cv2.threshold() 函數(shù)進(jìn)行閾值化處理,該函數(shù)的語(yǔ)法格式為:
retval恳邀,dst = cv2.threshold(src,thresh,maxval,type)
式中:
retval 代表返回的閾值
dst 代表值分割結(jié)果圖像,與原始圖像具有相同的大小和類型
src 代表要進(jìn)行閾值分割的圖像,可以是多通道的,8 位或 32 使浮點(diǎn)型數(shù)值
thresh 代表要設(shè)定的闕值
maxval 代表當(dāng) type 參數(shù)為 THRESH_BINARY 或者 THRESH_BINARY_INV類型,需要設(shè)定的最大值
type 代表值分割的類型,具體類型值如表 6-1 所示
6.1.1 二值化閾值處理 (cv2.THRESH_BINARY)
二值化閾值處理會(huì)將原始圖像處理為僅有兩個(gè)值的二值圖像灶轰,其示意圖如圖谣沸,其針對(duì)像素點(diǎn)的處理方式:
1.對(duì)于灰度值大于闊值 thresh 的像素點(diǎn),將其灰度值設(shè)定為最大值。
2.對(duì)于灰度值小于或等于闕值 thresh 的像素點(diǎn),將其灰度值設(shè)定為0
如果使用表達(dá)式表示,其目標(biāo)值的產(chǎn)生規(guī)則為:
式中, thresh 是選定的特定閾值
在8 位圖像中,最大值是 255.因此,在對(duì)8 位灰度圖像進(jìn)行二值化時(shí),如果將閾值設(shè)定為 127,那么
1.所有大于 127 的像素點(diǎn)會(huì)被處理為 255
2.其余值會(huì)被處理為0
為了方便,在后續(xù)說(shuō)明中,我們都以8 位圖像為例,即像素值最大值為 255
【例 6.1】使用函數(shù) cv2.threshold() 對(duì)數(shù)組進(jìn)行二值化閱值處理,觀察處理結(jié)果
根據(jù)題目要求,編寫代碼如下:
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】使用函數(shù) cv2.threshold() 對(duì)圖像進(jìn)行二值化闊值處理
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
反二值化閾值處理的結(jié)果也是僅有兩個(gè)值的二值圖像,與二值化閾值處理的區(qū)別在于,二者對(duì)像素值的處理方式不同,反二值化閱值處理針對(duì)像素點(diǎn)的處理方式為
1.對(duì)于灰度值大于閾值的像素點(diǎn),將其值設(shè)定為0
2.對(duì)于灰度值小于或等于閾值的像素點(diǎn),將其值設(shè)定為 255
反二值化閾值處理方式的示意圖如圖 6-5 所示
如果使用表達(dá)式來(lái)表示,其目標(biāo)值的產(chǎn)生規(guī)則為
式中, thresh 是選定的閾值
【例 6.3】使用函數(shù) cv2.threshold() 對(duì)數(shù)組進(jìn)行反二值化閾值處理,觀察處理結(jié)果
根據(jù)題目要求,編寫代碼如下:
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】使用函數(shù)cv2.threshold() 對(duì)圖像進(jìn)行反二值化閱值處理
根據(jù)題目要求,編寫代碼如下
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
截?cái)嚅撝祷幚頃?huì)將圖像中大于閾值的像素點(diǎn)的值設(shè)定為閾值,小于或等于該闊值的像素點(diǎn)的值保持不變笋颤。這種處理方式的示意圖如圖 6-7 所示
例如,閾值選取為 127,則截?cái)嚅撝祷幚頃r(shí)
1.對(duì)于像素值大于 127 的像素點(diǎn),其像素值將被設(shè)定為 127
2.對(duì)于像素值小于或等于 127 的像素點(diǎn),其像素值將保持不變
如果使用表達(dá)式表示,那么其目標(biāo)值的產(chǎn)生規(guī)則為
【例 6.5】使用函數(shù) cv2.threshold() 對(duì)數(shù)組進(jìn)行截?cái)嚅y值化處理,觀察處理結(jié)果
根據(jù)題目要求,編寫代碼如下:
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 】使用函數(shù) cv2.threshold() 對(duì)圖像進(jìn)行截?cái)嚅y值化處理,觀察處理結(jié)果
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)
超閾值零處理會(huì)將圖像中大于閾值的像素點(diǎn)的值處理為 0,小于或等于該閾值的像素值保持不變乳附。即先選定一個(gè)閾值,然后對(duì)圖像做如下處理:
1.對(duì)于像素值大于閾值的像素點(diǎn),其像素值將被處理為0
2.對(duì)于像素值小于或等于閾值的像素點(diǎn),其像素值將保持不變。
超閱值零處理的工作原理如圖 6-9 所示
例如,闕值選取為 127,則
1.對(duì)于像素值大于 127 的像素點(diǎn),其值將被設(shè)定為0
2.對(duì)于像素值小于或等于 127 的像素點(diǎn),其值將保持不變
如果使用表達(dá)式表示,其目標(biāo)值的產(chǎn)生規(guī)則為
【例 6.7】使用函數(shù) cv2.threshold() 對(duì)數(shù)組進(jìn)行超閾值零處理,觀察處理結(jié)果
根據(jù)題目要求,編寫代碼如下
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】使用函數(shù) cv2.threshold() 對(duì)圖像進(jìn)行超值零處理
根據(jù)題目要求,編寫代碼如下:
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)
低閾值零處理會(huì)將圖像中小于或等于閱值的像素點(diǎn)的值處理為 0,大于閾值的像素點(diǎn)的值保持不變,即先選定一個(gè)閱值,然后對(duì)圖像做如下處理
1.對(duì)于像素值大于像素點(diǎn)的值的像素點(diǎn),其值將保持不變
2.對(duì)于像素值小于或等于值的像素點(diǎn),其值將被處理為0
其示意圖如圖 6-11 所示
例如,閱值選取為 127,則:
1.對(duì)于像素值大于 127 的像素點(diǎn),其像素值將保持不變
2.對(duì)于像素值小于或等于 127 的像素點(diǎn),其像素值將被設(shè)定為0
如果使用表達(dá)式表示,其目標(biāo)值的產(chǎn)生規(guī)則為
【例 6.9】使用函數(shù) cv2.threshold() 對(duì)數(shù)組進(jìn)行低闕值零處理,觀察處理結(jié)果
根據(jù)題目要求,編寫代碼如下:
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】使用函數(shù) cv2.threshold() 對(duì)圖像進(jìn)行低閾值零處理
根據(jù)題目要求,編寫代碼如下:
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()