【问题标题】:Is there a function to sum the rasters of two buffered images?是否有将两个缓冲图像的栅格相加的功能?
【发布时间】:2012-03-29 00:36:53
【问题描述】:

我正在做 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); 
}

【问题讨论】:

    标签: java matrix sum bufferedimage raster


    【解决方案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]。
    看到这个帖子:how to convert image to byte array in 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); 
       }
    }
    

    【讨论】:

    • 它说返回一个整数。您如何从中获取适当的像素? (我知道一个 int 是 4 个字节,每个代表一个不同的通道)请记住我已经将色彩空间转换为灰度......那么我该如何解释这些信息。
    • @Adam 为灰度计算发光的东西,如:L = .30*R + .59*G + .11*B。我想说的是你仍然有整数。你能发布你的代码吗,它会有所帮助:)
    • @Adam 卷积后你不是还有 R、G、B 值吗?无法将像素颜色设为 int 的代码在哪里?
    • @Adam 我编辑了帖子以包含 WritableRaster。试试看!
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-17
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多