数字图像处理-图像滤波(1)-均值滤波

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作。在进行图像算法前,对图像进行滤波预处理往往会带来更好的效果。

大家在用美图秀秀美颜皮肤时是否想过其中的工作原理,或者在Photoshop中是否使用过模糊这个功能?这其中都应用到了图像滤波的原理。

图像滤波原理很简单,掌握了其中的卷积操作,也会对卷积神经网络的学习有一定帮助。

滤波有很多类型,包括线性滤波和非线性滤波,今天主要介绍线性滤波中的均值滤波。


均值滤波(Mean filter)

先看一组滤波前后的对比图片,左图为原图像,右图为进行均值滤波操作后的图像,

可以直观的感觉到经过均值滤波操作后的图像变得更模糊,这也就达到了噪声抑制的目的。


平均值滤镜是一个简单的滑动窗口空间滤镜,它用窗口中所有像素值的平均值(均值)代替了窗口中的中心值。窗口或内核通常是正方形,但也可以是任何形状。

均值滤波器在目标图像中滑动(卷积),用卷积核窗口中所有像素值的平均值替换目标像素值,卷积核一般是正方形,但也可以是任意形状,下图显示了N*N均值滤波卷积核:

均值滤波卷积核如下:

M=\frac{1}{\alpha }\begin{bmatrix} 1 & 1 &... &1 &1 \\ & & ... & & \\ 1 & 1 & ... & 1 & 1\\ 1 & 1 & ... & 1 & 1\\ \end{bmatrix}

α代表了卷积核中点的个数(N*N个)

看不懂?没关系,看下面例子中的操作:

设一张5*5像素图中,3*3卷积核滑动灰色窗口,则黑色像素的值为:

\frac{1}{9}*(99+45+36+46+58+79+5+46+9)=47

对所有点进行此类均值滤波操作即可得到最后的模糊图像。

均值滤波优缺点

均值滤波有操作简单,效率高,易于实现的优点可以得到物体特征的粗略描述。

但它本身却存在固有的缺陷:

均值滤波不能很好地保护图像细节,在给图像去噪的同时也破坏了图像细节部分丢失图像特征信息,想象一下用美图秀秀美颜时不光把皮肤瑕疵美化,还把眉毛去掉了是种什么样的体验???

而且均值滤波不能很好的去除噪声点,尤其是椒盐噪声。

在计算均值滤波时,同样可以利用积分图等方法进行预处理,可以通过O(1)时间复杂度获取像素和,使图像处理速度大大加快。

 

数字图像处理中还有许多其他种类的滤波器,会在接下来的文章中介绍。

 

 

  • 15
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是纯Java实现的算数均值滤波器代码,可以用于数字图像处理中的降噪和模糊处理: ``` public static BufferedImage arithmeticMeanFilter(BufferedImage image, int filterSize) { int width = image.getWidth(); int height = image.getHeight(); int[][] pixels = new int[width][height]; int[][] resultPixels = new int[width][height]; int filterRadius = filterSize / 2; int filterArea = filterSize * filterSize; // 将图像像素存储到二维数组中 for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { pixels[x][y] = image.getRGB(x, y) & 0xff; } } // 对每个像素进行均值滤波 for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int sum = 0; for (int i = -filterRadius; i <= filterRadius; i++) { for (int j = -filterRadius; j <= filterRadius; j++) { int px = Math.min(Math.max(x + i, 0), width - 1); int py = Math.min(Math.max(y + j, 0), height - 1); sum += pixels[px][py]; } } resultPixels[x][y] = sum / filterArea; } } // 将处理后的像素存储到新的BufferedImage中 BufferedImage resultImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { resultImage.setRGB(x, y, resultPixels[x][y] << 16 | resultPixels[x][y] << 8 | resultPixels[x][y]); } } return resultImage; } ``` 其中,`image`为输入的原始图像,`filterSize`为滤波器的大小,返回值为处理后的图像。该算法使用了算数均值滤波器,对于每个像素,计算其周围滤波器大小范围内的像素值的平均值,并将结果作为该像素的新值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值