Как смешать / объединить два изображения в формате pgm в программе на c ++ - PullRequest
0 голосов
/ 28 апреля 2011

Так что я новичок в этом, а также новичок в c ++, но я застрял в создании этого класса для смешивания двух входных изображений.Я знаю, что мне нужно создать пустую матрицу, ввести два изображения для смешивания, для каждого пикселя пустой матрицы установить его равным среднему значению этого же пикселя в двух других изображениях, трудная часть - написание кодаза это .... любой вклад очень ценится !!

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Формат PGM действительно прост: http://en.wikipedia.org/wiki/Portable_graymap

Так что используйте эту информацию для считывания изображений в массивы, затем выполните, как вы сказали, итерацию по массивам и вставьте средние значения пикселей в другой массив. Затем запишите это в другой файл и используйте программу для работы с изображениями, которая может просматривать изображения pgm, чтобы увидеть ваш результат.

Вот некоторый код, который записывает изображение размером 3 на 3 пикселя в формате pgm:

std::cout << "P2\n";
std::cout << "3 3\n";
std::cout << "10\n";
std::cout << "0 10 0\n";
std::cout << "10 0 10\n";
std::cout << "0 10 0\n";

Вот код, который использует valarrays для смешивания:

std::valarray<int> imageA,imageB;
//add code to load image data into valarrays here
//the next line does the blending, adding corresponding pixel values together and dividing by two to get the average
std::valarray<int> blend = (imageA + imageB) / 2; 
0 голосов
/ 28 апреля 2011

Ну, сначала вам нужно прочитать изображение с диска и в память.Вероятно, лучше всего найти библиотеку .png, иначе вам придется свернуть свою собственную.Вот отправная точка для этого (http://www.libpng.org/pub/png/pngaptk.html).

Далее вам нужно взять вывод из png-ридера и преобразовать его в нужный вам формат. Скорее всего, на выходе уже будет двухмерный массив, так что вы будетеЗатем вы просто читаете каждый файл (если он большой, то есть не может поместиться в памяти), тогда вам нужно будет сделать это по плиткам или линиям сканирования, усреднить массивы, а затем отправить новый созданный вами массиввернемся к API записи png.

Если это должно быть сделано в c ++, это общий способ, которым вы можете это сделать. Если вы можете получить IDL или ENVI, это может быть сделано примерно в 5 строках кода.

...