基于sobel算子的彩色图片边缘检测 opencv c++代码实现
时间: 2023-12-28 17:03:20 浏览: 101
以下是基于Sobel算子的彩色图片边缘检测的OpenCV C++代码实现:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("color_image.jpg");
if (src.empty()) {
cout << "Could not open or find the image!\n";
return -1;
}
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
Sobel(gray, grad_x, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
Sobel(gray, grad_y, CV_16S, 0, 1, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
convertScaleAbs(grad_y, abs_grad_y);
Mat edges;
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, edges);
imshow("Original Image", src);
imshow("Edges", edges);
waitKey(0);
return 0;
}
```
代码解析:
1. 首先,我们使用`imread()`函数读取彩色图片。
2. 然后,我们将图片转换为灰度图像,使用`cvtColor()`函数。
3. 接下来,我们使用`sobel()`函数计算$x$方向和$y$方向的梯度。
4. 通过`convertScaleAbs()`函数将梯度转换为绝对值图像,以便进行加权和。
5. 最后,我们将两个梯度加权,使用`addWeighted()`函数,生成边缘图像。
6. 最后,我们使用`imshow()`函数展示原始图像和边缘图像。
注意事项:
1. 该代码只能处理彩色图片,如果要处理灰度图像,需要修改代码。
2. 该代码只使用了Sobel算子,如果要使用其他算子,需要修改代码。
阅读全文