3 图像的平滑处理

3.1 图像处理介绍

图像处理(image processing)又称为影像处理,是用计算机对图像进行达到所需结果的技术。起源于20 世纪 20 年代,一般为数字图像处理。图像处理技术的主要内容包括图像压缩、增强复原、匹配描述识别 3 个部分,常见的处理有图像数字化、图像编码、图像增强、图像复原、图像分割和图像分析等。图像处理是利用计算机对图像信息进行加工以满足人的视觉心理或者应用需求的行为,应用广泛,多用于测绘
学、大气科学、天文学、美图、使图像提高辨识等。关于图像的编码和压缩,本次实验不做解释。

3.2 图像的模糊

图片的模糊,一直是图像处理领域一个比较重要的东西,它的用处不仅仅是我们平时 PS 的滤镜,也常常被用来做图片数据的降噪,图片的有损压缩,和图片特征相似匹配等的优化工作。图像的模糊操作是对我们的图像应用过滤器。最常见的滤波器类型是线性的,其中输出像素的值(i.e. g(i,j))被确定为输入像素值的加权和 (i.e. f(i+k,j+l)) 。
在这里插入图片描述
在图像处理中,这个滤波器是最简单的,每个输出像素是其邻居的均值。

高斯滤波器可能是图像处理中最有用的过滤器(虽然不是最快的)。它是通过将输入数组中的每个点与高斯核进行卷积来完成的,然后将它们相加而产生输出的数组。如图 2.4.2 所示,就是为了使图像更清晰,一维的高斯卷积模型。二维、三维的相对来说更复杂,但他们具有通用的操作:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

图像大多数噪声均属于高斯噪声,因此高斯滤波器应用也较广泛。高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像去噪。可以简单地理解为,高斯滤波去噪就是对整幅图像像素值进行加权平均,针对每一个像素点的值,都由其本身值和邻域内的其他像素值经过加权平均后得到。

中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。

在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪。中值滤波是图像处理中的一个常用步骤,它对于斑点噪声(speckle noise)和椒盐噪声(salt-and-pepper noise)来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。

中值滤波器的主要思想是通过入口来遍历信号入口,用邻居入口的中值替换每个入口。邻居的模式被称为“窗口”,它通过入口滑动(滑窗思想),覆盖整个信号。对于一维信号,最明显的窗口只是前后几项,而 2D(或更高维)信号(如图像)则可能有更复杂的窗口模式(如“盒子”或“十字”模式)。请注意,如果窗口中有奇数个条目,则中位数很容易定义:在窗口中的所有条目都按数字排序之后,这只是中间值。对
于偶数的条目,有不止一个可能的中位数。

3.3 常见OpenCV 的图像处理原理函数

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

blur 为均值模糊接口,参数 src 是源图像,参数 dst 是目标图像,参数 Size(xradius,yradius)是均值窗口的大小,参数 Point(-1,-1)是中心点,(-1,-1)默认就是最中心的点。

GaussianBlur(Mat src,Mat dst,Size(x,y),sigmax,sigmay);

GaussianBlur 为高斯模糊接口,其中 Size(x,y), x,y 必须是整数且必须是奇数。Size 和 blur 一样,后面的sigma x 和 sigma y,符合高斯分布的 sigma 特性。

medianBlur(Mat src,Mat dest,ksize) 

medianBlur 为中值滤波,ksize 为中值滤波的窗口大小。

bilateralFilter(src,dest,d,sigmac,sigmas)

bilateralFilter 为双边滤波,d 为计算的半径,在 d 以内的像素点会被纳入计算,如果 d=-1,则根据 sigmas 参数取值进行处理。Sigmac 决定多少差值之内的像素点会被计算。Sigmas 和 d 的值有关,如果 d 大于0,该值无效,如果小于 0,则根据 sigmas 来计算 d 的值。

3.4 应用代码

3.4.1 模糊案例

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main (int argc,char **argv)
{
	Mat src = imread("cyq.jpg",1);
	if(src.empty())
	{
	cout << "Could not load image.."<<endl;
	return -1;
	}
	Mat image1,image2,image3;
	blur(src,image1,Size(3,3),Point(-1,-1));
	blur(src,image2,Size(29,1),Point(-1,-1));
	blur(src,image3,Size(1,20),Point(-1,-1));
	imshow("input",src);
	imshow("output1",image1);
	imshow("output2",image2);
	imshow("output3",image3);
	waitKey(0);
	return 0;
}

这部分代码很简单,使用 mat 将图像信息装起来,然后调用 OpenCV 提供的 blur 接口进行模糊,通过调整 Size 参数来看看均值滤波的效果。第一次调用 Size(3,3),表示卷积算子的大小为 3*3,这个值是可以随意改变的,但必须是正数,后面的 Point 表示采用卷积算子的中心点为计算结果。后面将 size 中的参数改变,例如 Size(29,1)是 x 方向的模糊,因为我们平时看到的移动都是相对于地面的,所以转换出来的图像像是瞬间移动了;Size(1,20)是在 y 方向的模糊,看起来像是向上跳跃的感觉。

在这里插入图片描述

3.4.2 高斯滤波

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main (int argc,char **argv)
{
	 Mat src = imread("cyq.jpg",1);
	 if(src.empty())
	 {
		 cout << "Could not load image.."<<endl;
		 return -1;
	 }
	 Mat image1,image2,image3;
	 GaussianBlur(src,image1,Size(3,3),10,10);
	 GaussianBlur(src,image2,Size(29,1),10,10);
	 GaussianBlur(src,image3,Size(1,21),10,10);
	 imshow("input",src);
	 imshow("output1",image1);
	 imshow("output2",image2);
	 imshow("output3",image3);
	 waitKey(0);
	 return 0;
}

在这里插入图片描述

3.3.3 中值滤波

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main (int argc,char **argv)
{
	 Mat src = imread("nn.png",1);
	 if(src.empty())
	 {
		 cout << "Could not load image.."<<endl;
		 return -1;
	 }
		 Mat dst;
		 medianBlur(src,dst,3);
		 imshow("input",src);
		 imshow("output",dst);
		 waitKey(0);
		 return 0;
}

在这里插入图片描述

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部