【C++ Opencv】自定义线性滤波、Robert算子、Sobel算子、拉普拉斯算子

1.卷积概念

卷积是图像处理中的一个操作,是kernel在图像的每个像素上的操作
kernel本质上是一个固定大小的矩阵数组,其中心点成为锚点(anchor point)
把kernel放到像素数组之上,求锚点周围覆盖像素乘积之和,用来替换锚点覆盖下像素点值称为卷积处理。
卷积的作用:1.模糊图像 2.提取图像边缘 3.增强图像(图像锐化)

2. 常见算子(常见的卷积核)

1.Robert算子

Robert的X方向

+10
0-1

Robert的Y方向

0+1
-10

2.Sobel算子

Soble的x方向

-101
-202
-101

Sobel的y方向

-1-2-1
000
121

3.拉普拉斯算子(不区分x、y方向)

0-10
-14-1
0-10

代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace cv;

Mat src,dst_x,dst_y,sobel_x,sobel_y,laplase,dst_selfkernel;
int main(int argc, char** argv) {
	src = imread("D:/image/img1.jpg");
	if (src.empty()) {
		printf("image could not load...\n");
		return -1;
	}

	char Input_Win[] = "input image";

	namedWindow(Input_Win, WINDOW_AUTOSIZE);
	namedWindow("Robert_x", WINDOW_AUTOSIZE);
	namedWindow("Robert_y", WINDOW_AUTOSIZE);
	namedWindow("Sobel_x", WINDOW_AUTOSIZE);
	namedWindow("Sobel_y", WINDOW_AUTOSIZE);
	namedWindow("laplase", WINDOW_AUTOSIZE);
	namedWindow("selfkernel", WINDOW_AUTOSIZE);

	imshow(Input_Win,src);

	//Robert X方向
	Mat kernel_x = (Mat_<int>(2, 2) << 1, 0, 0, -1);
	filter2D(src, dst_x, -1, kernel_x, Point(-1, -1), 0.0);  //-1是图像的深度,-1程序自动判断
	imshow("Robert_x", dst_x);

	//Robert Y方向
	Mat kernel_Y = (Mat_<int>(2, 2) << 0,1,-1,0);
	filter2D(src, dst_y, -1, kernel_Y, Point(-1, -1), 0.0);
	imshow("Robert_y", dst_y);
	
	//Sobel X方向
	Mat Sobel_X = (Mat_<int>(3, 3) << -1,0,1,-2,0,2,-1,0,1);
	filter2D(src, sobel_x, -1, Sobel_X, Point(-1, -1), 0.0);
	imshow("Sobel_x", sobel_x);

	//Sobel y方向
	Mat Sobel_Y = (Mat_<int>(3, 3) << -1,-2,-1,0,0,0,1,2,1);
	filter2D(src, dst_y, -1, Sobel_Y, Point(-1, -1), 0.0);
	imshow("Sobel_y", dst_y);

	//Laplase算子
	Mat Laplase= (Mat_<int>(3, 3) << 0,-1,0,-1,4,-1,0,-1,0);
	filter2D(src, laplase, -1, Laplase, Point(-1, -1), 0.0);
	imshow("laplase", laplase);

	//自定义卷积模糊(隔多长时间自己模糊一下)
	int c = 0;
	int index = 0;
	int ksize = 3;
	while (true) {
		c=waitKey(50);
		if ((char)c == 27) {   //char 27 是键盘上的esc键
			break;
		}
		ksize = 4 + (index % 5) * 2 + 1;
		Mat SelfKernel = Mat::zeros(Size(ksize,ksize),CV_32F)/(float)(ksize*ksize);
		filter2D(src, dst_selfkernel, -1, SelfKernel, Point(-1, -1));
		index++;
		imshow("selfkernel", dst_selfkernel);
	}

	waitKey(0);
	return 0;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值