opencv3.1学习笔记(15) 自定义线性滤波


演示代码:

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

using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst,dst2,dst3,dst4,dst5,dst6;
	src = imread("e:/5gray.bmp");
	imshow("src image", src);

	//Robert算子x方向
	Mat kx = (Mat_<int>(2, 2) << 1, 0, 0, -1);
	filter2D(src, dst, -1, kx, Point(-1, -1), 0.0);
	//Rober算子y方向
	Mat ky = (Mat_<int>(2, 2) << 0,1, -1, 0);
	filter2D(src, dst2, -1, ky, Point(-1, -1), 0.0);

	imshow("RobertX", dst);
	imshow("RobertY", dst2);


	//Sobel算子x方向
	Mat kx2 = (Mat_<int>(3, 3) << -1,0,1,-2,0,2,-1,0,1);
	filter2D(src, dst3, -1, kx2, Point(-1, -1), 0.0);
	//Sobel算子y方向
	Mat ky2 = (Mat_<int>(3, 3) << -1,-2,-1,0,0,0,1,2,1);
	filter2D(src, dst4, -1, ky2, Point(-1, -1), 0.0);

	imshow("SobelX", dst3);
	imshow("SobelY", dst4);


	//拉普拉斯算子
	Mat ky3 = (Mat_<int>(3, 3) << 0,-1,0,-1,4,-1,0,-1,0);
	filter2D(src, dst5, -1, ky3, Point(-1, -1), 0.0);

	imshow("拉普拉斯", dst5);

	//自定义算子
	int c = 0;
	int index = 0;
	int ksize = 3;
	while (true) {
		c = waitKey(500);
		if ((char)c == 27) { //ESC键
			break;
		}
		ksize = 4 + (index % 5) * 2 + 1;
		//Mat m = Mat::ones(2, 2, CV_8UC3); 相当于:Mat m = Mat(2, 2, CV_8UC3, 1);
		Mat kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);
		filter2D(src, dst6, - 1, kernel, Point(-1, -1));
		index++;
		imshow("custom", dst6);
	}

	waitKey(0);
	return 0;
}



image.png

(分别为:原图、Robert X方向, Robert Y方向)


image.png

(分别为:原图、Sobel X方向,Sobel Y方向)


image.png

(分别为:原图、拉普拉斯算子)


代码解释:


卷积概念

卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。

Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)

image.png

卷积如何工作

把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。数学表达如下:

image.png

image.png

Sum = 8x1+6x1+6x1+2x1+8x1+6x1+2x1+2x1+8x1

New pixel = sum / (m*n)

image.png

常见算子

image.png

(Robert算子  左边为X方向,右边为Y方向)


image.png

(Sobel算子)


image.png

(拉普拉斯算子)


自定义卷积模糊

filter2D方法filter2D(

Mat src, //输入图像

Mat dst, // 模糊图像

int depth, // 图像深度32/8

Mat kernel, // 卷积核/模板

Point anchor, // 锚点位置

double delta // 计算出来的像素+delta

)

其中 kernel是可以自定义的卷积核

image.png



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文章代码及资料部分或全部来自贾志刚老师的视频,勇哥只是在个人理解的基础上做学习笔记,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864