c++实现均canny
时间: 2023-09-06 17:12:43 浏览: 42
实现均值Canny算法的步骤如下:
1. 对原始灰度图像进行高斯模糊,以减少噪声干扰。
2. 计算图像的梯度和方向,使用Sobel算子或其他梯度算子实现。
3. 对梯度幅值进行非极大值抑制,以保留边缘最大的像素点。
4. 应用双阈值算法,将像素点分为强边缘、弱边缘和非边缘三类。其中,强边缘像素点一定是边缘,弱边缘像素点可能是边缘,非边缘像素点不是边缘。
5. 使用连接弱边缘像素点的方法,将弱边缘像素点连接到强边缘像素点上,形成完整的边缘。
代码实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <opencv2/opencv.hpp>
using namespace cv;
void canny(Mat& src, Mat& dst, double low_thresh, double high_thresh) {
Mat edges;
Canny(src, edges, low_thresh, high_thresh);
dst.create(src.size(), src.type());
dst.setTo(Scalar::all(0));
src.copyTo(dst, edges);
}
int main(int argc, char** argv) {
Mat src, gray, dst;
if (argc != 2) {
printf("Usage: canny <image_path>\n");
return -1;
}
src = imread(argv[1], IMREAD_COLOR);
if (src.empty()) {
printf("Cannot read image file: %s\n", argv[1]);
return -1;
}
cvtColor(src, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(3, 3), 0, 0);
canny(gray, dst, 50, 150);
namedWindow("Canny Edge Detection", WINDOW_NORMAL);
imshow("Canny Edge Detection", dst);
waitKey(0);
return 0;
}
```