Canny边缘检测效果图:
1、边缘检测概述和一般步骤
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。
一般步骤:
(1)滤波:采用滤波器来改善与噪声有关的边缘检测器的性能
(2)增强:确定图像各点领域强度的变化值。增强算法可以将图像灰度点领域强度值有显著变化的点凸显出来
(3)检测:不是所有的边缘点都是我们需要的,应该采用某种方法来对这些店进行取舍
2、canny算子简介
Canny边缘检测算子当今最优的边缘检测的算法。
它是基于最优边缘检测的三个主要评价标准:
低错误率 高定位性 最小响应
3、canny边缘检测的步骤
(1)消除噪声 :用高斯平滑滤波器卷积来降噪
(2)计算梯度幅值和方向 : 运用一对卷积阵列和计算梯度幅值和方向
(3)非极大值抑制 : 排除非边缘像素,仅仅保留了一些细线条
(4)滞后阈值 : 超过高阈值时,该像素被保留为边缘像素
小于低阈值时,该像素被排除
4、Canny函数介绍
void cvCanny(
const CvArr* image,
CvArr* edges,
double threshold1,double threshold2,
int aperture_size=3
);
函数说明:
第一个参数表示输入图像,必须为单通道灰度图。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。
5、示例代码
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
//载入原图像
Mat src = imread("F://2.0.png");
Mat src1 = src.clone();
imshow("【原始图】", src);
//高阶的canny用法,转成灰度图,降噪
//用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图
Mat dst, edge, gray;
//【1】创建与src同类型和大小的矩阵
dst.create(src1.size(), src1.type());
//【2】将原图转成灰度图像
cvtColor(src1, gray, COLOR_BGR2GRAY);
imshow("灰度图像", gray);
//【3】先使用3*3内核来降噪
blur(gray, edge, Size(3, 3));
//【4】运行Canny算子
Canny(edge, edge, 3, 9, 3);
imshow("灰度边缘效果图", edge);
//【5】将dst内的所有元素设置为0
dst = Scalar::all(0);
//【6】使用Canny算子输出的边缘图作为掩码,来将原图src拷贝到目标图dst中
src1.copyTo(dst, edge);
//【7】显示彩色效果图
imshow("彩色边缘图", dst);
waitKey(0);
return 0;
}
6、效果总览
源代码下载链接: