设为首页收藏本站 |天气与日历| 2025-08-23 星期六 07:06:00 乙巳(蛇)年 七月初一 辰时 处暑
     
切换到窄版

私人站点

 找回密码
 立即注册
搜索
查看: 184|回复: 0

自定义线性滤波

[复制链接]

954

主题

954

帖子

3879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3879
发表于 2022-3-1 11:38:00 | 显示全部楼层 |阅读模式
卷积概念
常见算子
自定义卷积模糊



卷积概念
卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。
Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)
11.png

卷积如何工作

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

22.png

999.png

33.png
Sum = 8x1+6x1+6x1+2x1+8x1+6x1+2x1+2x1+8x1
New pixel = sum / (m*n)

44.png


卷积核 也称算子
常见算子:




Robert算子:

s1.png


Sobel算子:

s2.png



拉普拉斯算子:

s3.png



[C++] 纯文本查看 复制代码
/*
注意:
常见算子的应用
filter2D方法filter2D(
Mat src, //输入图像
Mat dst, // 模糊图像
int depth, // 图像深度32/8
Mat kernel, // 卷积核/模板
Point anchor, // 锚点位置
double delta // 计算出来的像素+delta
)
其中 kernel是可以自定义的卷积核

*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
        Mat src, dst;
        src = imread("D:/IDE/opencv-3.1.0/demo.jpg");
        if (!src.data) {
                printf("加载图片异常\n");
                return -1;
        }
        namedWindow("input", CV_WINDOW_AUTOSIZE);
        imshow("input", src);

        //Robert算子演示---------------------------------------
        //定义Robert算子_X方向
        Mat kernel_x = (Mat_<int>(2, 2) << 
                1, 0, 
                0, -1);
        //定义Robert算子_Y方向
        Mat kernel_y = (Mat_<int>(2, 2) <<
                0, 1,
                -1, 0);

        //掩模卷积计算
        filter2D(src, dst, -1, kernel_x, Point(-1, -1),0.0);
        imshow("Robert算子_x", dst);
        filter2D(src, dst, -1, kernel_y, Point(-1, -1), 0.0);
        imshow("Robert算子_y", dst);

        //Sobel算子演示---------------------------------------
        kernel_x = (Mat_<int>(3, 3) <<
                -1,0,1,
                -2,0,2,
                -1,0,1
                );
        kernel_x = (Mat_<int>(3, 3) <<
                -1,-2,-1,
                0,0,0,
                1,2,1
                );
        filter2D(src, dst, -1, kernel_x, Point(-1, -1), 0.0);
        imshow("Sobel算子_x", dst);
        filter2D(src, dst, -1, kernel_y, Point(-1, -1), 0.0);
        imshow("Sobel算子_y", dst);

        //拉普拉斯算子演示---------------------------------------
        Mat kernel = (Mat_<int>(3, 3) <<
                0,-1,0,
                -1,4,-1,
                0,-1,0
                );
        filter2D(src, dst, -1, kernel, Point(-1, -1), 0.0);
        imshow("拉普拉斯算子_x", dst);





        waitKey(0);
        return 0;
}



3232.jpg


[C++] 纯文本查看 复制代码
/*
注意:
程序自动循环_模糊的案列:
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/IDE/opencv-3.1.0/demo.jpg");
	if (!src.data) {
		printf("加载图片异常\n");
		return -1;
	}
	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src);

	int c = 0;
	int index = 0;
	int ksize = 3;
	while (true)
	{
		c = waitKey(100);
		//如果按下ESC键  退出循环
		if ((char)c==27)
		{
			break;
		}
		ksize = 4 + (index % 10) * 2 + 1;
		Mat kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);
		filter2D(src, dst, -1, kernel, Point(-1, -1 ));
		index++;
		imshow("程序循环_模糊", dst);



	}

	waitKey(0);
	return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|编程站点 ( 冀ICP备2023028127号-2 )|友链申请|

GMT+8, 2025-8-23 07:06 , Processed in 0.089119 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表