1,原理
canny边缘检测算子是传统边缘检测算子中最优秀的,canny检测基于下面三个目标:
(1)低错误率。即所有边缘都应该找到,并且没有虚假边缘。
(2)准确的定位边缘。即检测到的边缘应该接近真实的边缘。
(3)单个边缘点响应。即对于边缘检测,只返回单点厚度的结果。
1.1 方法步骤
(1)使用高斯滤波器平滑图像(基本边缘检测基本都有这步,为了减少噪声的影响)
(2)计算梯度幅值和边缘方向
(3)非极大值抑制(细化边缘)
(4)使用双阈值处理和连通性分析检测和链接边缘
2 c++ opencv代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
string path = "./img_all/2.png";
Mat img = imread(path);
Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;
cvtColor(img, imgGray, COLOR_BGR2GRAY); //灰度化
GaussianBlur(img, imgBlur, Size(3, 3), 3, 0); //高斯模糊
Canny(imgBlur, imgCanny, 25, 75); //边缘检测
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(imgCanny, imgDil, kernel);
erode(imgDil, imgErode, kernel);
imshow("Image", img);
imshow("ImageGray", imgGray);
imshow("ImageBlur", imgBlur);
imshow("ImageCanny", imgCanny);
imshow("ImageDilation", imgDil);
imshow("ImageErode", imgErode);
waitKey(0);
return 0;
}
定义了一个字符串变量 path
,存储要处理的图像文件的路径
Mat img = imread(path);
使用 imread
函数从指定路径读取图像到 Mat
类型的变量 img
中。
Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;
声明了五个 Mat
类型的变量,分别用于存储不同处理阶段的图像。
cvtColor(img, imgGray, COLOR_BGR2GRAY); //灰度化
使用 cvtColor
函数将原始图像 img
转换为灰度图像 imgGray
。
GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0); //高斯模糊
使用 GaussianBlur
函数对灰度图像 imgGray
应用高斯模糊,生成模糊后的图像 imgBlur
。Size(3, 3)
定义了高斯核的大小,3
是高斯核的标准偏差。
Canny(imgBlur, imgCanny, 25, 75); //边缘检测
使用 Canny
函数对模糊后的图像 imgBlur
进行边缘检测,生成边缘图像 imgCanny
。25
和 75
是边缘检测的阈值。
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
创建了一个结构元素 kernel
,用于膨胀和腐蚀操作。这里使用的是矩形结构元素,大小为 3x3
。
dilate(imgCanny, imgDil, kernel);
使用 dilate
函数对边缘图像 imgCanny
进行膨胀操作,生成膨胀后的图像 imgDil
。
erode(imgDil, imgErode, kernel);
使用 erode
函数对膨胀后的图像 imgDil
进行腐蚀操作,生成腐蚀后的图像 imgErode
。