深圳網(wǎng)站建設(shè)哪家公司好我贏網(wǎng)客服系統(tǒng)
1 基本概念
CV2中使用閾值的作用是將灰度圖像二值化,即將灰度圖像的像素值根據(jù)一個(gè)設(shè)定的閾值分成黑白兩部分。閾值處理可以用于圖像分割、去除噪聲、增強(qiáng)圖像對(duì)比度等多個(gè)領(lǐng)域。例如,在物體檢測(cè)和跟蹤中,可以通過(guò)對(duì)圖像進(jìn)行閾值處理來(lái)提取目標(biāo)區(qū)域;在圖像增強(qiáng)中,可以使用閾值處理來(lái)增強(qiáng)圖像的輪廓和細(xì)節(jié)等。
閾值處理可以使用cv2.threshold()
函數(shù)來(lái)完成。
retval, dst = cv2.threshold(src, thresh, maxval, type)
其中,參數(shù)解釋如下:
src
:輸入圖像,可以是灰度圖像或彩色圖像。thresh
:設(shè)定的閾值。maxval
:二值化后的最大值。當(dāng)type
為cv2.THRESH_BINARY
或cv2.THRESH_BINARY_INV
時(shí),像素值大于閾值的部分會(huì)設(shè)置為maxval
,否則會(huì)設(shè)置為0。type
:二值化操作的類型,包括:cv2.THRESH_BINARY
:二值化操作,大于閾值的像素值設(shè)置為maxval
,小于等于閾值的像素值設(shè)置為0。cv2.THRESH_BINARY_INV
:反向二值化操作,大于閾值的像素值設(shè)置為0,小于等于閾值的像素值設(shè)置為maxval
。cv2.THRESH_TRUNC
:截?cái)嗖僮?#xff0c;大于閾值的像素值設(shè)置為閾值,小于等于閾值的像素值保持不變。cv2.THRESH_TOZERO
:像素值小于等于閾值的設(shè)置為0,大于閾值的保持不變。cv2.THRESH_TOZERO_INV
:像素值大于等于閾值的設(shè)置為0,小于閾值的保持不變。
cv2.threshold()
函數(shù)的返回值為一個(gè)元組,包括:
retval
:實(shí)際使用的閾值。dst
:二值化后的輸出圖像。
2 二值化處理
灰度圖像
通過(guò)對(duì)灰度圖像進(jìn)行二值處理,可以在圖形中只保留兩種顏色,通常我們?cè)O(shè)定為255(白色)和0(黑色),但也可根據(jù)需求設(shè)置為黑色和灰色的二值圖像,如:
import cv2
img = cv2.imread("lenacolor.png", 0) # 將圖像讀成灰度圖像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 二值化閾值處理
t2, dst2 = cv2.threshold(img, 127, 200, cv2.THRESH_BINARY)
cv2.imshow('img', img)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()
彩色圖像
同樣這一方法可用于彩色圖像,通過(guò)對(duì)某一通道進(jìn)行二值化,使圖像的顏色變得更加夸張,如:
import cv2 img = cv2.imread('lenacolor.png')
b, g, r = cv2.split(img) # 將BGR通道分離 # 對(duì)紅色通道進(jìn)行閾值處理
t1, r = cv2.threshold(r, 127, 255, cv2.THRESH_BINARY) img_after = cv2.merge([b, g, r]) cv2.imshow('original', img)
cv2.imshow('threshold', img_after)
cv2.waitKey(0)
cv2.destroyAllWindows()
反二值化處理
反二值化處理(Inverse Thresholding)是二值化處理的一種變體,其作用是將灰度圖像的像素值根據(jù)一個(gè)設(shè)定的閾值分成兩部分,但是與普通二值化處理不同的是,反二值化處理將像素值大于閾值的部分設(shè)置為0,小于等于閾值的部分設(shè)置為最大像素值,即產(chǎn)生一個(gè)反色的二值化圖像。代碼中type需要設(shè)置為cv2.THRESH_BINARY_INV
。
防止視覺(jué)疲勞,后面的圖換了一下示例圖像
3 零處理
低于閾值零處理
低于閾值的部分會(huì)被處理為0,此時(shí)填入的maxval
無(wú)效
對(duì)灰度圖來(lái)說(shuō),低于閾值的部分將會(huì)被處理為黑色;對(duì)于RGB彩圖來(lái)說(shuō),低于閾值的部分圖像會(huì)變暗。
import cv2
img1 = cv2.imread("test.png", 0) # 將圖像讀成灰度圖像
img2 = cv2.imread("test.png") b, g, r = cv2.split(img2) # 將BGR通道分離 t1, dst1 = cv2.threshold(img1, 127, 255, cv2.THRESH_TOZERO) # 低于閾值零處理
cv2.imshow('img1', img1)
cv2.imshow('dst1', dst1) t2, b = cv2.threshold(b, 127, 255, cv2.THRESH_TOZERO) # 低于閾值零處理
img_after = cv2.merge([b, g, r])
cv2.imshow('img2', img2)
cv2.imshow('img_after', img_after) cv2.waitKey()
cv2.destroyAllWindows()
超出閾值零處理
類似反二值化處理。將超出某一閾值的部分進(jìn)行歸零處理。超出閾值零處理可以在一些特定的場(chǎng)合下使用,例如在一些需要保留一定程度的圖像細(xì)節(jié)的場(chǎng)合,超出閾值零處理可以避免將過(guò)多的像素值直接設(shè)置為0或最大像素值,從而使圖像保留更多的細(xì)節(jié)信息。
4 截?cái)嗵幚?/h1>
該方法傳入的type是cv2.THRESH_TRUNC
,代碼結(jié)構(gòu)與前面高度重合,此處不再貼代碼。
截?cái)嗵幚硎嵌祷幚淼囊环N變體,其作用是將灰度圖像的像素值根據(jù)一個(gè)設(shè)定的閾值分成兩部分,但是與普通的二值化處理不同的是,超出閾值的部分不會(huì)被設(shè)置為0或最大像素值,而是被截?cái)酁殚撝当旧怼?br /> 圖像截?cái)嗵幚硗ǔ_m合用于需要保留圖像主要信息的場(chǎng)合,而又不需要進(jìn)行明顯的二值化操作的場(chǎng)合。在這種情況下,截?cái)嗵幚砜梢允沟脠D像保留更多的灰度級(jí),從而能夠更好地保留圖像中的細(xì)節(jié)和信息,同時(shí)又能夠去除一些噪聲或者不需要的部分。
5 自適應(yīng)處理
自適應(yīng)閾值處理是圖像處理中的一種常見(jiàn)操作,可以根據(jù)圖像局部的灰度特征來(lái)自適應(yīng)地確定閾值,以達(dá)到更好的二值化效果。在OpenCV中,可以使用cv2.adaptiveThreshold()
函數(shù)進(jìn)行自適應(yīng)閾值處理。
相比于閾值處理,自適應(yīng)處理具有以下優(yōu)點(diǎn):
- 自適應(yīng)處理可以根據(jù)局部像素的灰度值特征來(lái)確定二值化閾值,從而適應(yīng)圖像的不同區(qū)域和不同光照條件,能夠更好地突出圖像中的目標(biāo)物體。
- 自適應(yīng)處理可以在處理過(guò)程中保留更多的細(xì)節(jié)信息,減少因閾值過(guò)大或過(guò)小而造成的信息丟失,提高圖像處理的準(zhǔn)確性。
- 自適應(yīng)處理適用于復(fù)雜背景下的目標(biāo)物體分割,特別是在背景區(qū)域灰度分布不均的情況下,能夠更好地處理背景區(qū)域和目標(biāo)區(qū)域的差異。
自適應(yīng)處理相比于閾值處理具有更好的適應(yīng)性和靈活性,可以在不同的圖像處理場(chǎng)景中應(yīng)用。當(dāng)圖像的灰度分布不均、光照條件不同或需要保留更多的細(xì)節(jié)信息時(shí),自適應(yīng)處理通常是更好的選擇。
cv2.adaptiveThreshold()
函數(shù)的基本語(yǔ)法如下:
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
其中:
src
:輸入圖像,必須為灰度圖像。maxValue
:二值化后的最大值。adaptiveMethod
:自適應(yīng)閾值處理的方法,包括:cv2.ADAPTIVE_THRESH_MEAN_C
:基于均值的自適應(yīng)閾值處理。cv2.ADAPTIVE_THRESH_GAUSSIAN_C
:基于高斯加權(quán)平均值的自適應(yīng)閾值處理。
thresholdType
:閾值類型,與普通二值化處理相同,包括:cv2.THRESH_BINARY
:二值化操作,大于閾值的像素值設(shè)置為maxValue
,小于等于閾值的像素值設(shè)置為0。cv2.THRESH_BINARY_INV
:反向二值化操作,大于閾值的像素值設(shè)置為0,小于等于閾值的像素值設(shè)置為maxValue
。
blockSize
:每個(gè)像素點(diǎn)周圍用來(lái)計(jì)算閾值的像素?cái)?shù)。必須是奇數(shù)。C
:閾值校正值。該值會(huì)被加到均值或加權(quán)平均值上,用于調(diào)整閾值。
cv2.adaptiveThreshold()
函數(shù)的返回值為二值化后的輸出圖像。
仍以上一張圖像為例:
import cv2 image_Gray = cv2.imread("test.png", 0) # 自適應(yīng)閾值的計(jì)算方法為cv2.ADAPTIVE_THRESH_MEAN_C
athdMEAM = cv2.adaptiveThreshold\ (image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 0)
# 自適應(yīng)閾值的計(jì)算方法為cv2.ADAPTIVE_THRESH_GAUSSIAN_C
athdGAUS = cv2.adaptiveThreshold\ (image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 5, 0)
# 顯示自適應(yīng)閾值處理的結(jié)果
cv2.imshow("MEAN_C", athdMEAM)
cv2.imshow("GAUSSIAN_C", athdGAUS)
cv2.waitKey()
cv2.destroyAllWindows()
可以看出自適應(yīng)閾值似乎保留了更多細(xì)節(jié),但此處效果并不好,也就說(shuō)明自適應(yīng)并不能完全代替人工選擇。(對(duì)于人臉圖像,該方法的效果會(huì)比上圖更好一些)
6 Ostu方法
Otsu’s method 是一種經(jīng)典的自適應(yīng)閾值處理算法,可以自動(dòng)確定圖像的二值化閾值。該算法可以將圖像中的像素值分為兩部分,從而將圖像轉(zhuǎn)換為二值圖像。在 OpenCV 中,可以使用cv2.threshold()
函數(shù)進(jìn)行 Otsu’s method 處理。在type中,輸入對(duì)應(yīng)的方法名+cv2.THRESH_OTSU
即可調(diào)用該方法。該方法的存在也是threshold將閾值作為返回值的意義所在。
在 Otsu’s method 中,不需要預(yù)先指定閾值,而是通過(guò)計(jì)算圖像灰度直方圖和類間方差來(lái)確定閾值。具體來(lái)說(shuō),該方法會(huì)計(jì)算每一個(gè)像素灰度值作為閾值時(shí),將圖像分為前景和背景兩部分的類間方差,然后選取類間方差最大的像素灰度值作為二值化閾值。
import cv2img = cv2.imread('test.png', 0)
ret, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imshow('original', img)
cv2.imshow('Otsu threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()