Формат 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;