Я хочу рассчитать среднее изображение из трех разных изображений того же размера, что и у меня. Я знаю, что это можно легко сделать в Matlab .. но как мне это сделать в С #? Также есть ли инструмент Aforge.net, который я могу использовать непосредственно для этой цели?
Выполнение усреднения нескольких изображений в c #
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
Для C # существует привязка Magick.NET (imagemagick.org/script/api.php # dot-net)
- person dlemstra; 12.06.2014
@dlemstra +1 Спасибо за понимание - хорошо узнавать что-то новое :-)
- person Mark Setchell; 12.06.2014
Вы можете изменить свой ответ?
- person dlemstra; 12.06.2014