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

本文介绍了在Java中实现图像滤波的三种方法:均值滤波、中值滤波和拉普拉斯滤波。均值滤波通过计算滤波器内像素点的平均值来平滑图像;中值滤波则选取滤波器内像素点的中值,有效去除噪声;拉普拉斯滤波则用于边缘检测。每个滤波方法都提供了具体的Java代码实现,并展示了滤波效果。
摘要由CSDN通过智能技术生成

来对下面的图像滤波,其实就是对各个像素点进行数学运算的过程

20190323002657404467.jpg

均值滤波

均值滤波的实现很简单,把滤波器的各个像素点相加在取平均就可以了。

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(int j=y-1;j<=y+1;j++)

{

color=bi.getRGB(i, j);

r += (color >> 16) & 0xff;

g += (color >> 8) & 0xff;

b += color & 0xff;

}

int ia = 0xff;

int ir = (int)(r/9);

int ig = (int)(g/9);

int ib = (int)(b/9);

color = (ia << 24) | (ir << 16) | (ig << 8) | ib;

return color;

}

效果如下图

20190323002657639828.jpg

中值滤波

取滤波器的各个像素点的中值。如3*3的滤波器就取排列后的第5个数

public static int getMidcolor(int x,int y,BufferedImage bi)

{

int color=0;

int m=0;

int a[]=new int[9];

for(int i=x-1;i<=x+1;i++)

for(int j=y-1;j<=y+1;j++)

{

color=bi.getRGB(i, j);

a[m]=color;

m++;

}

Arrays.sort(a);

color=a[5];

return color;

}

效果如下图

20190323002657860539.jpg

拉普拉斯滤波

其实也是各个像素点的基本运算

36d7deec6a0e1256c74cbe16a9ff81ac.png

20190323002658086134.gif

//LPLS滤波中间权重为8

public static int getLPLScolor8(int x,int y,BufferedImage bi)

{

int color=0,r=0,g=0,b=0;

for(int i=x-1;i<=x+1;i++)

for(int j=y-1;j<=y+1;j++)

{

if(i!=x&&j!=y)

{

color=bi.getRGB(i, j);

r -= (color >> 16) & 0xff;

g -= (color >> 8) & 0xff;

b -= color & 0xff;

}

else if(i==x&&j==y)

{

color=bi.getRGB(i, j);

r += 8*((color >> 16) & 0xff);

g += 8*((color >> 8) & 0xff);

b += 8*(color & 0xff);

}

}

color=bi.getRGB(x, y);

r += (color >> 16) & 0xff;

g += (color >> 8) & 0xff;

b += color & 0xff;

int ia = 0xff;

color = (ia << 24) | (clamp(r) << 16) | (clamp(g) << 8) | clamp(b);

return color;

}

//LPLS中间权重为4

public static int getLPLScolor4(int x,int y,BufferedImage bi)

{

int color=0,r=0,g=0,b=0;

color=bi.getRGB(x, y+1);

r -= (color >> 16) & 0xff;

g -= (color >> 8) & 0xff;

b -= color & 0xff;

color=bi.getRGB(x-1, y);

r -= (color >> 16) & 0xff;

g -= (color >> 8) & 0xff;

b -= color & 0xff;

color=bi.getRGB(x+1, y);

r -= (color >> 16) & 0xff;

g -= (color >> 8) & 0xff;

b -= color & 0xff;

color=bi.getRGB(x, y-1);

r -= (color >> 16) & 0xff;

g -= (color >> 8) & 0xff;

b -= color & 0xff;

color=bi.getRGB(x, y);

r += 5*((color >> 16) & 0xff);

g += 5*((color >> 8) & 0xff);

b += 5*(color & 0xff);

int ia = 0xff;

color = (ia << 24) | (clamp(r) << 16) | (clamp(g) << 8) | clamp(b);

return color;

}

LPLS权重4

20190323002658217975.jpg

LPLS权重8

20190323002658479704.jpg

Sobel滤波

主要用于提取边缘信息,当然也是数学变化

public static int getSobelcolor(int x,int y,BufferedImage bi)

{

int color=0;

int r1=0,g1=0,b1=0;

int r2=0,g2=0,b2=0;

int []a1= {-1,-2,-1,0,0,0,1,2,1};

int []a2= {1,0,-1,2,0,-2,1,0,-1};

int m=0;

for(int i=x-1;i<=x+1;i++)

for(int j=y-1;j<=y+1;j++)

{

color=bi.getRGB(i, j);

r1 += a1[m]*((color >> 16) & 0xff);

g1 += a1[m]*((color >> 8) & 0xff);

b1 += a1[m]*(color & 0xff);

r2 += a2[m]*((color >> 16) & 0xff);

g2 += a2[m]*((color >> 8) & 0xff);

b2 += a2[m]*(color & 0xff);

m+=1;

}

r1=(int)Math.sqrt(r1*r1+r2*r2);

g1=(int)Math.sqrt(g1*g1+g2*g2);

b1=(int)Math.sqrt(b1*b1+b2*b2);

int ia = 0xff;

color = (ia << 24) | (clamp(r1) << 16) | (clamp(g1) << 8) | clamp(b1);

return color;

}

结果

20190323002658708228.jpg

他可以用于图像转线稿哎

20190323002658884016.jpg

转化后的线稿

20190323002659294188.jpg

应该还要去除下噪声才好用

注意

用java读取的是RGB值,要做位运算转变成在R,G,B的分量。

注意转换后的图像的灰度值要小于255大于0,灰度值不在此区间的要让他等于255或0。一开始做LPLS的变化的时候没有注意到这一点,做出来的图像失真很严重,找了半天原因。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值