OpenCV-Erkennt ähnliche Bildunterschiede in Python

Was du machen willst

Überprüfen Sie beispielsweise das Erscheinungsbild von in PDF konvertierten OFFICE-Dokumenten mit einer anderen Formatierungs-Engine. Ich möchte ein Bild, das als Beweismittel verwendet werden kann, damit die Leute es verstehen können. Außerdem ist es schwierig, alle Bilder zu sehen, daher gebe ich dem Grad des Unterschieds einen numerischen Wert, und die Leute überprüfen nur diejenigen mit dem großen Unterschied.

Was vorzubereiten?

Es ist inoffiziell, aber es gibt eine OpenCV-Python-Umgebung, also werde ich sie schnell einfügen. pip install opencv-python Die abhängige Anzahl ist ebenfalls enthalten.

https://pypi.org/project/opencv-python/

Python-Code

diff_img.py


import pathlib
import cv2
import numpy as np

source_dir = pathlib.Path('source_img')
source_files = source_dir.glob('*.*')
target_dir = pathlib.Path('target_img')
result_dir = pathlib.Path('result_img')
log_file = result_dir / pathlib.Path('result.log')
kernel = np.ones((3, 3), np.uint8)

fs = open(log_file, mode='w')
for source_file in source_files:
    source_img = cv2.imread(str(source_file))
    target_file = target_dir / source_file.name
    target_img = cv2.imread(str(target_file))
    if target_img is None:
        fs.write(target_file + '...skipped.\n')
        continue
    max_hight = max(source_img.shape[0], target_img.shape[0])
    max_width = max(source_img.shape[1], target_img.shape[1])

    temp_img = source_img
    source_img = np.zeros((max_hight, max_width, 3), dtype=np.uint8)
    source_img[0:temp_img.shape[0], 0:temp_img.shape[1]] = temp_img

    temp_img = target_img
    target_img = np.zeros((max_hight, max_width, 3), dtype=np.uint8)
    target_img[0:temp_img.shape[0], 0:temp_img.shape[1]] = temp_img

    result_img = cv2.addWeighted(source_img, 0.5, target_img, 0.5, 0)

    source_img = cv2.cvtColor(source_img, cv2.COLOR_BGR2GRAY)
    target_img = cv2.cvtColor(target_img, cv2.COLOR_BGR2GRAY)
    img = cv2.absdiff(source_img, target_img)
    rtn, img = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)
    img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

    contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE,
                                           cv2.CHAIN_APPROX_SIMPLE)
    result_img = cv2.drawContours(result_img, contours, -1, (0, 0, 255))
    score = 0
    for contour in contours:
        score += cv2.contourArea(contour)
    score /= max_hight * max_width
    fs.write(target_file.name + ', ' + str(score) + '\n')
    diff_file = result_dir / source_file.name
    cv2.imwrite(str(diff_file), result_img)
fs.close()

Informationen zur Vergleichsmethode finden Sie in diesem Artikel [Es war zu schwierig, einen Fehler in Saiseriya zu finden, deshalb habe ich ihn mit Hilfe eines Erwachsenen gelöst] (http://kawalabo.blogspot.com/2014/11/blog-post.html) http://kawalabo.blogspot.com/2014/11/blog-post.html Wird bezeichnet.

Die Punktzahl wird einfach berechnet, indem der Bereich des Bereichs, in dem der Unterschied festgestellt wurde, herausgenommen, durch den Bereich des gesamten Bildes dividiert und zusammen mit dem Dateinamen im Protokoll ausgespuckt wird.

result.log


test-1.png, 0.01231201710816777
test-2.png, 0.0084626793598234

Hinzugefügt am 7. Januar 2020

Ausführungsbeispiel

test-1.png Obwohl es sich um eine ähnliche Tabelle handelt, war die Breite des Vergleichsziels etwas kleiner und der Rand größer.

Recommended Posts

OpenCV-Erkennt ähnliche Bildunterschiede in Python
opencv-python Einführung in die Bildverarbeitung