灰度位图成2d数组

时间:2013-06-24 15:08:43

标签: java image image-processing bufferedimage bmp

大家好我在使用Java将GrayScale bmp图像转换为整数2D数组(值为0-255)时遇到了问题。

我有一个pmb图像,可以看作是一个整数(0-255)2D数组,我想在Java数据结构中看到2D数组

我试过这种方式:

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);
    }
}

但是现在所有的2D阵列都充满了像“-9211021”或类似的数字。

我认为问题出在getRGB(j,k)中,但我不知道是否可以解决它。

编辑:

我知道RGB不是灰度,所以如何从灰度BufferedImage中获取单个像素的灰度值?

2 个答案:

答案 0 :(得分:1)

在灰度图像中, BufferedImage.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);
    }
}

其中 image 是创建的BufferedImage。 getSample 中的0表示我们正在访问第一个字节/波段(将其设置为更大的值将在灰度图像中抛出 ArrayOutOfBoundException )。

答案 1 :(得分:0)

您可以使用Catalano Framework。包含几个用于图像处理的过滤器。

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();