我目前正在尝试编写一个程序,在该程序中,通过确定邻域大小和文件类型的用户输入来应用均值过滤器。我的程序可以执行并运行,但是我得到的输出图像与所输入的图像几乎没有任何关系。我不确定它的读数是否正在扔掉它或输出,甚至是数学运算,但我的图像最终还是注意到一个很大的盐和胡椒粉图像。这是我的代码,至于现在我正在应用3x3均值过滤器只是为了使其正常运行
img = ImageIO.read(new File(fileName));
//get dimensions
maxHeight = img.getHeight();
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 );
}
}
//Apply Mean Filter
for (int v=1; v<=maxHeight-2; v++) {
for (int u=1; u<=maxWidth-2; 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++) {
int p = pictureFile[u+i][v+j];
sum = sum + p;
}
}
int q = (int) (sum / 9);
pictureFile[u][v] = q;
}
}
//Turn the 2D array back into an image
BufferedImage theImage = new BufferedImage(
maxHeight,
maxWidth,
BufferedImage.TYPE_BYTE_GRAY);
int value;
for(int y = 0; y<maxHeight; y++){
for(int x = 0; x<maxWidth; x++){
value = pictureFile[y][x] ;
theImage.setRGB(x, y, value);
}
}
File outputfile = new File("saved.png");
ImageIO.write(theImage, "png", outputfile);
最佳答案
对由int
返回的打包到getRGB()
中的ARGB值应用算术运算是没有意义的。
由于您希望输出为灰度,因此需要将getRGB()
返回的值转换为灰度,将滤镜应用于该灰度值,然后将其转换回ARGB,以将其传递给setRGB()
。
也可以看看:
Luminance
Bitwise operations