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

OpenCV中用Canny算子进行边缘检测

2017-08-28 18:57 495 查看

1、Canny原理

Canny算子是目前找到的一个最优的边缘检测算子。主要通过以下4个步骤:

step1:用高斯滤波器平滑图象

step2:用一阶偏导的有限差分来计算梯度的幅值和方向

step3:对梯度幅值进行非极大值抑制

step4:用双阈值算法检测和连接边缘

具体的内容可以参考这篇文章

2、OpenCV代码

#include <iostream>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("1.jpg");
Mat src1 = src.clone();

// 显示原图
imshow("【效果图】Canny边缘检测", src);

Mat dst, edge, gray;

// 【1】创建与src同类型和大小的矩阵(dst)
dst.create(src1.size(), src1.type());

// 【2】将原图转换为灰度图像
cvtColor(src1, gray, COLOR_BGR2GRAY);

// 【3】先用3×3的内核来降噪
blur(gray, edge, Size(3, 3));

// 【4】运行Canny算子
Canny(edge, edge, 3, 9, 3);

// 【5】将dst内的所有元素都置为0
dst = Scalar::all(0);

// 【6】使用Canny算子输出的边缘图edge作为掩码,来讲原图src1拷贝到目标图dst中
src1.copyTo(dst, edge);

// 【7】显示效果图
imshow("【效果图】Canny边缘检测2", dst);

waitKey(0);

system("pause");
return 0;
}


程序运行结果:





src1.copyTo(dst, edge)函数解释:将掩膜图像(edge)加到原始图像(src1)上,并将结果保存到图像dst中。

加的方法是这样的:对于灰度图像,掩盖后在图像中掩膜中所有像素值对应为0的点变为黑色(被掩盖),其他点(所有非0值)和原来一致。

对于三通道彩色图像,某个通道中所有在掩膜中值为0的点在该通道上的像素值变为0,其他所有非0值保持和原来不变。例如当对绿色和蓝色通道加掩膜时会呈现一种图像被盖了一层红色的效果。(因为蓝色和绿色被掩盖了)

不管是灰度图像还是彩色图像,只有掩膜中像素值为0的点会对图像产生掩盖效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv
相关文章推荐