2012-02-27 13 views
3

私はMatlabのrgb2grayhttp://www.mathworks.com/help/toolbox/images/ref/rgb2gray.htmlに従ってJavaで実装しようとしています。私は次のコードを持っています:Matlabのrgb2grayをJavaで実装する

public BufferedImage convert(BufferedImage bi){ 
    int heightLimit = bi.getHeight(); 
    int widthLimit = bi.getWidth(); 
    BufferedImage converted = new BufferedImage(widthLimit, heightLimit, 
     BufferedImage.TYPE_BYTE_GRAY); 

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

    return converted; 
} 

ここではグレースケール画像が得られますが、Matlabのものと比べて暗すぎます。 AFAIKは、画像をグレースケールにする最も簡単な方法は、TYPE_BYTE_GRAYタイプのBufferedImageを持っていて、TYPE_INT_(A)RGBのBufferedImageのピクセルをコピーするだけです。しかし、この方法でさえ、Matlabのグレースケールよりも暗いイメージが得られます。私もRescaleOpを使って調べました。しかし、RescaleOpではピクセル単位のグレーネスを設定することはできません。

追加テストとして、MatlabによってJava nadによって生成された画像マトリックスをプリントアウトします。 Javaでは、6316128 6250335 6118749 6118749 6250335 6447714のような数字が得られますが、Matlabでは116 117 119 120 119 115(両方の行列の最初の6桁)のようなものしか得られません。

Matlabと同様の出力を得るにはどうすればよいですか?

答えて

3

operator precedence in Javaは、型キャスティングが乗算よりも高いと指定します。浮動小数点定数を0にキャストしているので、グレースケールの結果がどのように得られているのか分かりません。ドキュメントのタイプミスのように見えるように私も0.29900.2989に代わる

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

:修正が簡単です。

+0

こんにちは、ありがとう。これは私のグレースケールの問題を解決するように思われます。しかし、私はMatlabのドキュメンテーションのどこで修正したのですか?私はそれが他のところで言及されているのを見つけるように見えない。 – skytreader

+1

@skytreader、それはよく知られた公式であり、参考文献はどこにでもあります。 http://en.wikipedia.org/wiki/Luma_(video)#Rec._601_luma_versus_Rec._709_luma_coefficients。削除された回答がありました。これには適切ではないサンプルの計算が含まれていましたが、適切な定数を置き換えた場合は正確でした。 –