1

我正在做 2D 过滤,并希望在灰度 BufferedImages 上逐个元素添加。是否有现有的功能可以为我完成这项工作,还是我需要从头开始制作一个?

是否有某种矩阵类可以将栅格转换为矩阵来简化这个问题?

编辑:这是它的一般要点

    BufferedImageOp opX = new ConvolveOp(new Kernel(3,3, kernelX));
    BufferedImageOp opY = new ConvolveOp(new Kernel(3,3, kernelY));
    BufferedImage filtImageX = opX.filter(sourceImage, null);
    BufferedImage filtImageY = opY.filter(sourceImage, null);
    BufferedImage outputImage = addBufferedImages(filtImageX, filtImageY);

灰度转换:

public void toGrayscale() { 
     BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); 
     sourceImage = op.filter(sourceImage, null); 
}
4

2 回答 2

1

我不熟悉为您执行此操作的任何 java 库。

您可以通过以下方式获得 [i,j] 处的像素:image.getRGB(i, j);

BufferedImage image = ...;
BufferedImage resultImage = ...

int rgb= image.getRGB(i, j);
resultImage.setRGB(i, j, rgb);

您还可以将缓冲图像转换为字节数组 [ https://stackoverflow.com/a/7388025/1007845 ]。
看到这个线程: 如何在java中将图像转换为字节数组? 得到一个WritableRaster

编辑:

在这种情况下,WritableRaster 似乎很有用:http: //docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/WritableRaster.html

WritableRaster raster = image.getRaster();

for(int h=0;h<height;h++) {
    for(int w=0;w<width;w++) {
        int colour = 127;
      raster.setSample(w,h,0,colour); 
   }
}
于 2012-03-12T15:40:53.203 回答
1

我不知道这样做的直接方法。

但我可以建议一种稍微不礼貌的方法。首先,拍摄两张图像,并将它们组合成一张带有两个波段的图像。我不清楚如何做到这一点的细节。我怀疑你会想用BandedSampleModel创建一个Raster,然后将其他两个图像的内容 blit 到它的DataBuffer中。尽管看起来您应该能够创建一个两库 DataBuffer,它使用源图像的(单库)DataBuffers 的数组作为库,这样可以避免复制。

一旦你有一个双波段图像,只需应用一个BandCombineOp来对波段求和。您需要将总和表示为矩阵,但这并不难。如果您想重新调整结果,我认为它将是 [1.0, 1.0] 或 [0.5, 0.5]。

于 2012-03-12T18:08:47.777 回答