2016-05-14 4 views
0

Okay Leute, ich bleibe stecken und versuche ein Histogramm zu erstellen, das für zwei Bilder passt; ein Vorlagenbild und ein Zielbild (Ziel bedeutet das Bild, an das ich das Vorlagenbild anpassen möchte). Anstatt das passende Bild anzuzeigen, erhalte ich ein leeres Bild. Ich habe das Gefühl, dass ich erschöpft bin, weshalb ich nach SO gekommen bin. Kann mich jemand in die richtige Richtung führen?Zuordnung eines Quellbilds zu einem Zielbild in Python

Jede Hilfe in die richtige Richtung wäre willkommen.

def matching(template, target, numberOfBins=256): 

    templateHist, bins1 = np.histogram(template.flatten(), numberOfBins, density = False) 
    targetHist, bins2 = np.histogram(target.flatten(), numberOfBins, density = False) 
    cdfTemplate = templateHist.cumsum() #Cumulative distributed function 
    cdfTemplate = (255 * cdfTemplate/cdfTemplate[-1]) #normalize 
    cdfTarget = targetHist.cumsum() 
    cdfTarget = (255 * cdfTarget/cdfTarget[-1]).astype(np.float64) 
    im2 = np.interp(template.flatten(), cdfTemplate, bins1[:-1]) 
    im3 = np.interp(im2, cdfTarget, bins2[:-1]) 
    result = im3.reshape((template.shape)) 

    return result 
+1

Siehe hier: http://stackoverflow.com/q/32655686/1461210 –

+0

es bedeutet, dass cdfTemplate [-1] 0 – Li357

+1

Die Fehlermeldung zurückgibt Ihnen sagt, dass 'cdfTemplate [-1]' ist gleich 0, was dazu führt, dass alle Elemente in 'cdfTemplate' zu ​​NaNs werden. Dies bedeutet, dass die Summe von "templateHist" ebenfalls 0 sein muss. Es ist schwieriger zu erklären, warum dies der Fall sein sollte, da es aus Histogramm-Bin-Zählungen besteht und die automatische Auswahl von Histogramm-Bin-Kanten sicherstellen sollte, dass mindestens eine Bin enthält eine Zählung ungleich Null. Was sind "Vorlage" und "Ziel"? Ich vermute, dass sie maskierte Arrays sind? –

Antwort

0
  • Die Fehlermeldung sagt Ihnen, dass cdfTemplate[-1] gleich Null ist, die in allen Elementen in cdfTemplate führt immer NaNs.
  • Rückwärts arbeiten bedeutet dies, dass die Summe templateHist auch Null sein muss.
  • templateHist enthält die von template.flatten() berechneten Bin-Zählungen. Da Sie für np.histogram keinen Satz von Gewichtungen angegeben haben, kann keines der Elemente in templateHist negativ sein. Daher muss templateHist nur Nullen enthalten.
  • Sie übergeben auch eine positive ganze Zahl als bins Parameter an np.histogram, und Sie haben den Parameter range nicht angegeben. Wenn also templateirgendwelche Werte enthält, sollte np.histogram automatisch einen Satz von Fachkanten so auswählen, dass mindestens eine der Zählungen positiv wäre.
  • Wenn template enthaltene NaNs oder unendliche Werte enthalten, sollten Sie einen ValueError statt eines Vektors aller Null-Bin-Zählungen erhalten.
  • Daher ist die logische Schlussfolgerung, dass template ein leeres Array sein muss.
+0

Ich bin ein wenig verloren, als Sie sagten, dass ich den Bereichsparameter nicht angegeben habe. Kannst du ein bisschen klarer sein? –

+1

['np.histogram'] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.histogram.html) akzeptiert einen Parameter' range', der verwendet werden kann, um '(untere, obere)' Grenzen für den Bereich der Fachkanten. Im Prinzip könnten Sie Bin-Zählungen für alle null erhalten haben, weil Sie zwei Zahlen so überschritten haben, dass alle Werte in "template" außerhalb dieses Bereichs lagen, aber Sie nicht. –

+0

Sie haben absolut Recht. Ich debugge meinen Code und finde heraus, sobald die erste zweite Anweisung in meiner * hist Funktion * ausgeführt wird, das Ergebnis == 0. –

Verwandte Themen