我需要比较两个颜色的RBG图像,并逐个像素地获得差异的结果图像。有什么想法我怎么能在qt中做到这一点?
我希望得到任何帮助或建议。
答案 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;
}
}
返回类似;
}