大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

所有文章
大宇私人伊甸园: 首页 > 所有文章 > 编程人生 > 开源库 > opencv > [001.09]均值滤波和高斯滤波的图片模糊化处理

[001.09]均值滤波和高斯滤波的图片模糊化处理

发布时间:2018/07/13 opencv 标签opencv均值高斯阅读:27

均值滤波和高斯滤波的图片模糊化处理

  • 模糊原理
  • 代码演示

模糊原理:

  • Smooth/Blur 是图像处理中最简单和常用的操作之一
  • 使用该操作的原因之一就为了给图像预处理时候减低噪声
  • 使用Smooth/Blur操作其背后是数学的卷积计算

通常这些卷积算子计算都是线性操作,所以又叫线性滤波

假设有6×6的图像像素点矩阵。

卷积过程:6×6上面是个3×3的窗口,从左向右,从上向下移动,黄色的每个像个像素点值之和取平均值赋给中心红色像素作为它卷积处理之后新的像素值。

每次移动一个像素格。

模糊原理:

归一化盒子滤波(均值滤波):

高斯滤波:

相关API:

均值模糊:

blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));

高斯模糊:

GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);

其中Size(x, y), x, y 必须是正数而且是奇数

演示代码:

高斯和均值的区别:

均值滤波就是对模板对应的图像像素求均值然后赋值给模板中心对应的那个像素值。
高斯滤波模板是二维高斯函数的离散化表示,高斯函数就是我们熟悉的正态分布。
所以可以知道模板是中心值大,而越往外越小,高斯模板就是按照高斯函数递减的模板。
如果把模板小矩阵的每一个元素视为一个权值的话,均值滤波就是所有元素权值相等,高斯滤波就是中心点权值最大,越往外所占越小。
比平均滤波的好处是可以突出重点。
也就是高斯能更突出对边缘化的保留。

实例:

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

using namespace std;
using namespace cv;

int main() {
	Mat src = imread("d:/test.jpg");
	if (!src.data) {
		printf("error form open image");
		return -1;
	}
	namedWindow("src image",CV_WINDOW_AUTOSIZE);
	namedWindow("out image",CV_WINDOW_AUTOSIZE);
	namedWindow("gaos image", CV_WINDOW_AUTOSIZE);
	Mat dst = cv::Mat(src.size(),src.type());
	Mat gaos = cv::Mat(src.size(), src.type());;
	blur(src,dst,Size(5,5),Point(-1,-1));
	GaussianBlur(src,gaos,Size(5,5),11,11);
	imshow("src image",src);
	imshow("out image",dst);
	imshow("gaos image", dst);
	waitKey(0);
	return true;
}

因为我同事照片的原因有点不清楚,下回换个清楚点的。

先用百度下载下来的一个照片试试。

好像也不是看得出原图-》均值-》高斯模糊之间的区别,感觉我前面的原理都不合实际

不要急,我们将前面卷积子大小调整大一点:11或者13就能看到下面的结果了,记住,使用单数。

(为什么使用单数的原因我就不讲了,自己回家复习高数去吧)

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

using namespace std;
using namespace cv;

int main() {
	Mat src = imread("d:/test.jpg");
	if (!src.data) {
		printf("error form open image");
		return -1;
	}
	namedWindow("src image",CV_WINDOW_AUTOSIZE);
	namedWindow("out image",CV_WINDOW_AUTOSIZE);
	namedWindow("gaos image", CV_WINDOW_AUTOSIZE);
	Mat dst = cv::Mat(src.size(),src.type());
	Mat gaos = cv::Mat(src.size(), src.type());;
	blur(src,dst,Size(11,11),Point(-1,-1));
	GaussianBlur(src,gaos,Size(11,11),11,11);
	imshow("src image",src);
	imshow("out image",dst);
	imshow("gaos image", dst);
	waitKey(0);
	return true;
}

同样的卷积子size,高斯模糊轮廓是不是保留的更明显一点?不要告诉我你还看不出来。那我就没办法了。

The bottom line, for me, is simple.

Let’s hope it doesn’t take 500 years for a discipline of testing to becomes the standard for software developers.

From:dayu

您好!请登录

合作网站快捷登录:
点击取消回复

已有1评论

    大宇博客

    点击这里给我发消息点击这里给我发消息