1. Canny邊緣檢測演算法的步驟和理解
姓名:高強 學號:17011210057
【嵌牛導讀】:本文主要介紹Canny圖像邊緣檢測演算法的步驟和對各個步驟的理解
【嵌牛鼻子】:邊緣檢測,Canny,步驟
【嵌牛提問】:canny邊緣檢測演算法的步驟是怎樣?
【嵌牛正文】:
1. Canny邊緣檢測演算法的提出和指標
Canny演算法是John Canny在1986年提出的,那年John Canny 28歲,該文章發表在PAMI頂級期刊上(1986.IEEE Transactions on Pattern Analysis and Machine Intelligence,vol. 8, 1986 , pp 679-698 )。
Canny運算元與Marr(LoG)邊緣檢測方法類似(Marr大爺號稱計算機視覺之父),也屬於是先平滑後求導數的方法。John Canny研究了最優邊緣檢測方法所需的特性,給出了評價邊緣檢測性能優劣的三個指標:
(1)好的信噪比 ,即將非邊緣點判定為邊緣點的概率要低,將邊緣點判為非邊緣點的概率要低;
(2)高的定位性能 ,即檢測出的邊緣點要盡可能在實際塵友邊緣的中心;
(3)對單一邊緣僅有唯一響應 ,即單個邊緣產生多個響應的概率要低,並且虛假響應邊緣應該得到最大抑制。
用一句話說,就是希望在提高對景物邊緣的敏感性的同時,可以抑制雜訊的方法才是好的邊緣提取方法。
2. Canny邊緣檢測演算法的步驟 :
(1)圖像高斯濾波進行降噪處理。
(2)用一階偏導的有限差分計算梯度告森的幅值和方向。
(3)對梯度幅值進行非極大值抑制。
(4)用雙閾值演算法檢測和連接邊緣。
3. Canny邊緣檢測演算法的通俗理解
Canny演算法的目的就是邊緣檢測,何為邊緣?圖象局部區域亮度變化顯著的部分,對於灰度圖像來說,也就是灰度值有一個明顯變化,既從一個灰度值在很小的緩沖區域內急劇變化到另一個灰度相差較大的灰度值。那麼襪兄畝怎麼表徵這種灰度值的變化呢?這里想到的就是導數微分,導數就是表徵變化率的,但是數字圖像都是離散的,也就是導數肯定會用差分來代替。也就是具體演算法中的步驟2,用相鄰像素的差分來計算梯度的大小和方向。但是在真實的圖像中,一般會有雜訊,雜訊會影響梯度的計算,所以步驟1要先濾波。理論上將圖像梯度幅值的元素值越大,說明圖像中該點的梯度值越大,但這不能說明該點就是邊緣。在Canny演算法中,步驟3的非極大值抑制是進行邊緣檢測的重要步驟,通俗意義上是指尋找像素點的局部最大值,沿著梯度方向,比較它前面和後面的梯度值,若梯度值局部最大則有可能為邊緣像素,進行保留,否則就進行抑制。步驟4是一個典型演算法,有時候我們並不能一刀切,也就是超過閾值的都是邊緣點,而是設兩個閾值,希望在高閾值和低閾值之間的點也可能是邊緣點,而且這些點最好在高閾值的附近,也就是說這些中間閾值的點是高閾值邊緣點的一種延伸。所以步驟4用了雙閾值來進行檢測和連接邊緣。雙閾值有時也叫做滯後閾值。
2. 圖片處理-opencv-10.圖像銳化與邊緣檢測
Roberts運算元又稱為交叉微分演算法,它是基於交叉差分的梯度演算法,通過局部差分計算檢測邊緣線條。常用來處理具有陡峭的低雜訊圖像,當圖像邊緣接近於正45度或負45度時,該演算法處理效果更理想。其缺點是對邊緣的定位不太准確,提取的邊緣線條較粗。
Prewitt是一種圖像邊緣檢測的微分運算元,其原理是利用特定區域內像素灰度值產生的差分實現邊緣檢測。由於Prewitt運算元採用3 3模板對區域內的像素值進行計算,而Robert運算元的模板為2 2,故Prewitt運算元的邊緣檢測結果在水平方向和垂直方向均比Robert運算元更加明顯。Prewitt運算元適合用來識別雜訊較多、灰度漸變的圖像。
dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
RSobel運算元是一種用於邊緣檢測的離散微分運算元,它結合了高斯平滑和微分求導。該運算元用於計算圖像明暗程度近似值,根據圖像邊緣旁邊明暗程度把該區域內超過某個數的特定點記為邊緣。Sobel運算元在Prewitt運算元的基礎上增加了權重的概念,認為相鄰點的距離遠近對當前像素點的影響是不同的,距離越近的像素點對應當前像素的影響越大,從而實現圖像銳化並突出邊緣輪廓。Sobel運算元的邊緣定位更准確,常用於雜訊較多、灰度漸變的圖像。
Sobel運算元根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對雜訊具有平滑作用,提供較為精確的邊緣方向信息。因為Sobel運算元結合了高斯平滑和微分求導(分化),因此結果會具有更多的抗噪性,當對精度要求不是很高時,Sobel運算元是一種較為常用的邊緣檢測方法。
dst = Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
在進行Sobel運算元處理之後,還需要調用convertScaleAbs()函數計算絕對值,並將圖像轉換為8點陣圖進行顯示
dst = convertScaleAbs(src[, dst[, alpha[, beta]]])
拉普拉斯(Laplacian)運算元是n維歐幾里德空間中的一個二階微分運算元,常用於圖像增強領域和邊緣提取。它通過灰度差分計算鄰域內的像素,基本流程是:判斷圖像中心像素灰度值與它周圍其他像素的灰度值,如果中心像素的灰度更高,則提升中心像素的灰度;反之降低中心像素的灰度,從而實現圖像銳化操作。在演算法實現過程中,Laplacian運算元通過對鄰域中心像素的四方向或八方向求梯度,再將梯度相加起來判斷中心像素灰度與鄰域內其他像素灰度的關系,最後通過梯度運算的結果對像素灰度進行調整。
Laplacian運算元分為四鄰域和八鄰域,四鄰域是對鄰域中心像素的四方向求梯度,八鄰域是對八方向求梯度。當鄰域內像素灰度相同時,模板的卷積運算結果為0;當中心像素灰度高於鄰域內其他像素的平均灰度時,模板的卷積運算結果為正數;當中心像素的灰度低於鄰域內其他像素的平均灰度時,模板的卷積為負數。對卷積運算的結果用適當的衰弱因子處理並加在原中心像素上,就可以實現圖像的銳化處理。
dst = Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
由於Sobel運算元在計算相對較小的核的時候,其近似計算導數的精度比較低,比如一個33的Sobel運算元,當梯度角度接近水平或垂直方向時,其不精確性就越發明顯。Scharr運算元同Sobel運算元的速度一樣快,但是准確率更高,尤其是計算較小核的情景,所以利用3*3濾波器實現圖像邊緣提取更推薦使用Scharr運算元
Scharr運算元又稱為Scharr濾波器,也是計算x或y方向上的圖像差分,在OpenCV中主要是配合Sobel運算元的運算而存在的。Scharr運算元的函數原型如下所示,和Sobel運算元幾乎一致,只是沒有ksize參數.
dst = Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]])
Canny邊緣檢測運算元(多級邊緣檢測演算法)是一種被廣泛應用於邊緣檢測的標准演算法,其目標是找到一個最優的邊緣檢測解或找尋一幅圖像中灰度強度變化最強的位置。最優邊緣檢測主要通過低錯誤率、高定位性和最小響應三個標准進行評價。
Canny運算元的實現步驟如下:
edges = Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
LOG(Laplacian of Gaussian)邊緣檢測運算元也稱為Marr&Hildreth運算元,它根據圖像的信噪比來求檢測邊緣的最優濾波器。該演算法首先對圖像做高斯濾波,然後再求其拉普拉斯(Laplacian)二階導數,根據二階導數的過零點來檢測圖像的邊界,即通過檢測濾波結果的零交叉(Zero crossings)來獲得圖像或物體的邊緣。
LOG運算元該綜合考慮了對雜訊的抑制和對邊緣的檢測兩個方面,並且把Gauss平滑濾波器和Laplacian銳化濾波器結合了起來,先平滑掉雜訊,再進行邊緣檢測,所以效果會更好。 該運算元與視覺生理中的數學模型相似,因此在圖像處理領域中得到了廣泛的應用。它具有抗干擾能力強,邊界定位精度高,邊緣連續性好,能有效提取對比度弱的邊界等特點。
3. sobel邊緣檢測優缺點與canny運算元的優缺點
一、sobel邊緣檢測:
1、sobel邊緣檢測優點:輸出圖像(數組)的元素通常具有更大的絕對數值。
2、sobel邊緣檢測缺點:由於邊緣是位置的標志,對灰度的變化不敏感。
二、canny運算元:
1、canny運算元優點:法能夠盡可能多地標識出圖像中的實際邊緣;標識出的邊緣要與實際圖像中的實際邊緣盡可能接近。
2、canny運算元缺點:圖像中的邊緣只能標識一次,並且可能存在的圖像雜訊不應標識為邊緣。
(3)邊界識別演算法擴展閱讀:
Sobel邊緣檢測的核心在於像素矩陣的卷積,卷積對於數字圖像處理非常重要,很多圖像處理演算法都是做卷積來實現的。
卷積運算的本質就是對制定的圖像區域的像素值進行加權求和的過程,其計算過程為圖像區域中的每個像素值分別與卷積模板的每個元素對應相乘,將卷積的結果作求和運算,運算到的和就是卷積運算的結果。
4. 如何利用opencv實現彩色圖像邊緣檢測演算法
在opencv中顯示邊緣檢測很簡單,只需調用一個cvCanny函數,其使用的是Canny演算法來實現對圖像的邊緣檢測.
函數原型為:
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );
第一個參數為待檢測的圖像,注意一點,其必須是灰度圖.
第二個參數為輸出的邊緣圖,其也是一個灰度圖.
後三個參數與Canny演算法直接相關,threshold1和threshold2 當中的小閾值用來控制邊緣連接,大的閾值用來控制強邊緣的初始分割,aperture_size運算元內核大小,可以去看看Canny演算法.
從彩色圖到灰度圖需要使用到cvCvtColor函數,其接受三個參數,第一為輸入,第二為輸出,第三個為轉換的標識,我們這邊是RGB到GRAY,使用的是CV_RGB2GRAY.
參考demo代碼如下:
#include <iostream>
#include <string>
#include <sstream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace std;
int String2int(const string& str_)
{
int _nre = 0;
stringstream _ss;
_ss << str_;
_ss >> _nre;
return _nre;
}
void DoCanny(const string& strFileName_)
{
//原彩色圖片
IplImage* _pIplImageIn = cvLoadImage(strFileName_.data());
if (_pIplImageIn == NULL)
{
return;
}
//彩色圖片轉換成灰度圖放置的圖片
IplImage* _pIplImageCanny = cvCreateImage(cvGetSize(_pIplImageIn), _pIplImageIn->depth, 1);
cvCvtColor(_pIplImageIn, _pIplImageCanny, CV_RGB2GRAY);//CV_RGB2GRAY將rgb圖轉成灰度圖
//只有邊緣路徑的圖片
IplImage* _pIplImageOut = cvCreateImage(cvGetSize(_pIplImageIn), IPL_DEPTH_8U, 1);
//邊緣檢測只能作用於灰度圖
if (_pIplImageCanny->nChannels != 1)
{
return;
}
//邊緣檢測操作
cvCanny(_pIplImageCanny, _pIplImageOut, 1, 110, 3);
cvNamedWindow("Src");
cvShowImage("Src", _pIplImageIn);
cvNamedWindow("Canny");
cvShowImage("Canny", _pIplImageOut);
cvWaitKey(0);
cvReleaseImage(&_pIplImageIn);
cvReleaseImage(&_pIplImageCanny);
cvReleaseImage(&_pIplImageOut);
cvDestroyWindow("Src");
cvDestroyWindow("Canny");
}
int main(int argc, char* argv[])
{
if (argc < 2)
{
cout << "You should give the filename of picture!" << endl;
return -1;
}
DoCanny(argv[1]);
return 0;
}
5. 怎樣理解微分運算元可以檢測圖像的邊界
常見的邊緣檢測運算元有Roberts運算元、Prewitt運算元、Sobel運算元、Marr-Hidreth邊緣檢測以及canny運算元等。
一、利用梯度進行哪汪早邊緣檢測
1、Roberts運算元採用對角線方向相鄰兩像素之差近似的梯度幅值來檢測邊緣。該運算元定位較准確,但對雜訊比較敏感,檢測水平和豎直邊緣效果好於斜向李雀邊緣。
2、Sobel運算元根據圖陵孝像的像素點上下、左右鄰點灰度加權差在邊緣處達到極值這一特點來檢測邊緣。該運算元對雜訊有較好的平滑作用,能提供建准確的邊緣方向信息,但是邊緣定位精度不高。
3、Prewitt運算元邊緣檢測的思路與Sobel運算元類似,也是在一個掩模中定義微分運算。運算元對雜訊具有平滑作用,同樣定位精度不夠高。
二、更為先進的邊緣檢測技術
1、Marr-Hildreth演算法(拉普拉斯運算元)
(1)採用高斯低通濾波器對圖像進行濾波;
(2)採用拉普拉斯模板對進行卷積;
(3)找到步驟(2)所得圖像的零交叉。
該運算元是二階微分運算元,利用邊緣點處二階導函數出現零交叉原理來檢測圖像的邊緣。對灰度突變及雜訊較敏感,不具有方向性,不能獲得圖像邊緣的方向信息。
2、Canny運算元
Canny邊緣檢測演算法步驟:
(1)用一個高斯濾波器平滑輸入圖像
(2)計算梯度幅值圖像和角度圖像
(3)對梯度幅值圖像進行非最大抑制
(4)用雙閾值處理和連接分析來檢測並連接邊緣
Canny運算元是上述中效果最好的運算元,該運算元去噪能力強,在連續性、細度和筆直度等線的質量方面也很出眾。但是Canny運算元的性能帶來的問題是:連接起來更復雜、執行時間較長。
綜上所述,在實際工業生產中,要求實時性較高的情況下,通常採用閾值梯度的方法;當對質量要求較高時,可選擇更為先進的方法,尤其是Canny運算元。