均值滤波,中值滤波,最大最小值滤波

http://blog.csdn.net/fastbox/article/details/7984721

讨论如何使用卷积作为数学工具来处理图像,实现图像的滤波,其方法包含以下几种,均值

滤波,中值滤波,最大最小值滤波,关于什么是卷积以及理解卷积在图像处理中作用参见这

里–http://blog.csdn.net/jia20003/article/details/7038938

均值滤波:

均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高

频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均

值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。采样Kernel数

据通常是3X3的矩阵,如下表示:

从左到右从上到下计算图像中的每个像素,最终得到处理后的图像。均值滤波可以加上两个

参数,即迭代次数,Kernel数据大小。一个相同的Kernel,但是多次迭代就会效果越来越好。

同样,迭代次数相同,Kernel矩阵越大,均值滤波的效果就越明显。

中值滤波

中值滤波也是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波的效果要比

均值滤波更好。中值滤波是跟均值滤波唯一不同是,不是用均值来替换中心每个像素,而是

将周围像素和中心像素排序以后,取中值,一个3X3大小的中值滤波如下:

最大最小值滤波

最大最小值滤波是一种比较保守的图像处理手段,与中值滤波类似,首先要排序周围像素和

中心像素值,然后将中心像素值与最小和最大像素值比较,如果比最小值小,则替换中心像

素为最小值,如果中心像素比最大值大,则替换中心像素为最大值。一个Kernel矩阵为3X3的最大最小值滤波如下:

原图如下:

分别实现中值和均值滤波以后效果如下:

代码就不解释了,原理已经解释得很清楚了,全部算法源代码都是基于Java

特别说明一点的是,均值滤波对于高斯噪声的效果比较好,中值滤波对于椒盐噪声的效果比较好

想必大家从上面效果比较中也可以看到一点端倪。因为我选择的噪声图片是椒盐噪声的,哈哈

自己读吧,不解释了,有问题的可以问,源代码如下:

[java] view plaincopy

  1. package com.process.blur.study;
  2. import java.awt.image.BufferedImage;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. public class SmoothFilter extends AbstractBufferedImageOp {
  6. public final static int MEAN_FILTER_TYPE = 1;
  7. public final static int MEADIAN_FILTER_TYPE = 2;
  8. public final static int MIN_MAX_FILTER_TYPE = 4;
  9. private int repeats = 3; // default 1
  10. private int kernel_size = 3; // default 3
  11. private int type = 1; // default mean type
  12. public int getRepeat() {
  13. return repeats;
  14. }
  15. public void setRepeat(int repeat) {
  16. this.repeats = repeat;
  17. }
  18. public int getKernelSize() {
  19. return kernel_size;
  20. }
  21. public void setKernelSize(int kernelSize) {
  22. this.kernel_size = kernelSize;
  23. }
  24. public int getType() {
  25. return type;
  26. }
  27. public void setType(int type) {
  28. this.type = type;
  29. }
  30. @Override
  31. public BufferedImage filter(BufferedImage src, BufferedImage dest) {
  32. int width = src.getWidth();
  33. int height = src.getHeight();
  34. if ( dest == null )
  35. dest = createCompatibleDestImage( src, null );
  36. int[] inPixels = new int[width*height];
  37. int[] outPixels = new int[width*height];
  38. getRGB( src, 0, 0, width, height, inPixels );
  39. // pick up one filter from here!!!
  40. if(this.type == MEAN_FILTER_TYPE)
  41. {
  42. for(int i=0; i<repeats; i++) {
  43. performMeanFilter(width, height, inPixels, outPixels);
  44. System.arraycopy(outPixels, 0, inPixels, 0, inPixels.length);
  45. }
  46. }
  47. else if(this.type == MEADIAN_FILTER_TYPE)
  48. {
  49. performMedianFilter(width, height, inPixels, outPixels);
  50. }
  51. else if(this.type == MIN_MAX_FILTER_TYPE)
  52. {
  53. performMinMaxFilter(width, height, inPixels, outPixels);
  54. }
  55. // return result
  56. setRGB( dest, 0, 0, width, height, outPixels );
  57. return dest;
  58. }
  59. /**
  60. *  <p> perform convolution filter </p>
  61. *
  62. * @param width
  63. * @param height
  64. * @param inPixels
  65. * @param outPixels
  66. */
  67. public void performMeanFilter(int width, int height, int[] inPixels, int[] outPixels) {
  68. int rows2 = kernel_size/2;
  69. int cols2 = kernel_size/2;
  70. int index = 0;
  71. int index2 = 0;
  72. float total = kernel_size * kernel_size;
  73. for (int y = 0; y < height; y++) {
  74. for (int x = 0; x < width; x++) {
  75. float r = 0, g = 0, b = 0, a = 0;
  76. for (int row = -rows2; row <= rows2; row++) {
  77. int rowoffset = y + row;
  78. if(rowoffset < 0 || rowoffset >=height) {
  79. rowoffset = y;
  80. }
  81. //System.out.println("rowoffset == " + rowoffset);
  82. for(int col = -cols2; col <= cols2; col++) {
  83. int coloffset = col + x;
  84. if(coloffset < 0 || coloffset >= width) {
  85. coloffset = x;
  86. }
  87. index2 = rowoffset * width + coloffset;
  88. int rgb = inPixels[index2];
  89. a += ((rgb >> 24) & 0xff);
  90. r += ((rgb >> 16) & 0xff);
  91. g += ((rgb >> 8) & 0xff);
  92. b += (rgb & 0xff);
  93. }
  94. }
  95. int ia = 0xff;
  96. int ir = clamp((int)(r/total));
  97. int ig = clamp((int)(g/total));
  98. int ib = clamp((int)(b/total));
  99. outPixels[index++] = (ia << 24) | (ir << 16) | (ig << 8) | ib;
  100. }
  101. }
  102. }
  103. /**
  104. *  <p> perform median filter </p>
  105. *
  106. * @param width
  107. * @param height
  108. * @param src
  109. * @param inPixels
  110. * @param outPixels
  111. */
  112. public void performMedianFilter(int width, int height, int[] inPixels, int[] outPixels) {
  113. int rows2 = kernel_size/2;
  114. int cols2 = kernel_size/2;
  115. int index = 0;
  116. int index2 = 0;
  117. float total = kernel_size * kernel_size;
  118. int[] matrix = new int[(int)total];
  119. for (int y = 0; y < height; y++) {
  120. for (int x = 0; x < width; x++) {
  121. int count = 0;
  122. for (int row = -rows2; row <= rows2; row++) {
  123. int rowoffset = y + row;
  124. if(rowoffset < 0 || rowoffset >=height) {
  125. rowoffset = y;
  126. }
  127. for(int col = -cols2; col <= cols2; col++) {
  128. int coloffset = col + x;
  129. if(coloffset < 0 || coloffset >= width) {
  130. coloffset = x;
  131. }
  132. index2 = rowoffset * width + coloffset;
  133. int rgb = inPixels[index2];
  134. matrix[count] = rgb;
  135. count++;
  136. }
  137. }
  138. Arrays.sort(matrix);
  139. int ia = 0xff;
  140. int ir = ((matrix[count/2] >> 16) & 0xff);
  141. int ig = ((matrix[count/2] >> 8) & 0xff);
  142. int ib = (matrix[count/2] & 0xff);
  143. outPixels[index++] = (ia << 24) | (ir << 16) | (ig << 8) | ib;
  144. }
  145. }
  146. }
  147. /**
  148. * <p> perform min/max pixel filter </p>
  149. *
  150. * @param width
  151. * @param height
  152. * @param src
  153. * @param inPixels
  154. * @param outPixels
  155. */
  156. public void performMinMaxFilter(int width, int height, int[] inPixels, int[] outPixels) {
  157. int rows2 = kernel_size/2;
  158. int cols2 = kernel_size/2;
  159. int index = 0;
  160. int index2 = 0;
  161. float total = kernel_size * kernel_size;
  162. int[] matrix = new int[(int)total];
  163. for (int y = 0; y < height; y++) {
  164. for (int x = 0; x < width; x++) {
  165. int count = 0;
  166. for (int row = -rows2; row <= rows2; row++) {
  167. int rowoffset = y + row;
  168. if(rowoffset < 0 || rowoffset >=height) {
  169. rowoffset = y;
  170. }
  171. for(int col = -cols2; col <= cols2; col++) {
  172. int coloffset = col + x;
  173. if(coloffset < 0 || coloffset >= width) {
  174. coloffset = x;
  175. }
  176. index2 = rowoffset * width + coloffset;
  177. int rgb = inPixels[index2];
  178. matrix[count] = rgb;
  179. count++;
  180. }
  181. }
  182. int ia = 0xff;
  183. int oldPixel = matrix[count/2];
  184. int targetRGB = findNewPixel(matrix, oldPixel);
  185. int ir = ((targetRGB >> 16) & 0xff);
  186. int ig = ((targetRGB >> 8) & 0xff);
  187. int ib = (targetRGB & 0xff);
  188. outPixels[index++] = (ia << 24) | (ir << 16) | (ig << 8) | ib;
  189. }
  190. }
  191. }
  192. private int findNewPixel(int[] matrix, int oldPixel) {
  193. ArrayList<Integer> list = new ArrayList<Integer>();
  194. for(int i=0; i<matrix.length; i++) {
  195. if(matrix[i] == oldPixel)
  196. continue;
  197. list.add(matrix[i]);
  198. }
  199. int[] filterData = new int[list.size()];
  200. int index = 0;
  201. for(Integer rgb : list) {
  202. filterData[index++] = rgb;
  203. }
  204. Arrays.sort(filterData);
  205. if(filterData.length == 0)
  206. return oldPixel;
  207. return (oldPixel > filterData[0]) ? filterData[0] : (oldPixel < filterData[filterData.length -1])? filterData[filterData.length -1] : oldPixel;
  208. }
  209. public static int clamp(int c) {
  210. if (c < 0)
  211. return 0;
  212. if (c > 255)
  213. return 255;
  214. return c;
  215. }
  216. }

[java] view plain copy

时间: 2024-08-26 04:20:17

均值滤波,中值滤波,最大最小值滤波的相关文章

opencv3 图片模糊操作-均值滤波 高斯滤波 中值滤波 双边滤波

#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; //均值滤波模糊处理int demo_blur(){ char win1[] = "window1"; char win2[] = "window2"; Mat img1, img2; img1 = imread("D://images//4.jpg&quo

VC++高斯滤波\中值滤波实现图像模糊处理

一.算法 高斯模糊算法 详见:高斯模糊,基本思想就是利用高斯函数,将一个坐标点的所有邻域的加权平均值设置为这些点的颜色值. 中值滤波算法就更简单了:将一个坐标点的所有邻域的平均值设置为这些点的像素值. 二.算法的代码实现 高斯函数: 使用宏定义来替换: #define PI<span style="white-space:pre"> </span>3.1415926 //高斯模糊函数 #define GAUSS_FUN(x, y) (exp(-(x*x)/(do

【opencv学习笔记1】5种图像滤波辨析:方框、均值、高斯、中值、双边

图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性. 图像滤波的目的 a.消除图像中混入的噪声 b.为图像识别抽取出图像特征 图像滤波的要求 a.不能损坏图像轮廓及边缘 b.图像视觉效果应当更好 滤波器的定义 滤波器,顾名思义,是对波进行过滤的器件.(摘自网络) 以上的定义是针对物理器件的,但对于图像滤波而言显然也是适用的. 大家都用过放大镜,这里就以此举一个例

【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边

图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性.(摘自网络) 图像滤波的目的 1,消除图像中混入的噪声 2,为图像识别抽取出图像特征 图像滤波的要求 1,不能损坏图像轮廓及边缘 2,图像视觉效果应当更好 滤波器的定义 滤波器,顾名思义,是对波进行过滤的器件.(摘自网络) 以上的定义是针对物理器件的,但对于图像滤波而言显然也是适用的. 大家都用过放大镜,这里就

图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现

图像平滑是指直接对源图像的每个像素数据做邻域运算以达到平滑图像的目的.实质上主要就是通达卷积核算子实现的,卷积核算子的相关知识大家可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51691410 图像平滑也称为模糊或滤波,是图像处理中常用的技术之一,进行平滑处理时需要用到滤波器核(其实就是卷积核算子),根据滤波器核函数来实现不同的滤波技术.下面介绍几种 常用的图像平滑方法的大概原理及OpenCV下的实现代码. 一.盒滤波(均值滤波)

java实现中值滤波均值滤波拉普拉斯滤波

目录 来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程 均值滤波 中值滤波 拉普拉斯滤波 Sobel滤波 注意 来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程 均值滤波 均值滤波的实现很简单,把滤波器的各个像素点相加在取平均就可以了. public static int getAVEcolor(int x,int y,BufferedImage bi) { int color=0; int r=0,g=0,b=0; for(int i=x-1;i<=x+1;i++) for

中值滤波与图像锐化

本文主要包括以下内容 中值滤波及其改进算法 图像锐化, 包括梯度算子.拉普拉斯算子.高提升滤波和高斯-拉普拉斯变换 本章的典型囊例分析 对椒盐噪声的平滑效果比较 Laplacian与LoG算子的锐化效果比较 中值滤波 中值滤波本质上是一种统计排序滤波器. 对于原图像中某点(i,j), 中值滤波以该点为中 心的邻域内的所有像素的统计排序中值作为(i, j) 点的响应. 中值不同于均值, 是指排序队列中位于中间位置的元素的值,例如=采用3x3 中值滤披 器, 某点.(i,j) 的8 个邻域的一系列像

【OpenCV】邻域滤波:方框、高斯、中值、双边滤波

原文:http://blog.csdn.net/xiaowei_cqu/article/details/7785365 邻域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如图左边图像与中间图像卷积禅城右边图像.目标图像中绿色的像素由原图像中蓝色标记的像素计算得到. 通用线性邻域滤波是一种常用的邻域算子,输入像素加权得到输出像素: 其中权重核   为“滤波系数”.上面的式子可以简记为: [方框滤波] 最简单的线性滤波是移动平均或方框滤波,用 窗口中的像素值平均后输出,核函数

Atitit &#160;&#160;图像处理&#160;平滑&#160;也称&#160;模糊,&#160;归一化块滤波、高斯滤波、中值滤波、双边滤波)

Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: 归一化块滤波器 (Normalized Box Filter) § 最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等) § 高斯滤波器 (Gaussian Filter) § 最有用的滤波器 (尽管不是最快的). 高斯滤波是将输入数组的每一个像素点与 高斯