2017-05-03 1 views
0

Ich muss zwei Farben RBG Bilder vergleichen und ein Ergebnis Bilder der Differenz Pixel für Pixel erhalten. Gibt es eine Idee, wie kann ich das in Qt tun?Wie zwei RGB-Bilder in Qt zu vergleichen?

Ich würde für jede Hilfe oder Beratung zu schätzen wissen.

+0

Je nachdem, was Sie versuchen zu tun ... Ich weiß, dass Interpolation im RGB-Raum in der Regel schlecht ist. Ich bin mir nicht sicher, wie der Unterschied funktionieren würde. Ich wäre versucht, es in HSV-Raum zu konvertieren und dort eine Art von Subtraktion oder Korrelation zu machen. Ich kenne mich mit diesem Bereich nicht sehr gut aus, aber vielleicht möchten Sie sich die OpenCV-Dokumente ansehen und sehen, ob sie bereits ein Werkzeug haben, das Ihr Problem löst. – RyanP

Antwort

0

Zunächst wird ein RGB-Bild ist eine 3-dimensionale Matrix, die die 3 Kanäle (R, G, B)

enthaltend die Differenz zu erreichen, um die Matrices einfach subtrahieren kann.

Wenn Sie OpenCv verwenden, beachten Sie den folgenden Code, andernfalls können Sie die Matrizen durchlaufen und jede Position separat subtrahieren.

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

using namespace cv; 

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

Mat diff_img = img - img2; 
0

Mit QImage Sie auf Pixelebene durchlaufen kann und einfach Ausgang der RBG Unterschiede in ein drittes Bild.

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

Denken Sie daran, die Reihe nacheinander für eine optimale Leistung zu durchlaufen. Das bedeutet, dass die Zeile Ihre innere Schleife sein sollte. Die meiste Zeit machen die Leute instinktiv das Gegenteil, wahrscheinlich weil die meisten Leute der Breite nach Vorrang einräumen und daher die Reihe als äußere Schleife setzen. Hier

2

ist eine Alternative auf der Grundlage dieser QtForum Frage:

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]; 
    } 
    } 
} 
+0

Es sieht nicht so aus, als ob dieser Code in Bezug auf die Bestimmung der "Farbdifferenz" korrekt ist - er findet lediglich den Unterschied zwischen zwei Ints, die zum Speichern von Farbinformationen verwendet werden. Wenn Sie also den Unterschied zwischen einem roten und einem blauen Pixel berechnen, erhalten Sie ein rotes Ergebnis, wenn der tatsächliche Farbunterschied zwischen Rot und Grün gelb ist. – dtech

+0

@dtech, guter Punkt, aber es hängt davon ab, was Sie mit dem 'Ergebnis' Bild tun werden. Sie können über RGB-Farbe als 3D-Vektor von Ints denken, und dieser Unterschied ist der Vektor, der von "rgbLeft" zu "rgbRigth" in einer 3D-Darstellung des RGB-Raums geht. – Rama

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

Rückkehr ähnlich;

}