【问题标题】:grayscale bitmap into 2d array灰度位图转换为二维数组
【发布时间】:2013-06-21 03:47:16
【问题描述】:

大家好,我在 Java 中将灰度 bmp 图像转换为整数二维数组(值为 0-255)时遇到问题。

我有一个可以被视为整数 (0-255) 二维数组的 pmb 图像,我想在 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 中获取单个像素的灰度值?

【问题讨论】:

标签: java image image-processing bufferedimage bmp


【解决方案1】:

在灰度图像中,BufferedImage.getPixel(x,y) 不会给出 [0-255] 范围内的值。相反,它返回 RGB 颜色空间中灰度级(强度)的相应值。这就是为什么你会得到像 "-9211021" 这样的值。

以下 sn-p 应该可以解决您的问题:

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)。

【讨论】:

  • 感谢您的回复,但我以另一种方式解决了问题,即通过这种方式从 RGB 值中提取单个通道:array[i][j] = (bmp.getRGB(i, j ) >> 16) & 0xFF;
  • 然后你使用了RED频道(>>16)。如果这足以满足您的需求,那没关系。然而,要从 RGB 中获得灰度级,通常会提取所有三个通道值并将其转换为:I = .299 * R + .587 * G + .114 * B 强度仅考虑 R 值的 ~34%。
【解决方案2】:

您可以使用 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();

【讨论】:

  • 此代码已过时。正确的命令是image = fb.toMatrixGrayAsInt();fb.matrixToImage(image);
猜你喜欢
  • 2014-11-21
  • 2020-02-20
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多