opencv边缘检测 roberts算子

定义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;
}

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值