2013-01-17 2 views
5

Ich versuche, Löcher in einem Binärbild zu füllen. Das Bild ist ziemlich groß, also habe ich es zur Verarbeitung in Stücke aufgeteilt.Scipy Binary Closing - Kantenpixel verlieren Wert

Wenn ich die scipy.ndimage.morphology.binary_fill_holes Funktionen verwende, füllt es größere Löcher, die in das Bild gehören. Also habe ich versucht mit scipy.ndimage.morphology.binary_closing, die die gewünschten Ergebnisse der Füllung kleiner Löcher im Bild ergab. Wenn ich jedoch die Chunks wieder zusammensetze, um das gesamte Bild zu erstellen, enden die Seamlines, weil die binary_closing-Funktion alle Werte aus den Rahmenpixeln jedes Chunks entfernt.

Gibt es eine Möglichkeit, diesen Effekt zu vermeiden?

+0

Zuerst wäre es gut, wenn Sie ein Bild oder einen Code hinzufügen könnten, der Ihr Problem ein wenig mehr erklärt. Zweitens können Sie nicht vermeiden, Artefakte einzuführen, indem Sie auf diese Weise schneiden. Sie müssen Ihre Scheiben um die Größe Ihres strukturierenden Elements auffüllen/erweitern, so dass das Ergebnis korrekt ist. – YXD

+0

Der richtige Weg dazu ist morphologisch Rekonstruktion mit dem geschlossenen Bild als Marker. – mmgp

Antwort

1

Operationen, die Informationen von benachbarten Pixeln beinhalten, wie z. B. closing, haben immer Probleme an den Kanten. In Ihrem Fall ist dies sehr einfach: Bearbeiten Sie nur Teilbilder, die etwas größer sind als Ihre Kacheln, und behalten Sie die guten Teile beim Zusammennähen.

+0

Also habe ich gerade etwas Neues versucht, das klingt ähnlich wie das, was Sie vorschlagen. Ich nahm meine Chunk und fügte eine Reihe von Nullen an den oberen und unteren Rand des Arrays mit vstack. Ich habe das selbe mit hstack links und rechts gemacht. Dann habe ich das binäre Schließen bearbeitet. Schließlich entfernte ich die äußeren Zeilen und Spalten, um das Bild auf seine ursprüngliche Größe zurückzuführen. Von dem, was ich sagen kann, wenn ich die Bilder nebeneinander zeichne. Es sieht korrekt aus. – Brian

+1

Das könnte funktionieren, aber ich denke, es ist weniger genau als tatsächliche Daten aus dem Bild verwenden.Was ich meine ist, dass, wenn Ihr Bild sagt, 1Mx1M, und Sie dies in 100 100Kx100K Unterbilder tun möchten, stattdessen Teilbilder, die auf der 100K Fliesen verteilt sind aber 100.200 x 100.200 (dh haben eine 100-Pixel-Polsterung von real und genaue Daten aus dem Bild herum), und wenn Sie wieder zusammenbauen, verwenden Sie einfach die guten Mittelteile, die 100.000 x 100.000 sind. – tom10

4

Ja.

  1. Beschriften Sie Ihr Bild mit ndimage.label (zuerst das Bild invertieren, Löcher = schwarz).
  2. Das Loch Objekt Scheiben mit ndimage.find_objects
  3. Filter die Liste der Objektscheiben auf der Grundlage Ihrer Größenkriterien
  4. Invert Ihr Bild zurück und führen binary_fill_holes auf den Scheiben, die Ihre Kriterien entsprechen.

Das sollte es tun, ohne das Bild zu hacken. Zum Beispiel:

Eingabebild:

enter image description here

Ausgabebild (mittlere Größe Löcher sind verschwunden):

enter image description here

Hier ist der Code (Ungleichheit gesetzt, um die Mitte zu entfernen Größe Blobs):

import scipy 
from scipy import ndimage 
import numpy as np 

im = scipy.misc.imread('cheese.png',flatten=1) 
invert_im = np.where(im == 0, 1, 0) 
label_im, num = ndimage.label(invert_im) 
holes = ndimage.find_objects(label_im) 
small_holes = [hole for hole in holes if 500 < im[hole].size < 1000] 
for hole in small_holes: 
    a,b,c,d = (max(hole[0].start-1,0), 
       min(hole[0].stop+1,im.shape[0]-1), 
       max(hole[1].start-1,0), 
       min(hole[1].stop+1,im.shape[1]-1)) 
    im[a:b,c:d] = scipy.ndimage.morphology.binary_fill_holes(im[a:b,c:d]).astype(int)*255 

Beachten Sie auch, dass ich die Scheiben vergrößern musste, so dass die Löcher den ganzen Weg umrandeten.

+0

Ich habe Schwierigkeiten, einen Unterschied zwischen den beiden Bildern zu erkennen, die Sie gepostet haben. – Jaime

+0

@Jaime - genauer hinschauen;) die mittleren Löcher fehlen im zweiten Bild. – fraxel

+0

Mein schlechtes! Ich war auf der Suche nach Teeny Weeny Löcher, die gegangen sind viel größer als ich erwartet hatte, – Jaime