基本边缘检测算子—Roberts
程序员文章站
2022-07-14 11:25:42
...
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat Robets(Mat &SrcImage)
{
Mat DstImage = SrcImage.clone();
int nRows = SrcImage.rows;
int nCols = SrcImage.cols;
for (int i = 0; i < nRows - 1; ++i)
{
for (int j = 0; j < nCols - 1; ++j)
{
int t1 = (SrcImage.at<uchar>(i, j) - SrcImage.at<uchar>(i + 1, j + 1))*
(SrcImage.at<uchar>(i, j) - SrcImage.at<uchar>(i + 1, j + 1));
int t2 = (SrcImage.at<uchar>(i + 1, j) - SrcImage.at<uchar>(i, j + 1))*
(SrcImage.at<uchar>(i + 1, j) - SrcImage.at<uchar>(i, j + 1));
DstImage.at<uchar>(i, j) = (uchar)(abs(t1)+ abs(t2));
}
}
return DstImage;
}
int main()
{
Mat SrcImage = imread("22.jpg");
namedWindow("原图", WINDOW_NORMAL);
imshow("原图", SrcImage);
Mat GrayImage;
cvtColor(SrcImage, GrayImage, COLOR_RGB2GRAY);
Mat Image = Robets(GrayImage);
namedWindow("edge", WINDOW_NORMAL);
imshow("edge", Image);
waitKey(0);
return 0;
}
此图为用绝对值近似梯度幅值
*此图为用正常公式计算梯度幅值
其中注意代码for (int i = 0; i < nRows - 1; ++i)
{
for (int j = 0; j < nCols - 1; ++j)
要求i j 小于 ncols-1 否则用at访问像素时 指针越界
roberts算子是利用局部差分寻找边缘的一种算子
代码参考《opencv图像处理编程实例》
下一篇: WebMagic爬虫Demo
推荐阅读
-
C#图像边缘检测(Roberts)的方法
-
OpenCV图像处理教程C++(十五)边缘检测算法--sobel算子、拉普拉斯算子、Canny算子
-
【OpenCV】边缘检测:Sobel、拉普拉斯算子
-
python—opencv图像膨胀|图像腐蚀|图像边缘检测sobel算子/拉普拉斯算子/canny算子
-
【OpenCV3经典编程100例】(08)边缘检测:拉普拉斯算子Laplacian()
-
边缘检测(2)Roberts算子
-
基本边缘检测算子—Roberts
-
Unity之梯度应用实现Roberts、Prewitt、Sobel边缘检测
-
Roberts算子边缘检测原理及实现
-
opencv边缘检测 roberts算子