Есть ли функция суммирования растров двух буферизованных изображений? - PullRequest
1 голос
/ 12 марта 2012

Я делаю 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); 
}

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Я не знаю прямого способа сделать это.

Но я могу предложить слегка закулисный подход.Сначала возьмите два изображения и объедините их в одно изображение с двумя полосами.Я не знаю, как это сделать.Я подозреваю, что вы захотите создать Растр с BandedSampleModel , а затем скопировать содержимое двух других изображений в DataBuffer .Хотя, похоже, вы сможете создать двухбанковский DataBuffer, который использует массивы исходных изображений (DataBuffers с одним банком) в качестве банков, что позволит избежать копирования.

Как только у вас естьИзображение полосы, просто примените BandCombineOp , который суммирует полосы.Вам нужно будет выразить суммирование в виде матрицы, но это не должно быть сложно.Я думаю, что будет [1,0, 1,0] или [0,5, 0,5], если вы хотите изменить масштаб результата.

1 голос
/ 12 марта 2012

Я не знаком ни с какими 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); 
   }
}
...