我正在进行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);
}
答案 0 :(得分:1)
我不熟悉那些为你做这件事的java库。
您可以使用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);
}
}
答案 1 :(得分:1)
我不知道直接的方法。
但我可以提出一种略显欠缺的做法。首先,拍摄两张图像,然后将它们组合成一个带有两个波段的图像。我对如何做到这一点的细节很朦胧。我怀疑你想创建一个Raster BandedSampleModel,然后将其他两个图像的内容blit到DataBuffer。虽然看起来你应该能够创建一个双库DataBuffer,它使用源图像的数组(单库)DataBuffers作为库,这样可以避免复制。
一旦你有了一个双波段图像,只需应用一个BandCombineOp来对波段求和。您需要将求和表达为矩阵,但这应该不难。如果你想重新调整结果,我想它会是[1.0,1.0]或[0.5,0.5]。