您的位置:首页 > 运维架构

图像处理--opencv2 canny边缘检测

2016-05-13 16:09 555 查看
1.canny检测:

Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

好的检测- 算法能够尽可能多地标识出图像中的实际边缘。

好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。

最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

为了满足这些要求 Canny 使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数。

2.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结果图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: