邊緣檢測的一般步驟
(1)濾波
邊緣檢測的演算法主要是基於影象強度的一階和二階導數,但導數通常對噪聲很是敏感,因此必須採用濾波器來改善與噪聲有關的邊緣檢測器的效能。常見的濾波方法是高斯濾波
(2)增強
增強邊緣的基礎是確定影象各點領域強度的變化值。增強演算法可以將影象灰度點領域強度值有顯著變化的點凸顯出來,具體編碼實現中,可以通過計算梯度的幅值來確定
(3)檢測
講過增強的影象,往往領域中有很多點的梯度值比較大,而在特定的應用中,這些點並不是要找的邊緣點,所以採用某種方法來對這些點進行取捨。實際工程中常用的方法是閾值化方法來檢測。
Canny運算元
Canny 邊緣檢測演算法是 John F. Canny 於 1986年開發出來的一個多級邊緣檢測演算法,也被很多人認為是邊緣檢測的最優演算法, 最優邊緣檢測的三個主要評價標準是:
低錯誤率:標識出盡可能多的實際邊緣,同時儘可能的減少噪聲產生的誤報。
高定位性:標識出的邊緣要與影象中的實際邊緣儘可能接近。
最小響應:影象中的邊緣只能標識一次。
步驟:
Canny邊緣檢測:Canny()函式
void Canny( InputArray image,
OutputArray edges,
double threshold1,
double threshold2,
int apertureSize =3,
bool L2gradient =false);
原圖
原始碼(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;
效果
原始碼(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);
效果