图像的均值滤波、中值滤波_JAVA
转载自 http://blog.csdn.net/luoweifu/article/details/8150196
概述
噪声对图像处理的影响很大,它影响图像处理的输入、采集和处理等各个环节以及输出结果。因此,在进行其它的图像处理前,需要对图像进行去噪处理。
从统计学的观点来看,凡是统计特征不随时间变化的噪声称为平稳噪声,而统计特征随时间变化的噪声称为非平稳噪声。幅值基本相同,但是噪声出现的位置是随机的,称为椒盐噪声;如果噪声的幅值是随机的,根据幅值大小的分布,有高斯型和瑞利型两种,分别称为高斯噪声和瑞利噪声。由于去除噪声处理的原理和方法很多,这里只给出了简单的描述和我自己已实现的几种方法的java源代码。
常见的去噪处理有均值滤波,中值滤波,灰度最小方差均值滤波,K近邻平滑滤波,对称近邻均值滤波,西戈玛平滑滤波等。
均值滤波
定义
均值滤波方法是,对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,用模板的均值来替代原像素的值的方法。
如下图,1~8为(x,y)的邻近像素。
权系数矩阵模板
g = (f(x-1,y-1) + f(x,y-1)+ f(x+1,y-1) + f(x-1,y) + f(x,y) + f(x+1,y) + f(x-1,y+1) + f(x,y+1) + f(x+1,y+1))/9
方法优缺点
优点:算法简单,计算速度快;
缺点:降低噪声的同时使图像产生模糊,特别是景物的边缘和细节部分。
源代码
- /**
- * 均值滤波
- * @param srcPath 图片的存储位置
- * @param destPath 图像要保存的存储位置
- * @param format 图像要保存的存储位置
- */
- public static void avrFiltering(String srcPath,String destPath, String format) {
- BufferedImage img = readImg(srcPath);
- int w = img.getWidth();
- int h = img.getHeight();
- int[] pix = new int[w*h];
- img.getRGB(0, 0, w, h, pix, 0, w);
- int newpix[] = avrFiltering(pix, w, h);
- img.setRGB(0, 0, w, h, newpix, 0, w);
- writeImg(img, format, destPath);
- }
- /**
- * 均值滤波
- * @param pix 像素矩阵数组
- * @param w 矩阵的宽
- * @param h 矩阵的高
- * @return 处理后的数组
- */
- public static int[] avrFiltering(int pix[], int w, int h) {
- int newpix[] = new int[w*h];
- ColorModel cm = ColorModel.getRGBdefault();
- int r=0;
- for(int y=0; y<h; y++) {
- for(int x=0; x<w; x++) {
- if(x!=0 && x!=w-1 && y!=0 && y!=h-1) {
- //g = (f(x-1,y-1) + f(x,y-1)+ f(x+1,y-1)
- // + f(x-1,y) + f(x,y) + f(x+1,y)
- // + f(x-1,y+1) + f(x,y+1) + f(x+1,y+1))/9
- r = (cm.getRed(pix[x-1+(y-1)*w]) + cm.getRed(pix[x+(y-1)*w])+ cm.getRed(pix[x+1+(y-1)*w])
- + cm.getRed(pix[x-1+(y)*w]) + cm.getRed(pix[x+(y)*w]) + cm.getRed(pix[x+1+(y)*w])
- + cm.getRed(pix[x-1+(y+1)*w]) + cm.getRed(pix[x+(y+1)*w]) + cm.getRed(pix[x+1+(y+1)*w]))/9;
- newpix[y*w+x] = 255<<24 | r<<16 | r<<8 |r;
- } else {
- newpix[y*w+x] = pix[y*w+x];
- }
- }
- }
- return newpix;
- }
中值滤波
定义
中值滤波方法是,对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。
权系数矩阵模板
g = median[(x-1,y-1) + f(x,y-1)+ f(x+1,y-1) + f(x-1,y) + f(x,y) + f(x+1,y) + f(x-1,y+1) + f(x,y+1) + f(x+1,y+1)]
优缺点
优点:抑制效果很好,画面的清析度基本保持;
缺点:对高斯噪声的抑制效果不是很好。
源代码
- /**
- * 中值滤波
- * @param srcPath 图片的存储位置
- * @param destPath 图像要保存的存储位置
- * @param format 图像要保存的存储位置
- */
- public static void medianFiltering(String srcPath, String destPath, String format) {
- BufferedImage img = readImg(srcPath);
- int w = img.getWidth();
- int h = img.getHeight();
- int[] pix = new int[w*h];
- img.getRGB(0, 0, w, h, pix, 0, w);
- int newpix[] = medianFiltering(pix, w, h);
- img.setRGB(0, 0, w, h, newpix, 0, w);
- writeImg(img, format, destPath);
- }
- /**
- * 中值滤波
- * @param pix 像素矩阵数组
- * @param w 矩阵的宽
- * @param h 矩阵的高
- * @return 处理后的数组
- */
- public static int[] medianFiltering(int pix[], int w, int h) {
- int newpix[] = new int[w*h];
- int[] temp = new int[9];
- ColorModel cm = ColorModel.getRGBdefault();
- int r=0;
- for(int y=0; y<h; y++) {
- for(int x=0; x<w; x++) {
- if(x!=0 && x!=w-1 && y!=0 && y!=h-1) {
- //g = median[(x-1,y-1) + f(x,y-1)+ f(x+1,y-1)
- // + f(x-1,y) + f(x,y) + f(x+1,y)
- // + f(x-1,y+1) + f(x,y+1) + f(x+1,y+1)]
- temp[0] = cm.getRed(pix[x-1+(y-1)*w]);
- temp[1] = cm.getRed(pix[x+(y-1)*w]);
- temp[2] = cm.getRed(pix[x+1+(y-1)*w]);
- temp[3] = cm.getRed(pix[x-1+(y)*w]);
- temp[4] = cm.getRed(pix[x+(y)*w]);
- temp[5] = cm.getRed(pix[x+1+(y)*w]);
- temp[6] = cm.getRed(pix[x-1+(y+1)*w]);
- temp[7] = cm.getRed(pix[x+(y+1)*w]);
- temp[8] = cm.getRed(pix[x+1+(y+1)*w]);
- Arrays.sort(temp);
- r = temp[4];
- newpix[y*w+x] = 255<<24 | r<<16 | r<<8 |r;
- } else {
- newpix[y*w+x] = pix[y*w+x];
- }
- }
- }
- return newpix;
- }
对称近邻均值滤波
定义
对称近邻(SNN:Symmetric Nearest Neighbor)均值滤波的核心思想是,在一个局部范围内,通过几对对称点像素的比较,获得相对区域及不同区域的差别,然后将均值计算在所判定的同一个区域内进行,这样可以使边界的保持更加灵活的同时又降低计算。
设一个(2N+1)*(2N+1)的模板,则有2N*(2N+1)个对称点,2N*(2N+1)个选择点的像素均值代替原像素值,如下:
优缺点
使边界的保持更加灵活的同时又降低计算。
源代码
- /**
- * 对称近邻均值滤波
- * @param srcPath 图片的存储位置
- * @param destPath 图像要保存的存储位置
- * @param format 图像要保存的存储位置
- */
- public static void snnFiltering(String srcPath, String destPath, String format) {
- BufferedImage img = readImg(srcPath);
- int w = img.getWidth();
- int h = img.getHeight();
- int[] pix = new int[w*h];
- img.getRGB(0, 0, w, h, pix, 0, w);
- int newpix[] = snnFiltering(pix, w, h);
- img.setRGB(0, 0, w, h, newpix, 0, w);
- writeImg(img, format, destPath);
- }
- /**
- * 对称近邻均值滤波
- * @param pix 像素矩阵数组
- * @param w 矩阵的宽
- * @param h 矩阵的高
- * @return 处理后的数组
- */
- public static int[] snnFiltering(int pix[], int w, int h) {
- int newpix[] = new int[w*h];
- int n = 9;
- int temp, i1,i2, sum;
- int[] temp1 = new int[n];
- int[] temp2 = new int[n/2];
- ColorModel cm = ColorModel.getRGBdefault();
- int r=0;
- for(int y=0; y<h; y++) {
- for(int x=0; x<w; x++) {
- if(x!=0 && x!=w-1 && y!=0 && y!=h-1) {
- sum = 0;
- temp1[0] = cm.getRed(pix[x-1+(y-1)*w]);
- temp1[1] = cm.getRed(pix[x+(y-1)*w]);
- temp1[2] = cm.getRed(pix[x+1+(y-1)*w]);
- temp1[3] = cm.getRed(pix[x-1+(y)*w]);
- temp1[4] = cm.getRed(pix[x+(y)*w]);
- temp1[5] = cm.getRed(pix[x+1+(y)*w]);
- temp1[6] = cm.getRed(pix[x-1+(y+1)*w]);
- temp1[7] = cm.getRed(pix[x+(y+1)*w]);
- temp1[8] = cm.getRed(pix[x+1+(y+1)*w]);
- for(int k=0; k<n/2; k++) {
- i1 = Math.abs(temp1[n/2] - temp1[k]);
- i2 = Math.abs(temp1[n/2] - temp1[n-k-1]);
- temp2[k] = i1<i2 ? temp1[k] : temp1[n-k-1]; //选择最接近原像素值的一个邻近像素
- sum = sum + temp2[k];
- }
- r = sum/(n/2);
- //System.out.println("pix:" + temp1[4] + " r:" + r);
- newpix[y*w+x] = 255<<24 | r<<16 | r<<8 |r;
- } else {
- newpix[y*w+x] = pix[y*w+x];
- }
- }
- }
- return newpix;
- }
图像的均值滤波、中值滤波_JAVA相关推荐
- C++手敲灰度图均值滤波中值滤波高斯滤波
一.均值滤波(Meaning Filtering)概念 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板 ...
- opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波
文章目录 一. 线性滤波 1.1. 方框滤波 demo 1.2. 均值滤波 demo 1.3. 高斯滤波 demo 二. 非线性滤波 2.1. 中值滤波 demo 2.2. 双边滤波 demo 结构体 ...
- Opencv学习笔记 各向异性滤波/均值滤波/高斯滤波/中值滤波/加权中值滤波/高斯低通滤波
各向异性滤波 各向异性扩散滤波主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的,和双边滤波很像. public static void ImageA ...
- 高斯滤波 中值滤波 均值滤波的区别
图像滤波 (转:http://www.baisi.net/viewthread.php?tid=219452) 1 图像滤波的基本概念 图像常常被强度随机信号(也称为噪声)所污染.一些常见的噪声有椒盐 ...
- 均值滤波高斯滤波中值滤波
1.均值滤波 均值滤波是一种线性滤波器,处理思路也很简单,就是将一个窗口区域中的像素计算平均值,然后将窗口中计算得到的均值设置为锚点上的像素值. 该算法有优点在于效率高,思路简单.同样,缺点也很明显, ...
- matlab高斯滤波跟中值滤波区别,matlab图像滤波处理代码讲解 均值滤波 中值滤波 高斯滤波...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 (1)均值滤波 function imres = averageFilter(im,N) % imres为均值滤波后的矩阵,参数im为图像的路径,N为滤波 ...
- 均值滤波 中值滤波 高斯平滑滤波
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代 ...
- matlab的knn均值滤波,中值滤波与均值滤波介绍.ppt
第五章 图像的噪声抑制 图像噪声的概念 所谓的图像噪声,是图像在摄取时或是传输时所受到的随机干扰信号. 常见的有椒盐噪声和高斯噪声. 图像噪声的概念 椒盐噪声的特征: 出现位置是随机的,但噪声的幅值是 ...
- 图像处理中的滤波器之均值滤波,中值滤波,高斯滤波
1.均值滤波 原理: 均值滤波采用线性的方法,使用模板内所有像素的平均值代替模板中心像素灰度值 特点: 不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去 ...
- 图像局部均值、中值、方差求取结合opencv
结合opencv求取图像的局部均值.中值.方差: //src 为待处理图像 //indexrows 为图像遍历的行数 //indexcols 为图像遍历的列数 //meanv 保存均值 //ker 窗 ...
最新文章
- CUDA Samples: approximate prior vbox layer
- Azure上的VM代理及可扩展程序
- LeetCode:146_LRU cache | LRU缓存设计 | Hard
- Mac JDK和SDK环境变量配置
- android 视频默认图片格式,Android获取视频文件某一帧并设置图片
- 理解ThreadLocal 2
- elasticSearch6源码分析(12)DiscoveryModule
- img disabled可以用什么替代_本特:马内不可替代,菲米是粘合剂,萨拉赫可以用姆巴佩桑乔替代...
- android settings源代码分析(1)
- mysql set语句_mysql--乱码解决(6)
- Mybatis源码阅读(一):Mybatis初始化1.1 解析properties、settings
- oracle 查询数据 实验笔记三
- Python3.6 用Django连接MySQL
- AC日记——[HNOI2012]永无乡 bzoj 2733
- 音乐推荐系统协同过滤算法解释
- 使用MATLAB求矩阵的偏导数,求向量对变量的偏导数问题
- 23个无本空手套白狼的赚钱方法!颠…
- 4x root 红米_红米Note 4X root教程 红米Note4X获取root权限的方法
- 【PMAC】Chapter4:PMAC的C#开发
- 解决Win7系统插入耳机或音响没有声音教程
热门文章
- JS之向上取整、向下取整、四舍五入等
- 三菱触摸屏通讯错误_三菱触摸屏插上通讯线直接黑屏,老司机手把手教你解决触摸屏黑屏...
- 【软件工具】百度搜索技巧
- XP下硬盘安装fedora linux操作系统
- mysql中删除数据库语句
- STM32开发笔记113:ADS1258驱动设计——读取温度值
- 从Java 9 到 Java 17之Java 11
- 软件测试/测试开发丨Java or Python?测试开发工程师如何选择合适的编程语言?
- 写好CSS代码的70个专业建议
- hudson.plugins.git.GitException