高斯滤波笔记(一)

高斯滤波(一)

简单介绍下刚刚看的高斯滤波。

一 在学习高斯滤波前要先了解相关数学背景-----一维高斯分布、二维高斯分布。
在这里插入图片描述
二维正态分布在这里插入图片描述在高斯滤波中用二维正态分布,并且其中心值取(0,0) 结合紧密程度的参数p取0。如图。

在这里插入图片描述

二 首先,高斯滤波主要是一种线性(对原有图像上进行线性运算)平滑(取平均值)滤波。高斯滤波主要是为了消除噪声,提取特征,对高斯噪声有较好的效果。
高斯噪声: 就是它的概率密度函数服从高斯分布(即正态分布)的一类噪声。

三 高斯滤波步骤:
第一步,求出高斯核(高斯模板、掩膜),就是取一个窗口利用二维高斯分布计算不同位置的值,这里由于取中心为零坐标点所以该值只与标准差有关。计算出结果后由于高斯分布的特性,相加应为1,所以要进行归一化即分别除以权重和得出结果即为高斯模板。

第二步,将输入图像像素值,乘以模板(权重),然后再把总点数相加作为输出像素值,之后求出每个像素值。
简单来说就是根据高斯分布得到高斯模板然后做卷积相加的一个过程

举例:
第一步:
假定中心点的坐标是(0,0),那么取距离它最近的8个点坐标,为了计算,需要设定σ的值。假定σ=1.5,则模糊半径为1的高斯模板就算如下
在这里插入图片描述
这个时候我们我们还要确保这九个点加起来为1(这个是高斯模板的特性),这9个点的权重总和等于0.4787147,因此上面9个值还要分别除以0.4787147,得到最终的高斯模板。
在这里插入图片描述
第二步:
有了高斯模板,那么高斯滤波的计算便顺风顺水了。假设现有9个像素点,灰度值(0-255)的高斯滤波计算如下:
在这里插入图片描述
将这9个值加起来,就是中心点的高斯滤波的值。对所有点重复这个过程,就得到了高斯模糊后的图像。

四 心得:为啥要用高斯分布的方法进行滤波呢?
正常滤波的方法是去周围像素的平均值,取值范围越大图像越平滑,但是不同位置的权重也不相同,一般来说越靠近该点的权重越大反之则越小,这个特征符合高斯分布,又因为图像是二维的所以选用二维高斯分布来对图像进行处理。在进行求取模板时,取中心为原点(即标准正态分布)方差决定了图像的高度,方差越大图像越高越窄,靠近中心权重越大。选取合适的方差(我也不知道怎么选),求出高斯核在进行卷积求和输出。

在这里插入图片描述

在数字图像处理中,图像滤波是非常常见的一种操作。而均值滤波和高斯滤波是最常见的滤波算法之一。下面我们就来介绍一下均值滤波和高斯滤波的原理和实现。 ## 1. 均值滤波 均值滤波是最简单的一种线性滤波算法。其原理是对图像中每个像素点的邻域像素进行平均值操作,以达到去除噪声的目的。均值滤波的模板可以是任意大小的,通常使用 3×3 或 5×5 的模板。 ### 1.1 均值滤波原理 均值滤波的原理是将图像中每个像素点的邻域像素值进行平均,然后将该平均值作为当前像素点的像素值。均值滤波可以消除图像中的噪声,但是也会导致图像的模糊。 ### 1.2 均值滤波实现 均值滤波的实现非常简单,只需要对每个像素点的邻域像素值进行求和,然后再除以邻域像素的数量即可。具体步骤如下: 1. 定义一个与原图像大小相同的新图像。 2. 对每个像素点的邻域像素进行求和,然后求平均值。 3. 将平均值作为当前像素点的像素值,赋值给新图像。 代码实现如下: ```java public static BufferedImage meanFilter(BufferedImage img, int size) { int width = img.getWidth(); int height = img.getHeight(); int half = size / 2; BufferedImage result = new BufferedImage(width, height, img.getType()); for (int i = half; i < height - half; i++) { for (int j = half; j < width - half; j++) { int sum = 0; for (int k = -half; k <= half; k++) { for (int l = -half; l <= half; l++) { sum += new Color(img.getRGB(j + l, i + k)).getRed(); } } int value = sum / (size * size); result.setRGB(j, i, new Color(value, value, value).getRGB()); } } return result; } ``` 其中,size 为模板大小。 ## 2. 高斯滤波 高斯滤波是一种线性平滑滤波算法,与均值滤波不同的是,它使用的是高斯核函数。高斯核函数可以减小图像中噪声的影响,同时也不会使图像过度模糊。 ### 2.1 高斯滤波原理 高斯滤波的原理是利用高斯函数的特性,对图像中每个像素点的邻域像素值进行加权平均,以达到去除噪声的目的。高斯滤波也可以消除图像中的噪声,同时保留更多的图像细节。 ### 2.2 高斯滤波实现 高斯滤波的实现需要先生成一个高斯核,然后对每个像素点的邻域像素进行加权平均。具体步骤如下: 1. 定义一个与原图像大小相同的新图像。 2. 生成一个高斯核。 3. 对每个像素点的邻域像素进行加权平均,然后将加权平均值作为当前像素点的像素值,赋值给新图像。 代码实现如下: ```java public static BufferedImage gaussianFilter(BufferedImage img, int size, double sigma) { int width = img.getWidth(); int height = img.getHeight(); int half = size / 2; double[][] kernel = gaussianKernel(size, sigma); BufferedImage result = new BufferedImage(width, height, img.getType()); for (int i = half; i < height - half; i++) { for (int j = half; j < width - half; j++) { double sum = 0; for (int k = -half; k <= half; k++) { for (int l = -half; l <= half; l++) { int pixel = new Color(img.getRGB(j + l, i + k)).getRed(); sum += kernel[k + half][l + half] * pixel; } } int value = (int) Math.round(sum); value = Math.min(255, Math.max(0, value)); result.setRGB(j, i, new Color(value, value, value).getRGB()); } } return result; } ``` 其中,size 为高斯核大小,sigma 为高斯核标准差。 高斯核函数的生成可以使用以下代码: ```java public static double[][] gaussianKernel(int size, double sigma) { double[][] kernel = new double[size][size]; double sum = 0; int half = size / 2; for (int i = -half; i <= half; i++) { for (int j = -half; j <= half; j++) { kernel[i + half][j + half] = Math.exp(-(i * i + j * j) / (2 * sigma * sigma)); sum += kernel[i + half][j + half]; } } for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { kernel[i][j] /= sum; } } return kernel; } ``` 以上就是均值滤波和高斯滤波的原理和实现。需要注意的是,滤波操作会导致图像的模糊,因此在使用滤波算法时需要根据具体应用场景选择合适的滤波方法和参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值