В качестве учебного упражнения для себя я пишу приложение, которое может усреднять кучу изображений.Это часто используется в астрофотографии для уменьшения шума.
Я использую библиотеку Magick ++, и мне действительно удалось написать приложение.Но, к сожалению, это медленно.Вот код, который я использую:
for(row=0;row<rows;row++)
{
for(column=0;column<columns;column++)
{
red.clear(); blue.clear(); green.clear();
for(i=1;i<10;i++)
{
ColorRGB rgb(image[i].pixelColor(column,row));
red.push_back(rgb.red());
green.push_back(rgb.green());
blue.push_back(rgb.blue());
}
redVal = avg(red);
greenVal = avg(green);
blueVal = avg(blue);
redVal = redVal*MaxRGB; greenVal = greenVal*MaxRGB; blueVal = blueVal*MaxRGB;
Color newRGB(redVal,greenVal,blueVal);
stackedImage.pixelColor(column,row,newRGB);
}
}
Код усредняет 10 изображений, проходя каждый пиксель и добавляя интенсивность пикселей каждого канала в вектор double .Затем функция avg принимает вектор в качестве параметра и усредняет результат.Это среднее затем используется в соответствующем пикселе в stackedImage - который является результирующим изображением.Работает просто отлично, но как я уже говорил, меня не устраивает скорость.Это занимает 2 минуты и 30 секунд на компьютере с Core i5.Изображения 8-мегапиксельные и 16-битные TIFF.Я понимаю, что это много данных, но я видел, что это делается быстрее в других приложениях.
Это мой цикл, который работает медленно или pixelColor (x, y) медленный способполучить доступ к пикселям на изображении?Есть ли более быстрый способ?