如何在c ++程序中将两个图像与pgm格式混合/合并

时间:2011-04-28 18:59:55

标签: c++ image class matrix blend

所以我是新手,也是c ++的新手,但我仍然坚持创建这个类来混合两个输入图像。我知道我必须创建一个空白矩阵,输入要混合的两个图像,对于空矩阵集的每个像素,它等于其他两个图像中相同像素位置的平均值,困难的部分是编写代码对于它....任何输入都非常感谢!!

2 个答案:

答案 0 :(得分:2)

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";

以下是一些使用valarray进行混合的代码:

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; 

答案 1 :(得分:0)

首先,您需要从磁盘和内存中读取图像。最好找一个.png库,否则你必须自己动手。这是一个起点(http://www.libpng.org/pub/png/pngaptk.html)。

接下来,您需要从png阅读器获取输出并将其转换为您想要的格式。可能输出已经是2D数组,所以你将被设置在那里。然后你只需读取每个文件(如果它们很大,即不能适合内存)那么你需要通过磁贴或扫描线来做,平均数组,然后将你创建的新数组发送回png writer API。

如果要用c ++完成,那么这就是你可以做到的一般方法。如果你能掌握IDL或ENVI,可以在大约5行代码中完成。