2013-06-24 33 views
1

嗨,大家好,我有在Java中將GrayScale bmp圖像轉換爲整數二維數組(值爲0-255)的問題。灰度位圖到二維數組

我有可能被看作是一個整數(0-255)2D-陣列的PMB圖像,我想看到2D-陣列中的Java數據結構

我想是這樣的:

Image image = ImageIO.read(new File("my_img.bmp")); 
BufferedImage img = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_BYTE_GRAY); 
Graphics g = img.createGraphics(); 
g.drawImage(image, 0, 0, null); 
g.dispose(); 

然後用我的BufferedImage我創建INT [] []是這樣的:

int w = img.getWidth(); 
int h = img.getHeight(); 

int[][] array = new int[w][h]; 
for (int j = 0; j < w; j++) { 
    for (int k = 0; k < h; k++) { 
     array[j][k] = img.getRGB(j, k); 
    } 
} 

但現在所有的二維數組已滿一些像「-9211021」或類似。

我認爲問題出現在getRGB(j,k)中,但我不知道是否有可能解決它。

編輯:

我知道RGB是不是灰度,所以我如何從一個灰度的BufferedImage獲取單個像素的灰度值?

+0

RGB不是灰度,看看http://docs.oracle.com/javase/6/docs/api/java/awt/image/PixelGrabber.html – arynaq

回答

1

在灰度圖像中,012fferedB Image.getPixel(x,y)將不會給出[0-255]範圍內的值。相反,它會返回RGB顏色空間中灰度級(強度)的對應值。這就是爲什麼你得到的值如「-9211021」

下面的片段應該解決您的問題:

Raster raster = image.getData(); 
for (int j = 0; j < w; j++) { 
    for (int k = 0; k < h; k++) { 
     array[j][k] = raster.getSample(j, k, 0); 
    } 
} 

其中圖像0​​是創建的BufferedImage。 getSample中的0表示我們正在訪問第一個字節/波段(將其設置爲更大的值將在灰度圖像中拋出ArrayOutOfBoundException)。

+0

感謝您的答覆,但我通過以這種方式從RGB值中提取單個通道:array [i] [j] =(bmp.getRGB(i,j)>> 16)& 0xFF; – drstein

+1

然後您使用RED通道(>> 16)。如果這足夠你的需要,那沒關係。然而,爲了從RGB獲得灰度級,通常提取所有三個通道值並將其轉換爲: I = .299 * R + .587 * G + .114 * B 僅約34%的R值被認爲是強度。 – blackSmith

0

您可以使用Catalano框架。包含用於圖像處理的多個過濾器。

http://code.google.com/p/catalano-framework/

詳細信息:這就是它比使用的WritableRaster更快。

FastBitmap fb = new FastBitmap(bufferedImage); 

int[][] image = new int[fb.getHeight()][fb.getWidth]; 
fb.toArrayGray(image); 

//Do manipulations with image 
//... 

//Place the image into fastBitmap 
fb.arrayToImage(image); 

//Retrieve in bufferedImage if you desire. 
bufferedImage = fb.toBufferedImage(); 
+0

此代碼已過時。正確的命令是'image = fb.toMatrixGrayAsInt();'和'fb.matrixToImage(image);' – BrianHVB