C++语言实现robert算子锐化处理
时间: 2023-08-12 16:41:15 浏览: 92
好的,下面是C++语言实现robert算子锐化处理的代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 读取图像
Mat src = imread("lena.jpg");
if (src.empty())
{
cout << "Could not open or find the image!\n" << endl;
return -1;
}
// 转为灰度图像
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
// Robert算子锐化处理
Mat robert_x = (Mat_<char>(2, 2) << 1, 0, 0, -1);
Mat robert_y = (Mat_<char>(2, 2) << 0, 1, -1, 0);
Mat dst_x, dst_y;
filter2D(gray, dst_x, CV_16S, robert_x);
filter2D(gray, dst_y, CV_16S, robert_y);
Mat dst = abs(dst_x) + abs(dst_y);
dst.convertTo(dst, CV_8U);
// 显示原图和处理后的图像
namedWindow("Source image", WINDOW_AUTOSIZE);
imshow("Source image", src);
namedWindow("Robert operator", WINDOW_AUTOSIZE);
imshow("Robert operator", dst);
waitKey(0);
return 0;
}
```
在这个代码中,我们首先读取了一张图像,然后将其转化为灰度图像。接着,我们定义了Robert算子的横向和纵向卷积核,分别为:
```
Mat robert_x = (Mat_<char>(2, 2) << 1, 0, 0, -1);
Mat robert_y = (Mat_<char>(2, 2) << 0, 1, -1, 0);
```
然后,我们使用cv::filter2D函数来对灰度图像进行卷积运算,得到横向和纵向的卷积结果:
```
Mat dst_x, dst_y;
filter2D(gray, dst_x, CV_16S, robert_x);
filter2D(gray, dst_y, CV_16S, robert_y);
```
接着,我们对两个卷积结果取绝对值并相加,得到锐化后的图像:
```
Mat dst = abs(dst_x) + abs(dst_y);
dst.convertTo(dst, CV_8U);
```
最后,我们使用cv::imshow函数来显示原图和处理后的图像。
需要注意的是,在进行卷积运算时,我们使用了CV_16S类型来存储结果,这是因为卷积结果可能会超出像素值范围而导致溢出。使用CV_16S类型可以避免这种情况的发生。最后,我们将结果转换为CV_8U类型以便于显示。
阅读全文