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