OpenCV-Python教程(6)(7)(8): Sobel算子 Laplacian算子 Canny边缘检测
OpenCV-Python教程(6、Sobel算子)
本篇文章介紹如何用OpenCV-Python來使用Sobel算子。
提示:
- 轉載請詳細注明原作者及出處,謝謝!
- 本文介紹使用OpenCV-Python實現基本的濾波處理
- 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版) 》。
Sobel算子
原型
Sobel算子依然是一種過濾器,只是其是帶有方向的。在OpenCV-Python中,使用Sobel的算子的函數原型如下:
[python]?view plaincopy
前四個是必須的參數:
- 第一個參數是需要處理的圖像;
- 第二個參數是圖像的深度,-1表示采用的是與原圖像相同的深度。目標圖像的深度必須大于等于原圖像的深度;
- dx和dy表示的是求導的階數,0表示這個方向上沒有求導,一般為0、1、2。
其后是可選的參數:
- dst不用解釋了;
- ksize是Sobel算子的大小,必須為1、3、5、7。
- scale是縮放導數的比例常數,默認情況下沒有伸縮系數;
- delta是一個可選的增量,將會加到最終的dst中,同樣,默認情況下沒有額外的值加到dst中;
- borderType是判斷圖像邊界的模式。這個參數默認值為cv2.BORDER_DEFAULT。
使用
在OpenCV-Python中,Sobel函數的使用如下:
[python]?view plaincopy
解釋
在Sobel函數的第二個參數這里使用了cv2.CV_16S。因為OpenCV文檔中對Sobel算子的介紹中有這么一句:“in the case of 8-bit input images it will result in truncated derivatives”。即Sobel函數求完導數后會有負值,還有會大于255的值。而原圖像是uint8,即8位無符號數,所以Sobel建立的圖像位數不夠,會有截斷。因此要使用16位有符號的數據類型,即cv2.CV_16S。
在經過處理后,別忘了用convertScaleAbs()函數將其轉回原來的uint8形式。否則將無法顯示圖像,而只是一副灰色的窗口。convertScaleAbs()的原型為:
[python]?view plaincopy
由于Sobel算子是在兩個方向計算的,最后還需要用cv2.addWeighted(...)函數將其組合起來。其函數原型為:
[python]?view plaincopy
結果
原圖像為:
結果為:
參考資料:
1、《Opencv2 Computer Vision Application Programming Cookbook》
2、《OpenCV References Manule》
OpenCV-Python教程(7、Laplacian算子)
本篇文章介紹如何用OpenCV-Python來使用Laplacian算子。
提示:
- 轉載請詳細注明原作者及出處,謝謝!
- 本文介紹使用在OpenCV-Python中使用Laplacian函數
- 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版) 》。
Laplacian算子
圖像中的邊緣區域,像素值會發生“跳躍”,對這些像素求導,在其一階導數在邊緣位置為極值,這就是Sobel算子使用的原理——極值處就是邊緣。如下圖(下圖來自OpenCV官方文檔):
如果對像素值求二階導數,會發現邊緣處的導數值為0。如下(下圖來自OpenCV官方文檔):
Laplace函數實現的方法是先用Sobel 算子計算二階x和y導數,再求和:(CSDN,你打水印,讓我的公式怎么辦?)
函數原型
在OpenCV-Python中,Laplace算子的函數原型如下:
[python]?view plaincopy
前兩個是必須的參數:
- 第一個參數是需要處理的圖像;
- 第二個參數是圖像的深度,-1表示采用的是與原圖像相同的深度。目標圖像的深度必須大于等于原圖像的深度;
其后是可選的參數:
- dst不用解釋了;
- ksize是算子的大小,必須為1、3、5、7。默認為1。
- scale是縮放導數的比例常數,默認情況下沒有伸縮系數;
- delta是一個可選的增量,將會加到最終的dst中,同樣,默認情況下沒有額外的值加到dst中;
- borderType是判斷圖像邊界的模式。這個參數默認值為cv2.BORDER_DEFAULT。
使用
這里還是以Sobel一文中的石獅作為測試圖像,下面是測試代碼:
[python]?view plaincopy
有點像粉筆畫,是吧。這是因為原圖像未經過去噪就直接處理了。可以通過濾波一文中,使用低通濾波一節中高斯模糊來先處理一下再用拉普拉斯函數。
參考資料:
1、《Opencv2 Computer Vision Application Programming Cookbook》
2、《OpenCV References Manule》
OpenCV-Python教程(8、Canny邊緣檢測Sobel算子)
本篇文章介紹如何用OpenCV-Python來使用Canny算子。
提示:
- 轉載請詳細注明原作者及出處,謝謝!
- 本文介紹使用OpenCV-Python實現基本的濾波處理
- 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版) 》。
原型
OpenCV-Python中Canny函數的原型為:
[python]?view plaincopy
- 第一個參數是需要處理的原圖像,該圖像必須為單通道的灰度圖;
- 第二個參數是閾值1;
- 第三個參數是閾值2。
其中較大的閾值2用于檢測圖像中明顯的邊緣,但一般情況下檢測的效果不會那么完美,邊緣檢測出來是斷斷續續的。所以這時候用較小的第一個閾值用于將這些間斷的邊緣連接起來。
可選參數中apertureSize就是Sobel算子的大小。而L2gradient參數是一個布爾值,如果為真,則使用更精確的L2范數進行計算(即兩個方向的倒數的平方和再開放),否則使用L1范數(直接將兩個方向導數的絕對值相加)。
具體的算法可參見清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版) 》第二章,其中有Canny算法的詳細描述及實現。
函數返回一副二值圖,其中包含檢測出的邊緣。
使用
Canny函數的使用很簡單,只需指定最大和最小閾值即可。如下:
[python]?view plaincopy
用高斯平滑處理原圖像降噪。
調用Canny函數,指定最大和最小閾值,其中apertureSize默認為3。
處理結果如下:
更多
這個程序只是靜態的,在github上有一個可以在運行時調整閾值大小的程序。其代碼如下:
[python]?view plaincopy
參考資料:
1、《Opencv2 Computer Vision Application Programming Cookbook》
2、《OpenCV References Manule》
from: http://blog.csdn.net/sunny2038/article/category/904451
總結
以上是生活随笔為你收集整理的OpenCV-Python教程(6)(7)(8): Sobel算子 Laplacian算子 Canny边缘检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV Python教程(3)(4
- 下一篇: OpenCV-Python教程(9)(1