Выполнение усреднения нескольких изображений в c #

Я хочу рассчитать среднее изображение из трех разных изображений того же размера, что и у меня. Я знаю, что это можно легко сделать в Matlab .. но как мне это сделать в С #? Также есть ли инструмент Aforge.net, который я могу использовать непосредственно для этой цели?


person Kapil    schedule 12.06.2014    source источник
comment
Не могли бы вы объяснить, что означает среднее изображение? Это среднее пиксельное значение RGB для трех изображений?   -  person Robert J.    schedule 12.06.2014
comment
Да @RobertJ. Я имею в виду усреднение RGB   -  person Kapil    schedule 12.06.2014
comment
Вы хотите, чтобы процесс был быстрым или простым?   -  person Robert J.    schedule 12.06.2014
comment
Быстро! .. Я пробовал заблокировать растровые изображения и взять среднее значение RGB и присвоить его результирующему изображению, но получаю абсурдные результаты ...   -  person Kapil    schedule 12.06.2014
comment
Что ж, LockBits будет подходящим вариантом, imho. Может проблема была в ваших расчетах? Как вы получили среднее значение RGB? вы пытались усреднить значения каждого R | G | B для трех изображений или вы просто умножили значение R G B для каждого изображения и усреднили значения?   -  person Robert J.    schedule 12.06.2014
comment
Пожалуйста, опубликуйте свой код, который дает абсурдные результаты, у вас может быть только один неправильный символ / цифра, который кто-то может легко заметить, а не переписывать все.   -  person Mark Setchell    schedule 12.06.2014


Ответы (2)


Я нашел статью о SO, которая может указать вам правильное направление. Вот код (небезопасно)

BitmapData srcData = bm.LockBits(
            new Rectangle(0, 0, bm.Width, bm.Height), 
            ImageLockMode.ReadOnly, 
            PixelFormat.Format32bppArgb);

int stride = srcData.Stride;

IntPtr Scan0 = srcData.Scan0;

long[] totals = new long[] {0,0,0};

int width = bm.Width;
int height = bm.Height;

unsafe
{
  byte* p = (byte*) (void*) Scan0;

  for (int y = 0; y < height; y++)
  {
    for (int x = 0; x < width; x++)
    {
      for (int color = 0; color < 3; color++)
      {
        int idx = (y*stride) + x*4 + color;

        totals[color] += p[idx];
      }
    }
  }
}

int avgB = totals[0] / (width*height);
int avgG = totals[1] / (width*height);
int avgR = totals[2] / (width*height);

Вот ссылка на статью: Как вычислить средние значения цвета RGB для растрового изображения

person Robert J.    schedule 12.06.2014

ImageMagick может сделать это за вас очень просто - в командной строке вы можете ввести следующее:

convert *.bmp -evaluate-sequence mean output.jpg

Вы также можете рассчитать медианное значение (вместо среднего) для группы файлов TIFF и сохранить в выходной файл PNG следующим образом:

convert *.tif -evaluate-sequence median output.png

Легко, а?

Существуют привязки для C / C ++, Perl, PHP и всевозможных других языковых интерфейсов, включая (как любезно указал @dlemstra) доступную привязку Magick.Net здесь.

ImageMagick - мощный, бесплатный и доступный здесь.

person Mark Setchell    schedule 12.06.2014
comment
Для C # существует привязка Magick.NET (imagemagick.org/script/api.php # dot-net) - person dlemstra; 12.06.2014
comment
@dlemstra +1 Спасибо за понимание - хорошо узнавать что-то новое :-) - person Mark Setchell; 12.06.2014
comment
Вы можете изменить свой ответ? - person dlemstra; 12.06.2014