欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv边缘检测 roberts算子

程序员文章站 2022-07-14 11:19:26
...

定义roberts两个算子 分别为135度 和45度。

[1,0, 0,-1] [0,1 -1,0]
这里展示在c++实现的过程。先展示下效果图 分别是45度角 135度角和边缘效果图。

opencv边缘检测 roberts算子opencv边缘检测 roberts算子

opencv边缘检测 roberts算子opencv边缘检测 roberts算子

#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;
}