定义roberts两个算子 分别为135度 和45度。
[1,0, 0,-1] [0,1 -1,0]
这里展示在c++实现的过程。先展示下效果图 分别是45度角 135度角和边缘效果图。
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>#include<iostream>using namespace cv;//roberts 边缘检测
void roberts(InputArray src, OutputArray dst, int ddepth, int x = 1, int y = 0, int borderType = BORDER_DEFAULT)
{CV_Assert(!(x == 0 && y == 0));Mat roberts_1 = (Mat_<float>(2, 2) << 1, 0, 0, -1);Mat roberts_2 = (Mat_<float>(2, 2) << 0, 1, -1, 0);//当x不等于0 src和roberts_1卷积if (x != 0 && y == 0){conv2D(src, roberts_1, dst, ddepth, Point(0, 0), borderType);}//当y不等于0 src和roberts_2卷积if (y != 0 && x == 0){conv2D(src, roberts_2, dst, ddepth, Point(0, 0), borderType);}}int main()
{Mat m = imread("E:/CPPProject/openCV/1.jpg");if (!m.data)return -1;Mat img_roberts_1;roberts(m, img_roberts_1, CV_32FC1, 1, 0);//图像矩阵和roberts_2卷积Mat img_roberts_2;roberts(m, img_roberts_2, CV_32FC1, 0, 1);//两个卷积结果的灰度级显示Mat abs_img_roberts_1, abs_img_roberts_2;convertScaleAbs(img_roberts_1, abs_img_roberts_1, 1, 0);convertScaleAbs(img_roberts_2, abs_img_roberts_2, 1, 0);imshow("135度 方向边缘", abs_img_roberts_1);imshow("45度 方向边缘", abs_img_roberts_2);//第三部 通过第二部得到的两个卷积结果 求出最终的边缘强度//这里采用平方根的方式Mat img_roberts_1_2, img_roberts_2_2;pow(img_roberts_1, 2.0, img_roberts_1_2);pow(img_roberts_2, 2.0, img_roberts_2_2);Mat edge;sqrt(img_roberts_1_2 + img_roberts_2_2, edge);//数据类型转换 边缘强度的灰度级现实edge.convertTo(edge, CV_8UC1);//edge.convertTO(edge, CV_8UC1);imshow("边缘强度", edge);/*namedWindow("I", 1);Mat a = gaussBlur(m,Size(3,3),3.0);imshow("a", a);*/waitKey(0);return 0;
}