canny運算元是john canny在2023年發表的**中首次提出的邊緣檢測運算元,該運算元檢測效能比較好,應用廣泛。
最優邊緣檢測的三個主要評價標準是:
坎尼運算元進行邊緣檢測的原理和步驟如下:⑴消除雜訊
。邊緣檢測的演算法主要是基於影象強度的一階和二階微分操作
,但導數通常對雜訊很敏感,邊緣檢測演算法常常需要根據影象源的資料進行預處理操作
,因此採用濾波器來改善與雜訊有關的邊緣檢測效能,比如在進行邊緣檢測前,可以對原始資料先作高斯濾波處理
。其實不僅對雜訊,如果不做濾波平滑處理,原中不是邊緣但是灰度變化頻率較高
的部分也容易被認為是邊緣,這樣導致了邊緣檢測效能的下降。
⑵計算梯度的幅度與方向
.opencv中的坎尼函式是使用索貝爾卷積核來計算梯度的幅度與方向的
。計算出的幅度與方向作為後面提取影象邊緣的原始資料
。⑶非極大值抑制
。非極大值抑制的目的是剔除第⑵部中計算出來的結果中的大部分非邊緣點
。其原理是通過畫素的八鄰域來判斷要不要將這個畫素置為
邊緣點,如果不置為邊緣點,那麼就置為背景色判斷的方法如下
:①判斷範圍是畫素的八鄰域,所以是區域性最優判斷法;
②判斷的標準是如果某個畫素在其八鄰域內,既是最大值,梯度值也最大,那麼可判斷該點為畫素邊緣點,否則就不是。如何判斷呢?
首先,梯度值的判斷是很好判斷的,用邊緣檢測微分運算元得到的結果直接比較就可以了,但是最大值的判斷可不是只比較其旁邊的八個點哦,還要比較另外兩個點,詳情如下:
如果已經判斷出上圖中的ç點比其旁邊的8個點的畫素值都大,那麼接下來判斷上圖中dtmp1和dtmp2的值是否也小於ç點的值,那麼dtmp1和dtmp2的值怎麼求呢?上圖中藍色的線條方向為ç點的梯度方向,這樣就可以確定其區域性的最大值肯定分布在這條線上,也即除了ç點外,梯度方向的交點dtmp1和dtmp2這兩個點的值也可能會是區域性最大值。因此,判斷ç點灰度與這兩個點灰度大小即可判斷ç點是否為其鄰域內的區域性最大灰度點。如果經過判斷,c點灰度值小於這兩個點中的任乙個,那就說明ç點不是區域性極大值,那麼則可以排除ç點為邊緣。
⑷用滯後閾值演算法求解影象
邊緣。上一步對邊緣檢測運算元的結果進行了非極大值抑制
,接下來我們用二值化的方法來求解影象邊緣
。單閾值處理邊緣效果不好,所以cannny 。演算法中採用滯後閾值法求解滯後閾值法需要設定乙個高閾值和乙個低閾值
,解後按如下法則進行:
如果某一畫素位置的梯度幅值超過高閾值,則畫素被保留為邊緣畫素;
如果某一畫素位置的梯度幅值小於低閾值,則畫素被排除;
如果某一畫素位置的幅值在兩個閾值之間,該畫素僅僅在連線到乙個高於高閾值的畫素時被保留。
在以上的法則中,推薦的高閾值與低閾值比在2:1到3:1之間!
通過消除雜訊,計算梯度幅度與方向,非極大值抑制及用滯後閾值演算法求解影象邊緣四個步驟就可實現的canny邊緣檢測。
精明的函式原型如下:
void canny( inputarray image, outputarray edges, double threshold1, double threshold2, int aperturesize=3, bool l2gradient=false );
引數詳解:
影象為輸入影象,單通道8位;
邊緣為輸出影象,與輸入影象同型別同尺寸;
閾值1為滯後閾值演算法的低閾值;
閾值2為為滯後閾值演算法的高閾值;
aperturesize為索貝爾運算元的視窗(卷積核)階數;
l2gradient表示是否使用l2範數來計算影象梯度幅值。
#include#includeusing namespace std;
using namespace cv;
mat src1,gray_img ,src2,dst,finnal_img;
int thresh_value = 40;
int max_value = 255;
void canny_demo(int ,void*);
int main()
namedwindow("input", cv_window_autosize);
imshow("input", src1);
//canny 高斯模糊-->灰度轉換-->(計算梯度-->非最大訊號抑制-->高低閾值輸出二值影象) canny實現
gaussianblur(src1,src2,size(3,3),0,0);
cvtcolor(src2,gray_img,cv_bgr2gray);
namedwindow("output",cv_window_autosize);
createtrackbar("tiaojie","output",&thresh_value,max_value,canny_demo);
canny_demo(0,0);
waitkey(0);
return 0;
}void canny_demo(int ,void*)
初學opencv Canny運算元
include include include canny運算元用於邊緣檢測,首先在x,y方向上求得一階導數,然後組合為4個方向的導數,方向導數達到區域性最大值的點為邊緣候選點 將候選點拼裝成輪廓 若畫素的梯度大於上限閾值,則是邊緣畫素。低於下限閾值則拋棄。若介於兩者之間,只有當與高於上限閾值的畫素...
OpenCV canny邊緣提取演算法
canny是邊緣檢測演算法,在1986年提出。是乙個很好的邊緣檢測器,也是常用的影象處理方法。canny演算法步驟 1.高斯模糊 通過高斯模糊去掉雜訊,因為canny是最雜訊敏感的演算法 gaussianblur 2.灰度轉換 cvtcolor 3.計算梯度 soble scharr 4.非最大訊號...
opencv canny運算元與邊緣檢測
canny運算元 api 我們摳圖的過程其實就是找影象中某個例項 例如人 的邊緣的過程,所以,我們的邊緣檢測,其實就是檢測影象中的例項的邊緣。那現在就有乙個問題了,我們人是怎麼區分邊緣的呢?我們發現,每乙個例項,它的邊緣跟其周圍的畫素差距一般是比較大的。我們的摳圖,就是根據明顯的畫素差距,來區分例項...