1. opencv——Canny算子
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
最好的检测: 算法能够尽可能多地标识出图像中的实际边缘。
最好的定位: 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
最小的响应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
第一步:用高斯平滑滤波器卷积降噪。第二步:计算梯度幅值和方向。第三步:非极大值抑制。第四步:滞后阈值
最简单的Canny用法:
#include
using namespace cv;
int main()
{
Mat src, src1;
src = imread("h:\\1.jpg");
imshow("原始图", src);
Canny(src, src1, 150, 100, 3);
//1.输入图 2.输出图 3.高域值 4.低阈值 5.孔径大小,默认值为3
imshow("效果图", src1);
waitKey(0);
return 0;
}
运行结果:
高阶Canny用法:
转换称灰度图,降噪,用Canny,将边缘作掩码,拷贝原图到效果图,得到彩色边缘图。
#include
using namespace cv;
int main(void)
{
Mat src, dst, edge, gray;
src = imread("h:\\1.jpg");
imshow("原始图", src);
//创建与src同类型,同大小的矩阵dst
dst.create(src.size(), src.type());
//转换灰度图
cvtColor(src, gray, COLOR_BGR2GRAY);
//用3*3内核降噪
blur(gray, edge, Size(3, 3));
//运行Canny算子
Canny(edge, edge, 3, 9, 3);
//将dst图片所有像素设置为0,变成黑色
dst = Scalar::all(0);
//边缘图做掩码,将原图拷贝到效果图中
src.copyTo(dst,edge);
imshow("效果图", dst);
waitKey(0);
return 0;
}
Mat src, dst, edge, gray;
src = imread("h:\\1.jpg");
imshow("原始图", src);
//创建与src同类型,同大小的矩阵dst
dst.create(src.size(), src.type());
//转换灰度图
cvtColor(src, gray, COLOR_BGR2GRAY);
//用3*3内核降噪
blur(gray, edge, Size(3, 3));
//运行Canny算子
Canny(edge, edge, 3, 9, 3);
//将dst图片所有像素设置为0,变成黑色
dst = Scalar::all(0);
//边缘图做掩码,将原图拷贝到效果图中
src.copyTo(dst,edge);
imshow("效果图", dst);
waitKey(0);
return 0;
}