私はMatlabのrgb2gray
をhttp://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と同様の出力を得るにはどうすればよいですか?
こんにちは、ありがとう。これは私のグレースケールの問題を解決するように思われます。しかし、私はMatlabのドキュメンテーションのどこで修正したのですか?私はそれが他のところで言及されているのを見つけるように見えない。 – skytreader
@skytreader、それはよく知られた公式であり、参考文献はどこにでもあります。 http://en.wikipedia.org/wiki/Luma_(video)#Rec._601_luma_versus_Rec._709_luma_coefficients。削除された回答がありました。これには適切ではないサンプルの計算が含まれていましたが、適切な定数を置き換えた場合は正確でした。 –