影像的邊緣檢測
最近整理一些學習筆記,因為覺得自己基礎不紮實,很多演算法能用卻不知其根源,因此需要不斷去回顧和歸納。這篇先寫寫影像的邊緣檢測。
邊緣檢測就是一個尋找邊緣畫素的過程,這些邊緣一般就是區域性畫素變化比較顯著的一些點,主要存在於目標和目標以及前景背景之間。找到這些邊緣,對於影像分割與目標識別是很有幫助的。
常用的邊緣檢測運算元有很多,這裡以sobel、拉普拉斯運算元和canny運算元為例,做一些比較。
Sobel運算元
Sobel 運算元結合了高斯平滑和微分求導。它是一階導數的邊緣檢測運算元,使用卷積核與影像中的每個畫素點做卷積和運算,然後採用合適的閾值提取邊緣。Soble運算元有兩個卷積核,分別對應的是x與y兩個方向。
計算過程
1.分別在x和y兩個方向求導。
2.在影像的每一點,結合以上兩個結果求出近似梯度:
cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
src是需要處理的影像;
ddepth是影像的深度,-1表示採用的是與原影像相同的深度。目標影像的深度必須大於等於原影像的深度;這裡使用了cv2.CV_16S 即16位有符號的資料型別,以防止截斷。 - dx和dy表示的是求導的階數,0表示這個方向上沒有求導,一般為0、1、2。
ksize是Sobel運算元的大小,必須為1、3、5、7。
Laplace運算元
拉普拉斯運算元是一種二階導數運算元。在影像中的邊緣區域,畫素值會發生比較大的變化,對這些畫素求導,會看到極值出現,在這些極值位置,其二階導數為0,所以也可以用二階導數來檢測影像邊緣。
Laplacian運算元的定義:
laplace.gif
cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
src是需要處理的影像;
ddepth是影像的深度,解釋同上文sobel。
ksize是運算元的大小,必須為1、3、5、7。預設為1。
Canny
Canny運算元的基本思想是尋找梯度的區域性最大值。運算元是比較簡單的,也很容易實現。
一般步驟:
1. 高斯濾波影像去噪。一般情況下,使用高斯平滑濾波器卷積降噪。
2.計算梯度幅值和方向。運用一對卷積陣列(分別作用於x和y方向)
3.非極大值抑制。這一步排除非邊緣畫素, 僅僅保留了一些細線條(候選邊緣)。
4.需要兩個閾值(高閾值和低閾值)檢測和連線邊緣:
如果某一畫素位置的幅值超過高閾值, 這個畫素被保留為邊緣畫素。如果小於低閾值, 該畫素被排除。如果在兩個閾值之間,要看這個畫素的鄰接畫素中有沒有超過高閾值的邊緣畫素。如果有,這畫素就是邊緣,否則就不是。
cv2.Canny(scr, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
這裡scr是需要處理的原影像,該影像必須為單通道的灰度圖; threshold1是閾值1; threshold2是閾值2。
例項程式碼
下面用Python-OpenCV程式碼比較下上面幾種運算元的效果。
""" Created on Thu Oct 25 11:25:15 2018 @author: 晚晴風 """import cv2 img = cv2.imread("pascal_19.jpg")#cannygray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray,(3,3),0)#高斯濾波器對影像降噪canny = cv2.Canny(blur,50,150) cv2.imshow('canny',canny)#sobelgrad_x = cv2.Sobel(img,cv2.CV_16S,1,0,ksize = 3) grad_y = cv2.Sobel(img,cv2.CV_16S,0,1,ksize = 3)#第二個引數為影像的深度u_x = cv2.convertScaleAbs(grad_x) #轉化成為8點陣圖形CV_8U進行顯示u_y = cv2.convertScaleAbs(grad_y) sobel_xy = cv2.addWeighted(u_x,0.5,u_y,0.5,0)#兩方向加權求近似梯度cv2.imshow('sobelX',u_x) cv2.imshow('sobelY',u_y) cv2.imshow('sobelXY',sobel_xy)#Laplacelap = cv2.Laplacian(img,cv2.CV_16S,ksize = 3) laplacian = cv2.convertScaleAbs(lap) cv2.imshow('laplacian',laplacian) cv2.waitKey(0) cv2.destroyAllWindows()#釋放視窗
執行之後就可以看到三種運算元的邊緣檢測結果:
原圖:
pascal_19.jpg
Canny運算元:
canny.jpg
Sobel運算元:
sobelXY.jpg
Laplace運算元:
laplacian.jpg
總結:
Sobel運算元在邊緣檢測的同時儘量的削弱了噪聲。比較容易實現,受噪聲的影響力比較小。它對於畫素位置的影響作了加權,因此效果更好、應用廣泛。
Laplace運算元是一種各向同性運算元,在只關心邊緣的位置而不考慮其周圍的象素灰度差值時比較合適。Laplace運算元對孤立象素的響應要比對邊緣或線的響應要更強烈,因此只適用於無噪聲圖象。存在噪聲情況下,使用Laplacian運算元檢測邊緣之前需要先進行低通濾波。
Canny運算元是目前理論上相對最完善的一種邊緣檢測演算法。也存在不足之處: 為了得到較好的邊緣檢測結果,它通常需要使用較大的濾波尺度,這樣容易丟失一些細節。運算元的雙閾值要人為的選取,這需要經驗:)
作者:晚晴風_
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4798/viewspace-2819331/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 影像邊緣檢測
- 使用 Vyper 實現影像邊緣檢測
- 使用 Vala 實現影像邊緣檢測
- 使用 Fantom 實現影像邊緣檢測
- 詳解數字影像的濾波和邊緣檢測
- 3.Canny邊緣檢測
- CV總結之邊緣檢測
- opencv學習之邊緣檢測OpenCV
- Opencv-Python學習筆記十——影像梯度、邊緣檢測 Gradient, Edge DetectionOpenCVPython筆記梯度
- python+opencv邊緣檢測方法整理PythonOpenCV
- opencv——自適應閾值Canny邊緣檢測OpenCV
- 3. OpenCV-Python——影像梯度演算法、邊緣檢測、影像金字塔與輪廓檢測、直方圖與傅立葉變換OpenCVPython梯度演算法直方圖
- 卷積神經網路1-邊緣檢測卷積神經網路
- Python 影像處理 OpenCV (13): Scharr 運算元和 LOG 運算元邊緣檢測技術PythonOpenCV
- php 實現一個簡單的圖片邊緣檢測PHP
- [機器視覺]halcon應用例項 邊緣檢測視覺
- Qt5&OpenCV3.2 Canny邊緣檢測+Hough變換QTOpenCV
- 輪廓檢測論文解讀 | 整體巢狀邊緣檢測HED | CVPR | 2015巢狀
- 產品更新 | 阿里雲CDN邊緣影像處理功能開放內測阿里
- 【從0到1學習邊緣容器系列1】之 邊緣計算與邊緣容器的起源
- 邊緣計算2.0時代,“雲邊緣”與“邊緣雲”你分清了嗎?
- 【OpenCV3經典程式設計100例】(10)邊緣檢測:用Sobel()函OpenCV程式設計
- Python 影像處理 OpenCV (12): Roberts 運算元、 Prewitt 運算元、 Sobel 運算元和 Laplacian 運算元邊緣檢測技術PythonOpenCV
- 秒懂邊緣雲 | 邊緣雲技術進階
- 雲原生與邊緣計算的碰撞——邊緣原生應用實踐
- 神經網路之卷積篇:詳解更多邊緣檢測內容(More edge detection)神經網路卷積
- 影像相似度比較和檢測影像中的特定物
- 邊緣計算系列科普(五)邊緣計算中的關鍵技術
- Aruba的智慧邊緣時代
- 邊框檢測在 Python 中的應用Python
- 天翼雲邊緣函式、邊緣安全專案入選“可信邊緣計算推進計劃”函式
- 高通濾波法、微分運算元法、神經網路方法實現邊緣檢測神經網路
- 邊緣應用場景需求興起,FusionCube解碼智慧邊緣!
- 《公理邊緣 2》Polygon 評測:「銀河戰士」的忠實信徒Go
- 使用Dice loss實現清晰的邊界檢測
- 邊緣計算的最佳實踐
- 邊緣計算|Hadoop——邊緣計算和Hadoop是什麼關係?Hadoop
- 從中心走向邊緣——深度解析雲原生邊緣計算落地痛點