Ein Bekannter sagte, ich brauche ein Programm, um die Unterschiede zwischen den Bildern zu vergleichen, also habe ich es mit Python und OpenCV erstellt. Der Punkt ist, mit OpenCV nach Fehlern zu suchen, aber ** die Bedingung ist, dass es keine Diskrepanz zwischen den Bildern gibt **, so dass es möglicherweise nicht für praktische Zwecke geeignet ist. Wenn Sie eine robustere Suche nach Fehlern benötigen, lesen Sie möglicherweise diesen Artikel. Ich denke, die Implementierung ist ungefähr zehnmal leichter als die Methode in diesem Artikel ...
Das folgende Bild wird ausgegeben.
(Das Bild ist Wikipedia Mehr zitiert)
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread('img1.png')
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
img1 = img1/255
img2 = cv2.imread('img2.png')
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
img2 = img2/255
dif = cv2.absdiff(img1,img2)
dif[dif>0] = 1
fig,axs = plt.subplots(2,2)
ar = axs.ravel()
ar[0].imshow(img1)
ar[1].imshow(img2)
ar[2].imshow(img1*dif*0.8 + img1*0.2)
ar[3].imshow(img2*dif*0.8 + img2*0.2)
plt.show()
Die wesentliche Verarbeitung von OpenCV besteht nur aus wenigen Zeilen, die Vorverarbeitung für die Anzeige mit matplotlib dauert jedoch einige Zeilen. Der Punkt ist, dass Sie mit cv2.absdiff
ein Differenzbild erhalten können, also verwende ich es als Maske. Wenn diff unverändert bleibt, wird die Differenz für jeden RGB-Kanal genommen, sodass sie durch die Operation "dif [dif> 0] = 1" maskiert wird.
Der Punkt, der länger als erwartet gedauert hat, ist, dass die Bilddaten von OpenCV sowohl den Typ "int" als auch den Typ "float" annehmen können, was normalerweise praktisch ist, aber diesmal hat die Maske nicht gut funktioniert. Wenn das Bild gelesen wird, wird es daher "/ 255" und gewaltsam in "float" umgewandelt.
Recommended Posts