【问题标题】:How to compare two RGB images in Qt?如何在 Qt 中比较两个 RGB 图像?
【发布时间】:2017-05-03 13:05:03
【问题描述】:

我需要比较两个彩色 RBG 图像并逐个像素地获得差异图像。有什么想法我可以在 qt 中做到这一点吗?

如果您有任何帮助或建议,我将不胜感激。

【问题讨论】:

  • 取决于你想要做什么......我知道插值在 RGB 空间中通常很差。我不确定差异将如何发挥作用。我很想将其转换为 HSV 空间并在那里进行某种减法或相关运算。我对那个领域不太熟悉,但您可能想查看 OpenCV 文档,看看他们是否已经有了解决您问题的工具。

标签: c++ qt qt4 qt-creator


【解决方案1】:

这是基于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];
    }
  }
}

【讨论】:

  • 在确定“色差”方面,这段代码看起来并不正确——它只是找到了用于存储颜色信息的两个整数之间的差异。因此,如果您计算红色像素和蓝色像素之间的差异,当红色和绿色之间的实际颜色差异为黄色时,它会给您一个红色的结果。
  • @dtech,说得好,但这取决于您要如何处理 result 图像。您可以将 RGB 颜色视为整数的 3D 向量,这种差异是 RGB 空间的 3D 表示中从 rgbLeft 到 rgbRigth 的向量。
【解决方案2】:

首先,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;

【讨论】:

    【解决方案3】:

    使用QImage,您可以在像素级别上进行迭代,并将 RBG 差异简单地输出到第三张图像中。

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

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

    【讨论】:

      【解决方案4】:

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

      返回相似的;

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 2015-05-27
        • 2011-08-29
        • 2011-12-04
        相关资源
        最近更新 更多