Frage

Hier ist, was ich tun möchte:

ich Bilder mit einer Webcam in regelmäßigen Abständen nehmen. Wie eine Art Verstreichen Sache der Zeit. wenn nichts hat sich jedoch wirklich verändert, das heißt, das Bild ziemlich sieht das gleiche, ich will nicht den neuesten Snapshot speichern.

Ich stelle mir vor, es gibt eine Möglichkeit, den Unterschied zu quantifizieren, und ich müsste empirisch einen Schwellenwert bestimmen.

Ich bin auf der Suche nach Einfachheit und nicht Perfektion. Ich verwende Python.

War es hilfreich?

Lösung

Allgemeine Idee

Option 1: Laden sowohl Bilder als Arrays (scipy.misc.imread) und eine Element-weise (Pixel-für-Pixel) Differenz berechnen. Berechnen Sie die Norm der Differenz.

Option 2: beide Bilder laden. Berechnen einige Merkmalsvektor für jeden von ihnen (wie ein Histogramm). Berechnen Abstand zwischen Merkmalsvektoren anstelle von Bildern.

Es gibt jedoch einige Entscheidungen zuerst zu machen.

Fragen

Sie sollten diese Fragen beantworten zuerst:

  • Sind Bilder von der gleichen Form und Dimension?

    Wenn nicht, können Sie brauchen, um sie zu vergrößern, verkleinern oder zu beschneiden. PIL Bibliothek hilft es in Python zu tun.

    Wenn sie mit den gleichen Einstellungen und demselben Gerät genommen werden, sind sie wahrscheinlich die gleiche.

  • Bilder gut ausgerichtet?

    Wenn nicht, können Sie Kreuzkorrelation ausgeführt werden soll zunächst, zuerst die beste Ausrichtung zu finden. SciPy hat Funktionen, es zu tun.

    Wenn die Kamera und die Szene noch ist, sind die Bilder wahrscheinlich gut ausgerichtet sein.

  • Ist Belichtung der Bilder immer gleich? (Ist Leichtigkeit / Kontrast gleich?)

    Wenn nicht, können Sie wollen Bilder normalisieren .

    Aber Vorsicht, in einigen Situationen diese als gut mehr falsch können tun. Zum Beispiel kann eine einzelne helle Pixel auf einem dunklen Hintergrund wird das normalisierte Bild machen ganz anders aus.

  • Ist Farbinformation wichtig?

    Wenn Sie Farbänderungen bemerken wollen, werden Sie einen Vektor von Farbwerten pro Punkt, anstatt einen skalaren Wert als in Graustufenbild. Sie brauchen mehr Aufmerksamkeit, wenn ein solcher Code zu schreiben.

  • Gibt es deutliche Kanten im Bild? Sind sie wahrscheinlich zu bewegen?

    Wenn ja, können Sie Kantendetektionsalgorithmus ersten anwenden (z Gradient berechnet mit Sobel oder Prewitt-Transformation, ein gewissen Schwelle gilt), dann Kanten Kanten auf dem zweiten auf dem ersten Bild vergleichen.

  • Gibt es das Rauschen im Bild?

    Alle Sensoren verschmutzen das Bild mit einer gewissen Menge an Lärm. Low-Cost-Sensoren haben mehr Lärm. Vielleicht möchten Sie einige Geräuschreduzierung anwenden, bevor Sie Bilder vergleichen. Blur ist die einfachste (aber nicht die beste) Ansatz hier.

  • Welche Änderungen haben Sie bemerken wollen?

    Das die Wahl der Norm beeinflussen kann, um den Unterschied zwischen den Bildern zu verwenden.

    Betrachten Manhattan-Standard benutzen (die Summe der Absolutwerte) oder Null-Norm (die Anzahl der Elemente ungleich Null) zu messen, wie viel das Bild geändert hat. Erstere werden Ihnen sagen, wie viel das Bild ab, letztere wird nur sagen, wie viele Pixel unterscheiden.

Beispiel

Ich nehme an, Ihre Bilder sind gut ausgerichtet ist, die gleiche Größe und Form, möglicherweise mit unterschiedlichen Belichtungs. Der Einfachheit halber konvertiere ich sie auch in Graustufen, wenn sie Farbe (RGB) Bilder sind.

Sie werden diese Importe müssen:

import sys

from scipy.misc import imread
from scipy.linalg import norm
from scipy import sum, average

Hauptfunktion, lesen Sie zwei Bilder, in Graustufen umwandeln, vergleichen und Druckergebnisse:

def main():
    file1, file2 = sys.argv[1:1+2]
    # read images as 2D arrays (convert to grayscale for simplicity)
    img1 = to_grayscale(imread(file1).astype(float))
    img2 = to_grayscale(imread(file2).astype(float))
    # compare
    n_m, n_0 = compare_images(img1, img2)
    print "Manhattan norm:", n_m, "/ per pixel:", n_m/img1.size
    print "Zero norm:", n_0, "/ per pixel:", n_0*1.0/img1.size

Wie zu vergleichen. img1 und img2 sind 2D-Arrays SciPy hier:

def compare_images(img1, img2):
    # normalize to compensate for exposure difference, this may be unnecessary
    # consider disabling it
    img1 = normalize(img1)
    img2 = normalize(img2)
    # calculate the difference and its norms
    diff = img1 - img2  # elementwise for scipy arrays
    m_norm = sum(abs(diff))  # Manhattan norm
    z_norm = norm(diff.ravel(), 0)  # Zero norm
    return (m_norm, z_norm)

Wenn die Datei ein Farbbild ist, kehrt imread einen 3D-Array, mittlere RGB-Kanäle (die letzte Feldachse) Intensität zu erhalten. Keine Notwendigkeit für Graustufenbilder zu tun (zum Beispiel .pgm):

def to_grayscale(arr):
    "If arr is a color image (3D array), convert it to grayscale (2D array)."
    if len(arr.shape) == 3:
        return average(arr, -1)  # average over the last axis (color channels)
    else:
        return arr

Normalisierungs ist trivial, können Sie wählen, um [0,1] anstelle von [0255] zu normalisieren. arr ist ein SciPy Array hier, so dass alle Vorgänge sind elementweise:

def normalize(arr):
    rng = arr.max()-arr.min()
    amin = arr.min()
    return (arr-amin)*255/rng

Führen Sie die main Funktion:

if __name__ == "__main__":
    main()

Jetzt können Sie diese setzen alle in einem Skript und laufen gegen zwei Bildern. Wenn wir Bild auf sich selbst zu vergleichen, gibt es keinen Unterschied:

$ python compare.py one.jpg one.jpg
Manhattan norm: 0.0 / per pixel: 0.0
Zero norm: 0 / per pixel: 0.0

Wenn wir das Bild und vergleichen Sie mit dem Original verschwimmen, gibt es einige Unterschiede:

$ python compare.py one.jpg one-blurred.jpg 
Manhattan norm: 92605183.67 / per pixel: 13.4210411116
Zero norm: 6900000 / per pixel: 1.0

P. S. Entire compare.py Skript.

Update: relevante Techniken

Wie die Frage nach einer Videosequenz ist, wo Frames sind wahrscheinlich fast die gleiche sein, und Sie suchen nach etwas ungewöhnlich, ich möchte einige alternative Ansätze nennen, die relevant sein können:

  • Untergrundsubtraktion und Segmentierung (auf Vordergrundobjekte zu erfassen)
  • sparse optischer Fluss (erkennen Bewegung)
  • Histogramme oder einige andere Statistiken anstelle von Bildern zu vergleichen

Ich empfehle einen Blick auf „Learning OpenCV“ Buch nehmen, Kapitel 9 (Bildteile und Segmentierung) und 10 (Tracking and motion). Der ehemalige lehrt Hintergrund Subtraktion Methode zu verwenden, letztere einige Informationen über optische Flow-Verfahren gibt. Alle Methoden sind in OpenCV-Bibliothek implementiert. Wenn Sie Python verwenden, schlage ich OpenCV ≥ 2,3, und sein cv2 Python-Modul zu verwenden.

Die einfachste Version des Untergrundsubtraktion:

  • lernen den Mittelwert μ und Standardabweichung σ für jedes Pixel des Hintergrunds
  • Vergleichen aktuellen Pixelwerte auf den Bereich von (μ-2σ, μ + 2σ) oder (μ-σ, μ + σ)

Weitere erweiterte Versionen berücksichtigt Zeitreihen für jedes Pixel nehmen machen und behandeln nicht-statische Szenen (wie Bäume oder Gras bewegt).

Die Idee des optischen Flusses ist, zwei oder mehr Rahmen zu nehmen, und Geschwindigkeitsvektor für jedes Pixel (dichte optische Strömung) oder einige von ihnen (sparse optischem Fluss) zugewiesen werden. Um spärlichen optischen Flusses zu schätzen, können Sie Lucas-Kanade Methode (es verwenden wird auch in OpenCV) umgesetzt. Natürlich, wenn es eine Menge Flow (hohe Durchschnitt über Max-Wert des Geschwindigkeitsfeldes), dann in dem Rahmen etwas bewegt, und nachfolgende Bilder sind anders.

Beim Vergleich von Histogrammen helfen können plötzliche Veränderungen zwischen aufeinanderfolgenden Rahmen zu erfassen. Dieser Ansatz wurde verwendet, in Courbon et al, 2010 :

  

Ähnlichkeit aufeinanderfolgender Rahmen. Der Abstand zwischen zwei aufeinanderfolgenden Vollbildern gemessen wird. Wenn sie zu hoch ist, bedeutet dies, dass der zweite Rahmen beschädigt ist und somit wird das Bild eliminiert. Die Kullback-Leibler-Distanz oder gegenseitige Entropie auf die Histogramme der zwei Rahmen:

     

$$ d (p, q) = \ sum_i p (i) \ log (p (i) / q ( i)) $$

     

Dabei steht p und q sind die Histogramme der Rahmen verwendet wird. Der Schwellenwert wird auf 0,2 festgelegt.

Andere Tipps

Eine einfache Lösung:

Encode das Bild als jpeg und suchen Sie nach einer wesentlichen Änderung in Dateigröße .

ich etwas ähnliches mit Video-Thumbnails implementiert haben, und hatte viel Erfolg und Skalierbarkeit.

Sie können vergleichen zwei Bilder mit den Funktionen von PIL .

import Image
import ImageChops

im1 = Image.open("splash.png")
im2 = Image.open("splash2.png")

diff = ImageChops.difference(im2, im1)

Das diff-Objekt ist ein Bild, in dem jedes Pixel das Ergebnis der Subtraktion der Farbwerte des Pixels in dem zweiten Bild aus dem ersten Bild ist. das diff Bild verwenden, können Sie mehrere Dinge tun. Die einfachste ist die diff.getbbox() Funktion. Es wird Ihnen das minimale Rechteck sagen, dass alle Änderungen zwischen zwei Bildern enthält.

Sie können sich wahrscheinlich Annäherungen an die anderen Sachen implementieren hier genannten und Funktionen von PIL verwendet wird.

Zwei beliebte und relativ einfache Methoden sind: (a) die euklidische Distanz bereits angedeutet, oder (b) normalisierte Kreuzkorrelation. Normalisierte Kreuzkorrelation neigt dazu, Änderungen in der Beleuchtung als einfache Kreuzkorrelation deutlich robuster zu sein. Wikipedia gibt eine Formel für die normalisierte Kreuzkorrelation . Ausgefeiltere Methoden existieren auch, aber sie erfordern einiges mehr Arbeit.

Mit numpy-ähnlicher Syntax,

dist_euclidean = sqrt(sum((i1 - i2)^2)) / i1.size

dist_manhattan = sum(abs(i1 - i2)) / i1.size

dist_ncc = sum( (i1 - mean(i1)) * (i2 - mean(i2)) ) / (
  (i1.size - 1) * stdev(i1) * stdev(i2) )

unter der Annahme, dass i1 und i2 ist 2D-Graustufen-Bild-Arrays.

Eine triviale Sache, zu versuchen:

Resampling beide Bilder auf kleine Vorschaubilder (z.B. 64 x 64), und vergleichen die Vorschaubilder Pixel-für-Pixel mit einem bestimmten Schwellenwert. Wenn die Originalbilder fast gleich sind, werden die neu abgetasteten Thumbnails sehr ähnlich oder sogar genau das gleiche. Diese Methode sorgt für Lärm, der vor allem bei schlechten Lichtszenen auftreten kann. Es kann sogar besser sein, wenn Sie Graustufen gehen.

Ich spreche ausdrücklich die Frage, wie zu berechnen, wenn sie „anders genug“ sind. Ich nehme an, Sie können herausfinden, wie die Pixel eins nach dem anderen zu subtrahieren.

Als erstes würde ich ein paar Bilder mit nimmt nichts zu ändern, und die maximale Menge, die Kompressionsartefakte alle Pixeländerungen nur aufgrund von Schwankungen in der Erfassung, Rauschen in dem Bildgebungssystem, JPEG herausfinden und von Moment zu Moment Änderungen in der Beleuchtung. Vielleicht werden Sie feststellen, dass 1 oder 2 Bitunterschieden sogar zu erwarten sind, wenn sich nichts bewegt.

Dann gilt für den „echten“ Test, Sie wollen ein Kriterium wie folgt aus:

  • Gleiches gilt, wenn bis zu P Pixeln um nicht mehr als E unterscheiden.

Also, vielleicht, wenn E = 0,02, P = 1000, das würde bedeuten, (ungefähr), es sei „anders“, wenn alle einzelnen Pixel um mehr als ~ 5 Einheiten (unter der Annahme, 8-Bit-Bilder), oder wenn mehr als 1000 Pixel überhaupt keine Fehler aufgetreten sind.

Dies ist vor allem als eine gute „Triage“ Technik bestimmt, um Bilder schnell zu identifizieren, die nahe genug sind, um nicht eine weitere Untersuchung benötigen. Die Bilder, die „nicht bestanden“ kann dann mehr auf eine aufwändigere / teure Technik, die Fehlalarme nicht, wenn die Kamera etwas schüttelte haben würde, zum Beispiel, oder war robuster Beleuchtung ändert.

Ich betreibe eine Open-Source-Projekt, OpenImageIO , das enthält ein Dienstprogramm „Idiff“ genannt, die Differenzen mit Schwellenwerten vergleicht wie diese (auch aufwendigere, tatsächlich). Auch wenn Sie diese Software nicht verwenden möchten, können Sie an der Quelle suchen wollen zu sehen, wie wir es getan haben. Es wurden so entwickelt, kommerziell ziemlich viel und diese Schwellwertbildungstechnik verwendet, dass wir eine Testsuite für das Rendering und Bildverarbeitungs-Software, mit „Referenzbildern“ haben könnten, die kleinen Unterschied von Plattform zu Plattform haben könnte, oder wie wir gemacht kleinere Verbesserungen an tha Algorithmen, also wollten wir eine „Übereinstimmung innerhalb der Toleranz“ -Betrieb.

Die meisten der gegebenen Antworten werden nicht mit Beleuchtungsniveaus beschäftigen.

Ich würde zuerst das Bild auf ein Standard-Lichtniveau normalisieren, bevor den Vergleich zu tun.

Eine weitere nette, einfache Art und Weise die Ähnlichkeit zwischen zwei Bildern zu messen:

import sys
from skimage.measure import compare_ssim
from skimage.transform import resize
from scipy.ndimage import imread

# get two images - resize both to 1024 x 1024
img_a = resize(imread(sys.argv[1]), (2**10, 2**10))
img_b = resize(imread(sys.argv[2]), (2**10, 2**10))

# score: {-1:1} measure of the structural similarity between the images
score, diff = compare_ssim(img_a, img_b, full=True)
print(score)

Wenn andere Interesse an einer leistungsfähigeren Weise sind Bildähnlichkeit zu vergleichen, Ich habe eine Tutorial und Web App zur Messung und Visualisierung von ähnlichen Bildern unter Verwendung von Tensorflow.

Ich hatte ein ähnliches Problem bei der Arbeit, ich war Umschreiben unserer Bild Endpunkt verwandeln, und ich wollte überprüfen, ob die neue Version die gleichen oder fast die gleiche Leistung wie die alte Version herstellte. Also schrieb ich diese:

https://github.com/nicolashahn/diffimg

, die auf Bilder mit der gleichen Größe betrieben wird, und auf einer Pro-Pixel-Ebene, misst die Differenz der Werte bei jedem Kanal: R, G, B (A) nimmt die mittlere Differenz dieser Kanäle, und mittelt dann die Differenz über alle Pixel und gibt ein Verhältnis.

Beispiel mit einem 10x10 Bild von weißen Pixeln, und das gleiche Bild, aber ein Pixel zu Rot geändert hat, wird der Unterschied bei diesem Pixel 1/3 oder 0,33 ... (RGB 0,0,0 vs 255, 0,0) und an allen anderen Pixeln ist 0. Mit 100 Pixel insgesamt, 0,33 ... / 100 = a ~ 0,33% Unterschied in der Bild.

Ich glaube, dieses Projekt perfekt für den OP funktionieren würde (ich weiß, das ist eine sehr alte Post ist jetzt, aber für zukünftigen StackOverflowers veröffentlichen, die auch Bilder in Python vergleichen wollen).

Haben Sie den Algorithmus gesehen Bilder für die Suche nach ähnlichen Frage? Check it out Vorschläge zu sehen.

würde ich eine Wavelet-Transformation Ihres Rahmen vorschlagen (ich eine C-Erweiterung für die Verwendung von Haar-Transformation geschrieben habe); dann die Indizes der größten (proportional) Wavelet-Faktoren zwischen den beiden Bildern zu vergleichen, sollten Sie eine numerische Ähnlichkeit Annäherung erhalten.

Ich entschuldige mich, wenn dies zu spät ist, um zu antworten, aber da ich etwas ähnliches tun worden bin ich dachte, dass ich irgendwie beitragen könnte.

Vielleicht mit OpenCV könnten Sie Template-Matching verwenden. Angenommen, Sie sind mit einer Webcam, wie Sie gesagt:

  1. Vereinfachen Sie die Bilder (Thresholding vielleicht?)
  2. Anwenden Template-Matching und überprüfen Sie die MAX_VAL mit minMaxLoc

Tipp: MAX_VAL (oder MIN_VAL abhängig von der verwendeten Methode) gibt Ihnen Zahlen, große Zahlen. Um die Differenz in Prozent zu erhalten, Template-Matching mit dem gleichen Bild verwenden -. Das Ergebnis wird Ihr 100% sein

Pseudo-Code zu veranschaulichen:

previous_screenshot = ...
current_screenshot = ...

# simplify both images somehow

# get the 100% corresponding value
res = matchTemplate(previous_screenshot, previous_screenshot, TM_CCOEFF)
_, hundred_p_val, _, _ = minMaxLoc(res)

# hundred_p_val is now the 100%

res = matchTemplate(previous_screenshot, current_screenshot, TM_CCOEFF)
_, max_val, _, _ = minMaxLoc(res)

difference_percentage = max_val / hundred_p_val

# the tolerance is now up to you

Hoffe, es hilft.

Mover Erde distanzieren könnte genau das sein, was Sie brauchen. Es könnte sein, abit schwer, obwohl in Echtzeit zu implementieren.

Was ist die Manhattan Entfernung der beiden Bilder zu berechnen. Das gibt Ihnen n * n Werte. Dann könnten Sie etwas tun, wie eine Reihe Durchschnitt n-Werte und eine Funktion über das zu reduzieren, einen einzigen Wert zu erhalten.

Ich habe viel Glück mit JPG-Bildern mit der gleichen Kamera auf einem Stativ aufgenommen worden, die durch (1) vereinfacht stark (wie von 3000 Pixeln gehen breit und 100 Pixel breit oder noch weniger) (2) Abflachen jedes jpg-Array in einem einzigen Vektor (3) paarweise Korrelieren sequentielle Bilder mit einem einfachen Algorithmus Korrelat Korrelationskoeffizienten zu erhalten (4) quadriert Korrelationskoeffizient r-Quadrat (d.h Anteil der Variabilität in einem Bild, das durch Variation des als nächstes erläutert) zu erhalten (5) in der Regel in meiner Anwendung, wenn r-Quadrat <0,9, sage ich die beiden Bilder unterschiedlich sind und etwas passiert dazwischen.

Dies ist robust und schnell in meiner Implementierung (Mathematica 7)

Es lohnt sich, um mit dem Teil des Bildes spielen Sie interessiert sind und Fokussierung auf das durch alle Bilder in diesem kleinen Bereich beschneiden, sonst ein fernes-from-the-Kamera, aber wichtige Änderung wird uns fehlen.

Ich weiß nicht, wie Python zu verwenden, aber ich bin sicher, dass es Korrelationen nicht, auch, nicht wahr?

Sie sowohl das Histogramm der Bilder berechnen und dann die Bhattacharyya Coefficient , dies ist ein sehr schneller Algorithmus und ich habe es verwendet, um Szenenänderungen in einem Cricket-Video (in C unter Verwendung von OpenCV)

zu erfassen

Überprüfen Sie heraus, wie Haar-Wavelet umgesetzt werden von isk-Daemon . Man könnte es imgdb C ++ Code verwenden, um die Differenz zwischen den Bildern on-the-fly zu berechnen:

  

isk-Daemon ist ein Open-Source-Datenbankserver der Lage, das Hinzufügen von Inhalten basierende (visuell) Bild auf einem beliebigen Bild im Zusammenhang Website oder Software zu suchen.

     das Bild, das sie wollen, zu finden und haben die Website Antwort auf ihnen am ähnlichsten Bilder oder fordern Sie einfach für weitere ähnliche Fotos an jedem Bilddetailseite

Diese Technologie ermöglicht es Benutzern, jedes bildbezogenen Webseite oder Software auf einem Widget zu skizzieren.

Ich hatte das gleiche Problem und schrieb ein einfaches Python-Modul, das zwei gleiche Größe vergleicht Bilder Kissen des ImageChops mit einem schwarz / weiß diff Bild zu erstellen und die Histogrammwert summiert.

Sie können entweder diese Partitur direkt oder einen Prozentwert erhalten im Vergleich zu einem vollen Schwarz gegen Weiß diff.

Es enthält auch eine einfache is_equal Funktion, mit der Möglichkeit, eine Fuzzy-Schwelle unter (und einschließlich) das Bild zu liefern, gelangt als gleich.

ist der Ansatz nicht sehr aufwendig, aber vielleicht ist der Einsatz für andere da draußen mit dem gleichen Problem zu kämpfen.

https://pypi.python.org/pypi/imgcompare/

Ein etwas prinzipieller Ansatz ist es, einen globalen Descriptor, um Bilder zu vergleichen, wie GIST oder zentristischen. Eine Hash-Funktion, wie hier , auch bietet eine ähnliche Lösung.

import os
from PIL import Image
from PIL import ImageFile
import imagehash

#just use to the size diferent picture
def compare_image(img_file1, img_file2):
    if img_file1 == img_file2:
        return True
    fp1 = open(img_file1, 'rb')
    fp2 = open(img_file2, 'rb')

    img1 = Image.open(fp1)
    img2 = Image.open(fp2)

    ImageFile.LOAD_TRUNCATED_IMAGES = True
    b = img1 == img2

    fp1.close()
    fp2.close()

    return b





#through picturu hash to compare
def get_hash_dict(dir):
    hash_dict = {}
    image_quantity = 0
    for _, _, files in os.walk(dir):
        for i, fileName in enumerate(files):
            with open(dir + fileName, 'rb') as fp:
                hash_dict[dir + fileName] = imagehash.average_hash(Image.open(fp))
                image_quantity += 1

    return hash_dict, image_quantity

def compare_image_with_hash(image_file_name_1, image_file_name_2, max_dif=0):
    """
    max_dif: The maximum hash difference is allowed, the smaller and more accurate, the minimum is 0.
    recommend to use
    """
    ImageFile.LOAD_TRUNCATED_IMAGES = True
    hash_1 = None
    hash_2 = None
    with open(image_file_name_1, 'rb') as fp:
        hash_1 = imagehash.average_hash(Image.open(fp))
    with open(image_file_name_2, 'rb') as fp:
        hash_2 = imagehash.average_hash(Image.open(fp))
    dif = hash_1 - hash_2
    if dif < 0:
        dif = -dif
    if dif <= max_dif:
        return True
    else:
        return False


def compare_image_dir_with_hash(dir_1, dir_2, max_dif=0):
    """
    max_dif: The maximum hash difference is allowed, the smaller and more accurate, the minimum is 0.

    """
    ImageFile.LOAD_TRUNCATED_IMAGES = True
    hash_dict_1, image_quantity_1 = get_hash_dict(dir_1)
    hash_dict_2, image_quantity_2 = get_hash_dict(dir_2)

    if image_quantity_1 > image_quantity_2:
        tmp = image_quantity_1
        image_quantity_1 = image_quantity_2
        image_quantity_2 = tmp

        tmp = hash_dict_1
        hash_dict_1 = hash_dict_2
        hash_dict_2 = tmp

    result_dict = {}

    for k in hash_dict_1.keys():
        result_dict[k] = None

    for dif_i in range(0, max_dif + 1):
        have_none = False

        for k_1 in result_dict.keys():
            if result_dict.get(k_1) is None:
                have_none = True

        if not have_none:
            return result_dict

        for k_1, v_1 in hash_dict_1.items():
            for k_2, v_2 in hash_dict_2.items():
                sub = (v_1 - v_2)
                if sub < 0:
                    sub = -sub
                if sub == dif_i and result_dict.get(k_1) is None:
                    result_dict[k_1] = k_2
                    break
    return result_dict


def main():
    print(compare_image('image1\\815.jpg', 'image2\\5.jpg'))
    print(compare_image_with_hash('image1\\815.jpg', 'image2\\5.jpg', 6))
    r = compare_image_dir_with_hash('image1\\', image2\\', 10)
    for k in r.keys():
        print(k, r.get(k))


if __name__ == '__main__':
    main()
  • Ausgabe:

    False
    wahre
    image2 \ 5.jpg image1 \ 815.jpg
    image2 \ 6.jpg image1 \ 819.jpg
    image2 \ 7.jpg image1 \ 900.jpg
    image2 \ 8.jpg image1 \ 998.jpg
    image2 \ 9.jpg image1 \ 1012.jpg

  • Die Beispielbilder:

    • 815.jpg
      815.jpg

    • 5.jpg
      5.jpg

Ich denke, man könnte einfach die euklidische Entfernung berechnen (das heißt sqrt (Summe der Quadrate der Differenzen, Pixel für Pixel)) zwischen der Helligkeit der beiden Bilder, und betrachten sie gleich, wenn diese unter einem gewissen empirischen Schwellenwert fällt. Und Sie würden es besser tun, um eine C-Funktion gewickelt wird.

Es gibt viele Metriken gibt, zu beurteilen, ob zwei Bilder sehen aus wie / wie viel sie aussehen.

Ich will nicht in jeden Code gehe hier, weil ich denke, es sollte ein wissenschaftliches Problem, anders als ein technisches Problem sein.

Im Allgemeinen wird die Frage für die menschliche Wahrnehmung auf Bilder bezogen, so dass jeder Algorithmus hat seine Unterstützung auf menschlichen Sehsystem Zügen.

Klassische Ansätze sind:

Sichtbare Unterschiede Prädiktor: ein Algorithmus zur Beurteilung der Bildtreue ( https://www.spiedigitallibrary.org/conference-proceedings-of-spie/1666/0000 /Visible-differences-predictor--an-algorithm-for-the-assessment-of/10.1117/12.135952.short?SSO=1 )

Image Quality Assessment: Aus Fehlern Sichtbarkeit zu struktureller Ähnlichkeit ( http: //www.cns.nyu.edu/pub/lcv/wang03-reprint.pdf )

FSIM: A Merkmal Similarity Index für Bildqualität Assessment ( https : //www4.comp.polyu.edu.hk/~cslzhang/IQA/TIP_IQA_FSIM.pdf )

Unter ihnen SSIM (Bildqualitätsbeurteilung: Aus Fehlern Visibility struktureller Ähnlichkeit) ist die am einfachsten zu berechnen und sein Kopfteil ist auch klein, wie in einem anderen Papier „Bildqualitätsbewertung Basierend auf Gradient Ähnlichkeit“ ( https://www.semanticscholar.org/paper/ Bild-Qualität Assessment-Based-on-Gradient-Liu-Lin / 2b819bef80c02d5d4cb56f27b202535e119df988 ).

Es gibt noch viele andere Ansätze. Werfen Sie einen Blick in Google Scholar und der Suche nach so etwas wie „visuellem Unterschied“, „Bildqualitätsbeurteilung“, etc, wenn Sie interessiert sind / Pflege wirklich über die Kunst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top