2012-02-02 91 views
1

我目前正在嘗試編寫一個程序,其中應用用戶輸入確定鄰域大小和文件類型的平均過濾器。我的程序符合並運行,但是我得到的輸出圖像與接收的輸入圖像無關。我不確定它的讀數是否會將其丟棄或輸出,或者甚至是數學,但是我的圖像最終會成爲注意到一個大的鹽和胡椒的形象。這裏是我的代碼,因爲現在我申請的3×3均值濾波只是爲了獲得它運行正常Java ImageIO平均過濾器

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); 
+0

1)爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 2)對於處理圖像的SSCCE,熱鏈接到一個或通過代碼生成。 3)連接到幾個小的「原始/轉換/預期」圖像將非常有幫助。 4)你有問題嗎?如果是這樣,現在是時候提問了。 – 2012-02-02 18:46:51

回答

2

它沒有意義的應用算術運算ARGB裝入int的價值觀,通過getRGB()返回的。

既然你想讓你的輸出爲灰度,則需要通過getRGB()回到灰度,你的過濾器適用於灰度值,然後將其轉換回ARGB他們傳遞給setRGB()值轉換。

參見: