java中值滤波_中值滤波 java实现

本文介绍了中值滤波器的工作原理,特别是在图像处理中去除噪声的效果。通过示例解释了在非边缘区域,噪声点会被3*3矩阵排序后的中值替换,从而恢复图像的平滑性。同时提供了一个Java实现的中值滤波方法`medfilt2`,用于处理2*2模板矩阵,并可扩展到更大核的处理。
摘要由CSDN通过智能技术生成

中值滤波器原理

如果不在边缘区域,图像的数据是平缓的,没有太大的差值。因此,一个噪声点的值要么过大,要么过小。比如下图,左图是没有处理的原图,250在该区域由为突出,通过对3*3的9个数据进行排序,将中间值150重新填入,即滤波完成,原本的噪声点被去掉,该区域恢复平缓。同理,在边缘区域中,对于边界来说,高频不会影响,而过低数值将会突出,中值的选择将不会受到影响,除非3*3的整块区域都被污染,这时我们可以考虑更大的核来处理。

0a26adfa2e5a2d09ed5250b7747f14b9.png

java 实现

/**

*

Title: medfilt2

*

Description:中值滤波

* @param imagesPos

* @param tmp 模板矩阵 2*2

* @return

*/

public static Matrix medfilt2(Matrix imagesPos, Matrix tmp) {

/**imagesPos 计算矩阵外围追加数值为0外围,以防矩阵下表越界*/

Matrix appendPos=DenseMatrix.Factory.emptyMatrix();

appendPos=appendPos.appendVertically(Ret.NEW, imagesPos);

Matrix v= DenseMatrix.Factory.zeros(1,imagesPos.getColumnCount());

appendPos=appendPos.appendVertically(Ret.NEW, v);

Matrix h= DenseMatrix.Factory.zeros(imagesPos.getRowCount()+1,1);

appendPos=appendPos.appendHorizontally(Ret.NEW, h);

Matrix matRt= DenseMatrix.Factory.zeros(imagesPos.getRowCount(),imagesPos.getColumnCount());

for(int i=0;i

Matrix matTmp= DenseMatrix.Factory.zeros(tmp.getColumnCount(), tmp.getColumnCount());

for(int j=0;j

/**求和*/

double [] d= {appendPos.getAsDouble(i,j),appendPos.getAsDouble(i,j+1),

appendPos.getAsDouble(i+1,j),appendPos.getAsDouble(i+1,j+1)};

Arrays.sort(d);

/**依据模板矩阵2*2 计算中值*/

double dbMid=(d[1]+d[2])/2;

matRt.setAsDouble(dbMid, i,j);

}

}

return matRt;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值