OpenCV(iOS)的邊緣檢測和Canny運算元

一個蘿蔔壹個坑發表於2018-01-03

 邊緣檢測的一般步驟

(1)濾波

邊緣檢測的演算法主要是基於影象強度的一階和二階導數,但導數通常對噪聲很是敏感,因此必須採用濾波器來改善與噪聲有關的邊緣檢測器的效能。常見的濾波方法是高斯濾波

(2)增強

增強邊緣的基礎是確定影象各點領域強度的變化值。增強演算法可以將影象灰度點領域強度值有顯著變化的點凸顯出來,具體編碼實現中,可以通過計算梯度的幅值來確定

(3)檢測

講過增強的影象,往往領域中有很多點的梯度值比較大,而在特定的應用中,這些點並不是要找的邊緣點,所以採用某種方法來對這些點進行取捨。實際工程中常用的方法是閾值化方法來檢測。

Canny運算元

Canny 邊緣檢測演算法是 John F. Canny 於 1986年開發出來的一個多級邊緣檢測演算法,也被很多人認為是邊緣檢測的最優演算法, 最優邊緣檢測的三個主要評價標準是:

低錯誤率:標識出盡可能多的實際邊緣,同時儘可能的減少噪聲產生的誤報。

高定位性:標識出的邊緣要與影象中的實際邊緣儘可能接近。

最小響應:影象中的邊緣只能標識一次。

步驟:


OpenCV(iOS)的邊緣檢測和Canny運算元

Canny邊緣檢測:Canny()函式

void Canny( InputArray image,

                   OutputArray edges,

                   double threshold1,

                   double threshold2,

                   int apertureSize =3,

                  bool L2gradient =false);

OpenCV(iOS)的邊緣檢測和Canny運算元

原圖


OpenCV(iOS)的邊緣檢測和Canny運算元


原始碼(1)直接使用Canny():

NSString*image =@"456.png";

UIImage*image1 = [UIImageimageNamed:image];

Mat im;

UIImageToMat(image1, im);

if(im.empty()) {

return;

}

Mat src1 = im.clone();

//最簡單的方法,拿過圖來直接使用

Canny(src1,dst,150,100);

self.secondImageView.image=MatToUIImage(dst);

return;

效果

OpenCV(iOS)的邊緣檢測和Canny運算元

原始碼(2)

NSString*image =@"star.png";

UIImage*image1 = [UIImageimageNamed:image];

Mat im;

UIImageToMat(image1, im);

if(im.empty()) {

return;

}

Mat src1 = im.clone();

//高階的使用方法

Mat edge,gray;

//建立與src同型別和大小的矩陣(dst)

dst.create(im.size(),im.type());

//將原圖轉換為灰度圖片

cvtColor(im, gray,COLOR_RGBA2GRAY);

//先使用3*3核心來降噪

blur(gray, edge,cv::Size(3,3));

//運用Canny運算元

Canny(edge, edge,9,3,3);

//將dst內的元素設定為0

dst=Scalar::all(0);

//使用Canny運算元輸出的邊緣圖作為掩碼,將原圖拷貝到目標圖

src1.copyTo(dst, edge);

self.secondImageView.image=MatToUIImage(dst);

效果

OpenCV(iOS)的邊緣檢測和Canny運算元

相關文章