如何在Qt中比较两个RGB图像?

时间:2017-05-03 13:05:04

标签: c++ qt qt4 qt-creator

我需要比较两个颜色的RBG图像,并逐个像素地获得差异的结果图像。有什么想法我怎么能在qt中做到这一点?

我希望得到任何帮助或建议。

4 个答案:

答案 0 :(得分:3)

以下是基于此QtForum问题的替代方案:

void substract(const QImage &left, const QImage &rigth, QImage &result)
{
  int w=min(left.width(), rigth.width());
  int h=min(left.height(),rigth.height();
  w=min(w, result.width());
  h=min(h, result.height();
  //<-This ensures that you work only at the intersection of images areas

  for(int i=0;i<h;i++){
    QRgb *rgbLeft=(QRgb*)left.constScanLine(i);
    QRgb *rgbRigth=(QRgb*)rigth.constScanLine(i);
    QRgb *rgbResult=(QRgb*)result.constScanLine(i);
    for(int j=0;j<w;j++){
        rgbResult[j] = rgbLeft[j]-rgbRigth[j];
    }
  }
}

答案 1 :(得分:0)

首先,RGB图像是包含3个通道(R,G,B)

的3维矩阵

为了达到差异,你可以简单地减去矩阵。

如果你正在使用OpenCv考虑下面的代码,否则你可以遍历矩阵并分别减去每个位置。

#include <cv.h>
#include <highgui.h>

using namespace cv;

Mat img = imread("...");
Mat img2 = imread("...");

Mat diff_img = img - img2;

答案 2 :(得分:0)

使用QImage可以迭代像素级别,只需将RBG差异输出到第三个图像。

QRgb QImage::pixel(int x, int y) const
void QImage::setPixelColor(int x, int y, const QColor &color)

请记住按顺序迭代行以获得最佳性能。意味着该行应该是您的内部循环。很多时候人们本能地做相反的事情,可能是因为大多数人优先考虑宽度超过高度,因此将行作为外环。

答案 3 :(得分:-1)

bool ImagesAreSimilar(QImage * img1,QImage * img2) {

if (img1->isNull()||img2->isNull())
{
  return false ;
}
if (img1->height()!=img2->height()) {
    return false ;
}
if (img1->width()!=img2->width()) {
    return false ;
}
 auto pixel1 = img1->bits();
 auto pixel2 = img2->bits();
 bool similar=true;
for (int y = 0; y < img1->height(); y++)
{
    for (int x = 0; x < img1->width(); x++)
    {

        if (    (pixel1[0]!=pixel2[0])||
                (pixel1[1]!=pixel2[1])||
                (pixel1[2]!=pixel2[2])||
                (pixel1[3]!=pixel2[3])) {
                return false ;
        }
        pixel1  += 4;
        pixel2 += 4;
    }
}

返回类似;

}