1.canny检测:
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
好的检测- 算法能够尽可能多地标识出图像中的实际边缘。好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
2.Canny边缘检测算法步骤为了满足这些要求 Canny 使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数。
Canny边缘检测算法可以分为以下5个步骤:
应用高斯滤波来平滑图像,目的是去除噪声找寻图像的强度梯度(intensity gradients)应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是)应用双阈值的方法来决定可能的(潜在的)边界利用滞后技术来跟踪边界
3.opencv2 Canny函数
void Canny( InputArray image, OutputArray edges,
double threshold1, double threshold2,
int apertureSize=3, bool L2gradient=false );
其中:
InputArray image:输入图像,必须为灰度图;
OutputArray edges:输出图像,保存canny边缘检测的结果;
double threshold1:灰度值的最小阈值;
double threshold2:灰度值的最大阈值。
示例:
#include <opencv/cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/legacy/legacy.hpp>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
using namespace cv;
int img_canny(Mat image) {
if (!image.data) {
cout << "Fail to load image" << endl;
return 1;
}
Mat gray;
if (image.channels() == 3) {
cvtColor(image, gray, CV_BGR2GRAY);
} else {
image.copyTo(gray);
}
Mat result;
Canny(gray, result, 50, 250);
imshow("cannyResult", result);
return 0;
}
int main(int args, char** argv) {
Mat image = imread("/home/odroid/boon/pro_internet/xidao/A002.jpg");
imshow("original", image);
img_canny(image); //canny
waitKey();
return 0;
}
输入原始图 canny结果图