手把手教你OpenCV实现Canny边缘检测 C++

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 应用高斯模糊,生成模糊后的图像 imgBlurSize(3, 3) 定义了高斯核的大小,3 是高斯核的标准偏差。

Canny(imgBlur, imgCanny, 25, 75); //边缘检测

使用 Canny 函数对模糊后的图像 imgBlur 进行边缘检测,生成边缘图像 imgCanny2575 是边缘检测的阈值。

Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));

创建了一个结构元素 kernel,用于膨胀和腐蚀操作。这里使用的是矩形结构元素,大小为 3x3

dilate(imgCanny, imgDil, kernel);

使用 dilate 函数对边缘图像 imgCanny 进行膨胀操作,生成膨胀后的图像 imgDil

erode(imgDil, imgErode, kernel);

使用 erode 函数对膨胀后的图像 imgDil 进行腐蚀操作,生成腐蚀后的图像 imgErode

3,结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值