边缘检测的一般步骤:
最优边缘检测的三个评价标准:
低错误率:表示出尽可能多的实际边缘,同时尽可能地减少噪声产生的误报;
高定位性:标识出的边缘要与图像实际边缘尽可能接近;
最小响应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应被标识为边缘。
示例程序:
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7 //Canny边缘检测的一般过程: 8 //转成灰度图 9 //降噪 10 //用Canny算子(此时已经得到了边缘) 11 //将边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘 12 13 14 int main(int argc, char** argv) 15 { 16 Mat src = imread("test.jpg"); 17 Mat src1 = src.clone(); 18 Mat dst, edge, gray; 19 20 //初始化输出图 21 dst.create(src1.size(), src1.type());6 22 dst = Scalar::all(0); 23 24 //转成灰度图 25 cvtColor(src1, gray, COLOR_BGR2GRAY); 26 27 //均值滤波降噪,也可以用其他滤波方法 28 blur(gray, edge, Size(3, 3)); 29 30 //运行canny算子,得到边缘 31 Canny(edge, edge, 3, 9, 3); 32 33 //掩膜的存在使得只有边缘部分被copy,得到彩色的边缘 34 src1.copyTo(dst, edge); 35 36 imshow("效果图", dst); 37 38 waitKey(0); 39 return 0; 40 41 }
不管是哪种方法最后得到的都是二值图像