使用java在图像上应用Mean滤镜

时间:2016-12-05 19:33:28

标签: java

当我给它一张带有盐和胡椒噪音的图片时,它会返回一张丢失所有细节的图片,我不知道我的代码有什么问题:

public class Q1 {
    public static void main(String[] args) throws IOException {
        BufferedImage img = ImageIO.read(new File("task1input.png"));

        //get dimensions
        int maxHeight = img.getHeight();
        int maxWidth = img.getWidth();

        //create 2D Array for new picture
        int pictureFile[][] = new int [maxHeight][maxWidth];
        for( int i = 0; i < maxHeight; i++ ){
            for( int j = 0; j < maxWidth; j++ ){
                pictureFile[i][j] = img.getRGB( j, i );
            }
        }

        int output [][] = new int [maxHeight][maxWidth];

        //Apply Mean Filter
        for (int v=1; v<maxHeight; v++) {
            for (int u=1; u<maxWidth; u++) {
                //compute filter result for position (u,v)

                int sum = 0;
                for (int j=-1; j<=1; j++) {
                    for (int i=-1; i<=1; i++) {
                        if((u+(j)>=0 && v+(i)>=0 && u+(j)<maxWidth && v+(i)<maxHeight)){
                        int p = pictureFile[v+(i)][u+(j)];
                        sum = sum + p;
                        }
                    }
                }

                int q = (int) (sum /9);
                output[v][u] = q;
            }
        }

        //Turn the 2D array back into an image
        BufferedImage theImage = new BufferedImage(
            maxHeight, 
            maxWidth, 
            BufferedImage.TYPE_INT_RGB);
        int value;
        for(int y = 1; y<maxHeight; y++){
            for(int x = 1; x<maxWidth; x++){
                value = output[y][x] ;
                theImage.setRGB(y, x, value);
            }
        }

        File outputfile = new File("task1output3x3.png");
        ImageIO.write(theImage, "png", outputfile);
    }
}

1 个答案:

答案 0 :(得分:0)

getRGB“返回默认RGB颜色模型(TYPE_INT_ARGB)中的整数像素”因此您必须提取R,G和B并单独添加它们;然后把它们放回原处。一种方法是这个

b

然后将它们重新组合起来

int pixel=pictureFile[u+i][v+j];
int rr=(pixel&0x00ff0000)>>16, rg=(pixel&0x0000ff00)>>8, rb=pixel&0x000000ff;
sumr+=rr;
sumg+=rg;
sumb+=rb;