訂閱
糾錯(cuò)
加入自媒體

使用Python+OpenCV進(jìn)行圖像處理(三)

檢測(cè)是計(jì)算機(jī)視覺(jué)任務(wù)中的主要任務(wù)之一,而且應(yīng)用很廣泛。檢測(cè)技術(shù)可以幫助人類檢測(cè)那些容易被肉眼忽略的錯(cuò)誤;也可以”幫助“自動(dòng)駕駛汽車感知空間信息。無(wú)疑自動(dòng)化的檢測(cè)技術(shù)的廣泛應(yīng)用將為我們帶來(lái)效率與安全。

本篇是這個(gè)系列的第三篇。整個(gè)系列目錄如下:

理解顏色模型與在圖像上繪制圖形(圖像處理基本操作)。

基本的圖像處理與濾波技術(shù)。

從特征檢測(cè)到人臉檢測(cè)。

輪廓檢測(cè)

之前已經(jīng)介紹了幾種顏色模型以及如何在圖像上繪制圖形。還介紹了常用的圖像處理技術(shù),如:模糊、梯度、腐蝕、擴(kuò)張等。本篇將把這些技術(shù)應(yīng)用到圖像特征檢測(cè)和人臉檢測(cè)中。

本篇會(huì)用到本系列前兩篇中介紹的圖像處理技術(shù)。

邊緣檢測(cè) (Edge Detection)

邊緣檢測(cè)本質(zhì)上是檢測(cè)圖像中變化劇烈或者不連續(xù)的像素點(diǎn)。將這些像素點(diǎn)連接線段即為邊。實(shí)際上,在上一篇文章中我們已經(jīng)介紹了一種基礎(chǔ)的邊緣檢測(cè)技術(shù):使用Sobel算子和拉普拉斯算子進(jìn)行梯度濾波。通過(guò)計(jì)算圖像像素值在給定方向上的導(dǎo)數(shù),梯度濾波器即可以描繪出圖像的邊緣從而實(shí)現(xiàn)邊緣檢測(cè)。

Canny檢測(cè)算法是另外一種圖像邊緣檢測(cè)技術(shù)。而且是目前最流行的邊緣檢測(cè)技術(shù)之一,分為以下四個(gè)步驟實(shí)現(xiàn):降噪、判斷梯度及梯度方向、非最大值抑制和滯后閾值化處理。

首先通過(guò)高斯模糊技術(shù)實(shí)現(xiàn)降噪。然后,使用sobel算子得到圖像梯度。接著使用得到的梯度,檢測(cè)每一個(gè)像素點(diǎn)與其中周圍的像素點(diǎn),確認(rèn)這個(gè)像素點(diǎn)是不是這些局部像素點(diǎn)中的局部最大值。如果不是局部最大值,則將這個(gè)點(diǎn)的像素值置為零(完全缺失,黑色)。這個(gè)過(guò)程即為非極大值抑制。

如果這個(gè)點(diǎn)被確認(rèn)為局部最大值,則進(jìn)行下一步即第四個(gè)步驟。第四步是決定之前檢測(cè)出的邊是否為真正邊緣的最后一個(gè)決策階段。這一決策階段被稱為滯后閾值化,它需要兩個(gè)閾值(“較小閾值”、“較大閾值”)來(lái)進(jìn)行決策。

給定兩個(gè)不同的閾值,我們可以得到三個(gè)閾值化區(qū)間。因此,如果這個(gè)點(diǎn)的像素值大于兩個(gè)閾值中的“較大閾值”則被判定為邊緣點(diǎn)。相對(duì)地,如果其小于所設(shè)定的兩個(gè)閾值參數(shù)中的“較小閾值”則被認(rèn)定為非邊緣點(diǎn),即會(huì)被丟棄。另外,如果這個(gè)點(diǎn)的像素值位于兩個(gè)參數(shù)閾值之間則是跟據(jù)其是否與”確認(rèn)邊緣點(diǎn)“之間有連接來(lái)決定是否丟棄,遵循有連接則不丟棄的原則。

img = cv2.imread('images/giraffe.jpg')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Canny detection without blurring

edges = cv2.Canny(image=img, threshold1=127, threshold2=127)

plt.figure(figsize = (20, 20))

plt.subplot(1, 2, 1); plt.imshow(img)

plt.a(chǎn)xis('off')

plt.subplot(1, 2, 2); plt.imshow(edges)

plt.a(chǎn)xis('off')

上方僅使用了一個(gè)閾值中值作判斷,也沒(méi)有進(jìn)行圖像模糊處理,邊緣檢測(cè)結(jié)果不是很理想。接下來(lái)讓我們嘗試不同的參數(shù)閾值設(shè)定:

# Set the lower and upper threshold

med_val = np.median(img)

lower = int(max(0, .7*med_val))

upper = int(min(255, 1.3*med_val))

為了更直觀的比較模糊化對(duì)圖像邊緣檢測(cè)的影響,將使用兩種不同尺寸的卷積核(5x5)與(9x9)。設(shè)定兩種閾值參數(shù),一種在上述閾值設(shè)定的基礎(chǔ)上將“較大閾值”增加100。也就意味著我們會(huì)得到四種不同的組合結(jié)果圖。如下:

# Blurring with ksize = 5 

img_k5 = cv2.blur(img, ksize = (5, 5))

# Canny detection with different thresholds

edges_k5 = cv2.Canny(img_k5, threshold1 = lower, threshold2 = upper)

edges_k5_2 = cv2.Canny(img_k5, lower, upper+100)

# Blurring with ksize = 9 

img_k9 = cv2.blur(img, ksize = (9, 9))

# Canny detection with different thresholds

edges_k9 = cv2.Canny(img_k9, lower, upper)

edges_k9_2 = cv2.Canny(img_k9, lower, upper+100)

# Plot the images

images = [edges_k5, edges_k5_2, edges_k9, edges_k9_2]

plt.figure(figsize = (20, 15))

for i in range(4):

plt.subplot(2, 2, i+1)

plt.imshow(images[i])

plt.a(chǎn)xis('off')

plt.show()

正如上圖所示,模糊化可以幫助減少噪聲。我們?cè)谑褂镁矸e核尺寸為(9x9)時(shí)得到了更好的結(jié)果。而且,在使用更大的“較大閾值”時(shí)得到了更好的邊緣檢測(cè)結(jié)果。

1  2  3  下一頁(yè)>  
聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)