OpenCV(iOS)的边缘检测和Canny算子
边缘检测的一般步骤
(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);
效果