2015-09-27 99 views
4

我試圖從灰度圖像獲取RGB值,並且它返回錯誤(?)RGB值。這是代碼。來自java的奇怪的RGB值BufferedImage getRGB()

Color color = new Color(image.getRGB(0, 0)); 
System.out.print(color.getRed()); 
System.out.print(color.getGreen()); 
System.out.print(color.getBlue()); 

在顏色選擇器使用,第一像素RGB值R:153,G:153,B:153,但我的代碼打印

203203203 

爲什麼這樣的事情發生?而且,即時嘗試使用MATLAB灰度值的確切像素也是153.我做錯了嗎?

這是圖像

enter image description here

+0

@FastSnail這裏是我的灰度圖像https://drive.google.com/file/d/0BzWz7hgjG3VEUmhZdWlCYmdVQVk/view?usp=sharing –

回答

5

這是因爲通過image.getRGB(x, y)定義回報的sRGBçARGB值olorspace

JavaDoc

返回默認的RGB顏色模型(TYPE_INT_ARGB)和默認sRGB顏色空間中的整數像素。如果此默認模型與圖像ColorModel不匹配,則會進行顏色轉換。

Matlab和其他工具可能使用線性RGB或灰色空間,這就是爲什麼值不同。

如果圖像是灰度圖(TYPE_BYTE_GRAY),則可以通過訪問Raster及其getDataElements方法從Java獲得相同的值。

Object pixel = raster.getDataElements(0, 0, null); // x, y, data array (initialized if null) 

如果圖像TYPE_BYTE_GRAYpixel將是一個byte陣列的單個元件。

int grayValue = ((byte[]) pixel)[0] & 0xff; 

這個值將是153你的情況。

2

剛剛嘗試這

System.out.println(image.getRaster().getSample(0, 0, 0)); //R 
System.out.println(image.getRaster().getSample(0, 0, 1)); //G 
System.out.println(image.getRaster().getSample(0, 0, 2)); //B 

這裏

getSample(int x, int y, int b)
返回在對於位於(x,y)設置爲一個int像素中的指定頻帶中的樣品。 [根據 this]

參數:
X - 的X上的像素位置的座標
y - 像素位置
B的Y座標 - 返回
B = [0,1的頻帶, 2] [R,G,B]

並且還看看BufferedImage getRGB vs Raster getSample

+1

我看到一個編輯建議添加import java.awt.image.WritableRaster。 getRaster()是BufferedImage類中的一個公共方法,它返回一個WritableRaster對象。你爲什麼建議編輯?你能多解釋一下嗎? @HawasKaPujaari – sifho