主要代码如下:
package chapter5;
import chapter4.*;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
-
Created by LENOVO on 18-1-30.
*/
public class PMMDFilter extends AbstractBufferedImageOp {
public static final int PLUS = 1;
public static final int MINUS = 2;
public static final int MULTIPLE = 4;private Random rnd;
private double range;
private int type;public PMMDFilter(){
type = MINUS;
rnd = new Random();
range =25.0;
}
public BufferedImage filter(BufferedImage src,BufferedImage dest){
int width = src.getWidth();
int height = src.getHeight();
if(dest == null){
dest = creatCompatibleDestImage(src,null);
}
int[] inPixels = new int[widthheight];
int[] outPixels = new int[widthheight];
getRGB(src,0,0,width,height,inPixels);
int index = 0;
int centerX = width/2;
int centerY = height/2;
double maxDistance = Math.sqrt(centerXcenterX+centerYcenterY);
for(int row=0;row<height;row++){
int ta = 0,tr = 0,tg = 0,tb = 0;
for(int col=0;col<width;col++){
index = row*width+col;
ta = (inPixels[index] >> 24) & 0xff;
tr = (inPixels[index] >> 16) & 0xff;
tg = (inPixels[index] >> 8) & 0xff;
tb = (inPixels[index]) & 0xff;int[] rgb = new int[]{tr,tg,tb}; if(type == PLUS){ rgb = plus(rgb); } if(type == MINUS){ int pcol = col-1;//当前像素之前一个像素 if(pcol < 0 || pcol >= width){ pcol = 0; } int index2 = row*width +pcol; rgb = minus(rgb,inPixels[index2]); } if(type == MULTIPLE){ rgb = multiple(rgb,maxDistance,centerX,centerY,row,col); } tr = rgb[0]; tg = rgb[1]; tb = rgb[2]; outPixels[index] = (ta <<24 ) | (clamp(tr) <<16) | (clamp(tg) << 8) | clamp(tb); } } setRGB(dest,0,0,width,height,outPixels); return dest;
}
//像素相加操作
private int[] plus(int[] rgb){
rgb[0] = addNoise(rgb[0]);
rgb[1] = addNoise(rgb[1]);
rgb[2] = addNoise(rgb[2]);
return rgb;
}
//图像加噪
private int addNoise(int p){
boolean valid = false;
do{
int ran = (int) Math.round(rnd.nextGaussian()*range);//符合标准正态分布
int v = p+ran;
valid = v>=0 && v<=255;//判断像素值是否有效
if (valid) p=v;
}while(!valid);
return p;
}
//像素相减操作
private int[] minus (int[] rgb,int p){
int tr = (p >> 16) & 0xff;
int tg = (p >> 8) & 0xff;
int tb =p & 0xff;
rgb[0] = clamp(rgb[0]-tr);
rgb[1] = clamp(rgb[1] -tr);
rgb[2] = clamp(rgb[2]-tb);
return rgb;
}//像素相乘操作
private int[] multiple(int[] rgb,double maxDistance,int cx,int cy,int row,int col){
double scale = 1.0-getDistance(cx,cy,row,col)/maxDistance;
scale = scalescale;
rgb[0] = (int) (scalergb[0]);
rgb[1] = (int) (scalergb[1]);
rgb[2] = (int) (scalergb[2]);
return rgb;}
//获取像素与中心点之间的距离
private double getDistance(int cx,int cy,int px, int py){
double xx = (cx-px)(cx-px);
double yy = (cy-py)(cy-py);
return (int)Math.sqrt(xx+yy);
}
}
测试代码同上。