2013-05-14 73 views
0

我不能夠exactely我的RGB圖像轉換爲灰度圖像..的Java RGB2灰色是暗

我的最終圖像是暗,影響了我的工作。

我用這個代碼:

public static BufferedImage rgb2gray(BufferedImage bi)//converter 
{ 
    int heightLimit = bi.getHeight(); 
    int widthLimit = bi.getTileWidth(); 

    BufferedImage converted = new BufferedImage(widthLimit, heightLimit, BufferedImage.TYPE_BYTE_GRAY); 

    for (int height = 0; height < heightLimit; height++) { 
     for (int width = 0; width < widthLimit; width++) { 
      Color c = new Color(bi.getRGB(width, height) & 0x00fffff); 
      int newRed = (int) ((0.2989f * c.getRed()) * 1.45);//0.2989f 
      int newGreen = (int) ((0.5870f * c.getGreen()) * 1.45);//0.5870f 
      int newBlue = (int) ((0.1140f * c.getBlue()) * 1.45); 
      int roOffset = newRed + newGreen + newBlue; 
      converted.setRGB(width, height, roOffset); 
     } 
    } 
    return converted; 
} 

有什麼不對?

在matlab中的結果是完美的,但在java中的代碼很差。

+0

爲什麼你用1.45乘以每個新值?據我所知,乘數僅爲0.2989,0.587和0.1140分別爲r,g和b – 2013-05-14 00:04:39

+0

這可能有助於http://stackoverflow.com/questions/9460079/implementing-matlabs-rgb2gray-in-java – 2013-05-14 00:07:48

+0

@bilal。 haider - 它看起來像括號在他的代碼中是正確的...所以你鏈接的答案不適用。但額外的* 1.45似乎不合適。但無法弄清楚爲什麼這樣做不會使圖像「太亮」而不是「太暗」。 – Floris 2013-05-14 00:14:22

回答

0

我不知道爲什麼這個工程在Matlab中,而不是在java中 - 除了可能顏色表示在兩個平臺中處理方式不同(但這是猜測)。然而,有一種非常好的方式可以做你想做的事 - 它不會回答你的具體問題(「有什麼問題?」),但它會讓你回到做你想做的事:

How do I desaturate a BufferedImage in Java?

+0

我想我已經解決了,我乘以1.35而不是乘以1.45,結果它更好。 – FCoelho 2013-05-14 00:14:56

+0

感謝您的鏈接;) – FCoelho 2013-05-14 00:15:20

0

你的錯誤似乎將新的紅色,綠色和藍色值乘以神祕的1.45。

只是刪除,使您的代碼:

int newRed = (int) (0.2989f * c.getRed()); 
int newGreen = (int) (0.5870f * c.getGreen()); 
int newBlue = (int) (0.1140f * c.getBlue()); 

Matlab's documentation爲它的rgb2gray功能有這些係數。