C ++ - 比较两个.jpeg / .png图片并将不同的像素打印到矩阵中

时间:2017-06-02 12:14:57

标签: c++ image matrix

我是C ++的新手并且经常挣扎。我想做一个简单的程序来比较两个给定的.png /.jpeg图片,并将不同的像素打印成矩阵到控制台。

我想使用libpng或libjpeg库和stantard库。

所以例如:让我们说picture1只包含白色像素,并且有5x5像素。而picture2包含白色像素作为背景和大字母" T"黑色像素,有5x5像素。所以在控制台中打印的结果将是:

- 0 1 2 3 4 0 X X X X X 1 o o X o o 2 o o X o o 3 o o X o o 4 o o X o o

X - 表示此位置上的像素不同, o - 表示此位置的像素相同

我的第一个想法是将两个文件加载到矩阵中,然后将它们比作picture1Matrix[ i ][ j ] == picture2Matrix[ i ][ j ]。对我来说最大的问题是将图片加载到矩阵中。到目前为止,我能够打开流。

std::ifstream inputStreamFile1( fileName1, std::ios::binary );

if( !inputStreamFile1.is_open() || !inputStreamFile1.good() ) throw  "Couldn't open first given file!";

另外我不知道是否以正确的方式打开它。

你会如此善良并用简单的例子帮助我如何完成这项具体任务?我正在寻找代码将小的.png / .jpeg文件加载到矩阵中,以便我可以进行比较

这是我的第一个问题,所以我为糟糕的问题形成以及我糟糕的英语道歉。

编辑:我也不知道选择哪种格式。 .jpeg或.png。我不知道使用图片格式的差异

1 个答案:

答案 0 :(得分:0)

假设它们具有相同的尺寸,您可以使用英特尔的OpenCV库来执行这些操作。

鉴于您已安装了库,您可以非常轻松地执行此操作:

//read in the images
cv::Mat picture1= imread("image1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat picture2= imread("image2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat difference;

//compute the difference
cv::absdiff(picture1, picture2, difference);

difference现在包含不同的像素。要查看它,请使用imshow("windowname", difference)并将其打印到终端流

cout << "Difference = "<< endl << " " << Difference << endl << endl;