天天看點

OpenCV-Python 筆記(四)Canny邊緣檢測、圖像金字塔

Canny邊緣檢測

因為邊緣檢測,容易受到噪聲的幹擾,是以第一步就是降噪。使用 5 X 5 的高斯濾波器進行過濾。

非極大值抑制:使用Sobel濾波器,隻有在檢測到邊緣的時候,才會保留邊緣像素,否則,就全部置零。(深度學習CNN基礎部分有關内容)

磁滞門檻值:該階段确定哪些邊緣全部是真正的邊緣,哪些不是。為此,我們需要兩個門檻值minVal 和maxVal。強度梯度大于maxVal 的任何邊緣必定是邊緣,而小于minVal 的那些邊緣必定是非邊緣,是以将其丢棄。介于這兩個門檻值之間的對象根據其連通性被分類為邊緣或非邊緣。如果将它們連接配接到“邊緣”像素,則将它們視為邊緣的一部分。否則,它們也将被丢棄。

OpenCV-Python 筆記(四)Canny邊緣檢測、圖像金字塔

當我們設定為邊緣是長像素特征邊緣時,小像素邊緣就會被丢棄。

img=cv.imread("text.jpg")
#Canny邊緣檢測(輸入圖檔,minval,maxval)
edges=cv.Canny(img,100,200)

plt.subplot(121),plt.imshow(img,cmap="gray"),plt.title("Original")
plt.subplot(122),plt.imshow(edges,cmap="gray"),plt.title("Edges")
plt.show()
           

注意觀察,不連續的小像素邊緣,被去掉。

OpenCV-Python 筆記(四)Canny邊緣檢測、圖像金字塔

圖像金字塔

不同分辨率組成的序列,精度從高到低,從上到下,像金字塔。

高斯金字塔

高斯金字塔中的較進階别(低分辨率)是通過删除較低級别(較高分辨率)圖像中的連續行和列而形成的。然後,較進階别的每個像素由基礎級别的5個像素的貢獻與高斯權重形成。通過這樣做,M×N圖像變成M/2 × N/2圖像。是以面積減少到原始面積的四分之一。它稱為Octave。當我們在金字塔中越靠上時(即分辨率下降),這種模式就會繼續。同樣,在擴充時,每個級别的面積變為4倍。

img=cv.imread("gh.jpg")
#相對于原圖低一級
lower_reso=cv.pyrDown(img)
#相對于原圖高一級
higher_reso=cv.pyrUp(img)
#從低一級的圖檔,通過添加像素形成
higher_reso2=cv.pyrUp(higher_reso)

plt.subplot(221),plt.imshow(img),plt.title("Original")
plt.subplot(222),plt.imshow(lower_reso),plt.title("lower_reso")
plt.subplot(223),plt.imshow(higher_reso),plt.title("higher_reso")
plt.subplot(224),plt.imshow(higher_reso2),plt.title("higher_reso2")
plt.show()
           
OpenCV-Python 筆記(四)Canny邊緣檢測、圖像金字塔

從細節可以看出,由原始圖檔縮小以後,再進行拓展,結果與原圖檔相差非常大。因為在縮小圖檔時,有資訊丢失,資訊一旦丢失,就無法找回,隻能通過高斯機率分布進行插值,插入缺失的像素。是以圖檔的畫面看起來,就沒有那麼銳利,比較柔和。

OpenCV-Python 筆記(四)Canny邊緣檢測、圖像金字塔

拉普拉斯金字塔

拉普拉斯金字塔由高斯金字塔形成。沒有專用功能。拉普拉斯金字塔圖像僅像邊緣圖像。它的大多數元素為零。它們用于圖像壓縮。拉普拉斯金字塔的層由高斯金字塔的層與高斯金字塔的高層的擴充版本之間的差形成。

繼續閱讀