Как получить среднее из набора изображений

Следующий метод Java принимает массив BufferedImage объектов и возвращает среднее изображение, полученное из массива изображений.

Основное применение изображений усреднения удаления шума. Шума изображения, в основном нежелательных и проявляется в пиксели изображения. Это присуще и цифровых камер, и создается, в частности, под действием температуры и в условиях низкой освещенности, и часто видное место в длинных выдержках и фотографии, сделанные при высокой чувствительности ISO. Его эффект аналогичен Film Grain.

Когда изображение сцены неизменный развращены случайные шумы, последовательность этих образов может быть усредненная вместе с тем, чтобы снизить воздействие шума. Это работает, потому что шум возмущает пиксель уровни серого, и положительное возмущение данной величины, как правило, столь же вероятно, как и негативные возмущения и ту же величину. Следовательно, существует тенденция эти "ошибки" в пиксельных серый уровня компенсируют друг друга во все большей степени, так как количество усредненные изображения увеличивается.

Хотя пример написан для изображений в серой уровня, вы можете изменить метод для применения его в RGB изображения легко. Вам просто необходимо для вычисления среднего значения для каждого канала (красный, зеленый или синий канал).


    public static BufferedImage average(BufferedImage[] images) {

        

        int n = images.length;

        

        // Assuming that all images have the same dimensions

        int w = images[0].getWidth();

        int h = images[0].getHeight();

        

        

        BufferedImage average =

                new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);

        

        WritableRaster raster =

                average.getRaster().createCompatibleWritableRaster();

        

        for (int y=0; y < h; ++y)

            for (int x=0; x < w; ++x) {

                

                float sum = 0.0f;

            

                for (int i=0; i<n; ++i)

                    sum = sum + images[i].getRaster().getSample(x, y, 0);

            

                raster.setSample(x, y, 0, Math.round(sum/n));            

            }

        

        average.setData(raster);

        

        return average;

    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>