[PYTHON] Vergleichen wir die beiden Bilder und suchen nach Fehlern

Versuchen Sie, Fehler mit OpenCV und Python zu finden.

Vorbereitung

Machen Sie zuerst ein Bild, um Fehler zu finden. Es ist schwierig zu machen, deshalb leihe ich mir diesmal das Bild der Webseite aus Abbildung 01 (Anfänger) zur Suche nach Gehirntrainingsfehlersuchen. ..

Und da dieses Bild vertikal mit A-Bild und B-Bild verbunden ist, ist es in obere und untere Teile unterteilt. Konvertieren Sie es nicht nur in zwei Teile, sondern konvertieren Sie es auch in das PNG-Format, um es mit OpenCV zu verarbeiten.

convert -crop 100%x50% image02.gif image02.png

Dadurch werden die oberen und unteren geteilten Dateien iamge02-0.png und image02-1.png erstellt, und Sie können loslegen.

Da die Beschriftungen im oberen Bild als "A" und im unteren Bild als "B" geschrieben sind, werden die Dateinamen in image02A.png und image02B.png geändert.

convert image02.gif image02.Sie können es png und mit Python teilen.



```python
import cv2

img = cv2.imread('img/image02.png')
height, width, _ = img.shape
imageA = img[0:round(height/2), :]
imageB = img[round(height/2):, :]
cv2.imwrite('img/image02A.png', imageA)
cv2.imwrite('img/image02B.png', imageB)

Finde den Unterschied 1

Laden Sie ein Bild und ein B-Bild und versuchen Sie die Funktionserkennung.

def matchAB(fileA, fileB):
    #Bilder laden
    imgA = cv2.imread(fileA)
    imgB = cv2.imread(fileB)

    #Graue Umwandlung
    grayA = cv2.cvtColor(imgA, cv2.COLOR_BGR2GRAY)
    grayB = cv2.cvtColor(imgB, cv2.COLOR_BGR2GRAY)

    #Extraktion der AKAZE-Merkmalsmenge
    akaze = cv2.AKAZE_create()
    kpA, desA = akaze.detectAndCompute(grayA, None)
    kpB, desB = akaze.detectAndCompute(grayB, None)

    #BFMatcher Definition und Bildgebung
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    matches = bf.match(desB, desB)
    matches = sorted(matches, key=lambda x: x.distance)
    matched_image = cv2.drawMatches(imgA, kpA, imgB, kpB, matches, None, flags=2)
    
    #Anzeige
    plt.imshow(cv2.cvtColor(matched_image, cv2.COLOR_BGR2RGB))
    plt.show()

Figure_001.png

Offensichtlich würde die obige Methode "übereinstimmende Orte" markieren, aber dies ist nicht gut, da es nur 5 falsche Orte gibt.

Finde den Unterschied 2

Was ist die Suche nach Fehlern überhaupt? Mit anderen Worten, wenn die beiden Bilder überlagert werden, können die Umrisse der jeweils gezeichneten Bilder geringfügig unterschiedlich sein.

In Anbetracht der Möglichkeit, dass Bild A und Bild B leicht falsch ausgerichtet sind, haben wir uns entschlossen, die Position zu finden, an der das durch Teilen von Bild A erstellte Fenster am besten mit Bild B übereinstimmt, und ein Differenzbild zu erstellen. tat.

def matchAB(fileA, fileB):
    #Bilder laden
    imgA = cv2.imread(fileA)
    imgB = cv2.imread(fileB)

    #Graue Umwandlung
    grayA = cv2.cvtColor(imgA, cv2.COLOR_BGR2GRAY)
    grayB = cv2.cvtColor(imgB, cv2.COLOR_BGR2GRAY)

    #Bildgröße abrufen
    height, width = grayA.shape
    #Machen Sie ein Teilbild und passen Sie es an
    result_window = np.zeros((height, width), dtype=imgA.dtype)
    for start_y in range(0, height-100, 50):
        for start_x in range(0, width-100, 50):
            window = grayA[start_y:start_y+100, start_x:start_x+100]
            match = cv2.matchTemplate(grayB, window, cv2.TM_CCOEFF_NORMED)
            _, _, _, max_loc = cv2.minMaxLoc(match)
            matched_window = grayB[max_loc[1]:max_loc[1]+100, max_loc[0]:max_loc[0]+100]
            result = cv2.absdiff(window, matched_window)
            result_window[start_y:start_y+100, start_x:start_x+100] = result

	plt.imshow(result_window)

Damit stellte sich heraus, dass es eine Position gab, in der der Unterschied irgendwie groß war.

Figure_002.png

Fortsetzung der Suche nach Unterschieden 2

Dieses Mal werde ich also die Koordinaten der "Position, an der es einen Unterschied gibt" im Differenzbild erfassen und versuchen, sie dem Originalbild zu überlagern. Insbesondere werden die Koordinatenwerte durch Extrahieren des Umrisses der "Position mit Unterschied" erfasst, und auf der Grundlage der Koordinatenwerte wird ein Quadrat auf dem Originalbild gezeichnet.

def matchAB(fileA, fileB):
    #Bilder laden
    imgA = cv2.imread(fileA)
    imgB = cv2.imread(fileB)

    #Graue Umwandlung
    grayA = cv2.cvtColor(imgA, cv2.COLOR_BGR2GRAY)
    grayB = cv2.cvtColor(imgB, cv2.COLOR_BGR2GRAY)

    #Bildgröße abrufen
    height, width = grayA.shape
    #Machen Sie ein Teilbild und passen Sie es an
    result_window = np.zeros((height, width), dtype=imgA.dtype)
    for start_y in range(0, height-100, 50):
        for start_x in range(0, width-100, 50):
            window = grayA[start_y:start_y+100, start_x:start_x+100]
            match = cv2.matchTemplate(grayB, window, cv2.TM_CCOEFF_NORMED)
            _, _, _, max_loc = cv2.minMaxLoc(match)
            matched_window = grayB[max_loc[1]:max_loc[1]+100, max_loc[0]:max_loc[0]+100]
            result = cv2.absdiff(window, matched_window)
            result_window[start_y:start_y+100, start_x:start_x+100] = result

    #Extrahieren Sie den Umriss des Differenzbildes, das als Ergebnis des Abgleichs erstellt wurde, und schließen Sie es in ein Quadrat ein
    _, result_window_bin = cv2.threshold(result_window, 127, 255, cv2.THRESH_BINARY)
    _, contours, _ = cv2.findContours(result_window_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    imgC = imgA.copy()
    for contour in contours:
        min = np.nanmin(contour, 0)
        max = np.nanmax(contour, 0)
        loc1 = (min[0][0], min[0][1])
        loc2 = (max[0][0], max[0][1])
        cv2.rectangle(imgC, loc1, loc2, 255, 2)

    #Bild anzeigen
    plt.subplot(1, 3, 1), plt.imshow(cv2.cvtColor(imgA, cv2.COLOR_BGR2RGB)), plt.title('A'), plt.xticks([]), plt.yticks([])
    plt.subplot(1, 3, 2), plt.imshow(cv2.cvtColor(imgB, cv2.COLOR_BGR2RGB)), plt.title('B'), plt.xticks([]), plt.yticks([])
    plt.subplot(1, 3, 3), plt.imshow(cv2.cvtColor(imgC, cv2.COLOR_BGR2RGB)), plt.title('Answer'), plt.xticks([]), plt.yticks([])
    plt.show()

Figure_003.png

Das Bild ist klein und schwer zu sehen, aber es scheint, dass 5 Fehler vorgeschlagen werden können, mit Ausnahme des Teils des Etiketts mit A oder B oben links.

Zusammenfassung

Es stellte sich heraus, dass es eine Möglichkeit gibt, das Fehlersuchquiz zu lösen, indem mit OpenCV ein Differenzbild erstellt wird.

Der heutige Code

Recommended Posts

Vergleichen wir die beiden Bilder und suchen nach Fehlern
Vergleichen wir die Fourier-Transformation der synthetisierten Schallquelle und die Zusammensetzung der Fourier-Transformation
Versuchen wir zum ersten Mal Linux
Vergleichen Sie die Geschwindigkeit von Python Append und Map