赞
踩
边缘检测的基本思想是通过检测每个像素和其邻域的状态,以决定该像素是否位于一个物体的边界上。如果一个像素位于一个物体的边界上,则其邻域像素的灰度值的变化就比较大。假如可以应用某种算法检测出这种变化并进行量化表示,那么就可以确定物体的边界。
经典的边缘检测方法是对原始图像中像素的某小邻域来构造边缘检测算子。常用的边缘检测方法有Roberts算子、Sobe l算子、Prew itt算子、K irsch算子、Laplacian算子、LOG 算子、Canny算子等。其中canny算子最为常用,本文将重点介绍canny算子的运用。
可参见:canny算子,canny算子相关文献
canny算子在OpenCV中已经被编写为函数Canny(),可直接调用,其原型如下:
void cv::Canny | ( | InputArray | image, //输入图像,要求为灰度图 |
OutputArray | edges, //canny检测后的输出图像 | ||
double | threshold1, //阈值1,低阈值 | ||
double | threshold2, //阈值2,高阈值,低/高=比值1:2~1:3尤佳 | ||
int | apertureSize = 3 , //Sobel算子的孔径大小 | ||
bool | L2gradient = false //计算梯度幅度值的标识,默认为false | ||
) |
- //Canny边缘检测练习
- //2016.07.21
-
- //头文件和命名空间
- #include<opencv2/opencv.hpp>
- #include<opencv2/imgproc/imgproc.hpp>
- #include<opencv2/highgui/highgui.hpp>
- using namespace cv;
-
- int main()
- {
- Mat srcImage = imread("grape.jpg");
- Mat img = srcImage.clone();//原图备份至img,用于后续的处理
- imshow("【1】原图", img);
-
- Mat grayImage, addingImage, blurImage,canny_detection;
-
- addingImage.create(img.size(), img.type());//创建于原图大小和类型相同的矩阵
- cvtColor(img, grayImage, COLOR_BGR2GRAY);//将待处理图像转换为灰度图
- imshow("【2】灰度图", grayImage);
-
- blur(grayImage, blurImage, Size(7, 7));//均值滤波,降噪处理
- imshow("【3】灰度图+均值滤波", blurImage);
-
- Canny(blurImage, canny_detection, 3, 9, 3);//边缘检测
- imshow("【4】灰度图+均值滤波+边缘检测", canny_detection);
-
- addingImage = Scalar::all(0);//创建黑色画布
- img.copyTo(addingImage, canny_detection);//将备份图和canny输出的边缘检测图叠加
- imshow("【5】原图和边缘检测叠加", addingImage);
-
- waitKey(0);//按ESC可退出
- return 0;
- }
============不同的参数取值,如滤波采用的内核,及canny的阈值对最终检测效果影响较大============
***均值模糊采用3x3的内核,高低阈值分别为3,9,其边缘检测效果:
***均值模糊采用7X7的内核,高低阈值分别为3、9,其边缘检测效果:
***均值模糊采用7X7的内核,高低阈值分别为40、90,其边缘检测效果:
边缘检测图与原图叠加后的效果图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。