2013-04-06 12 views
9

Ich versuche scipy erosion und dilation eines Bildes zu verwenden. Es scheint ziemlich einfach mit scipy ->binary_erosion/dialation. Die Ausgabe ist jedoch überhaupt nicht das, was erwartet wird.Bilderosion und Dilatation mit Scipy

Hier ist mein Grundcode:

import scipy 
from scipy import ndimage 
import matplotlib.pyplot as plt 
import numpy as np 
import Image 

#im = Image.open('flower.png') 
im = ndimage.imread('flower.png') 
im = ndimage.binary_erosion(im).astype(np.float32) 
scipy.misc.imsave('erosion.png', im) 


im2 = Image.open('flower.png') 
im2 = ndimage.binary_dilation(im2) 
scipy.misc.imsave('dilation.png', im2) 

Dies ist der Ausgang:

enter image description here

Der Ausgang für die Dilatation ist nur ein vollständig weißes Bild für das Original "flower.png"

Ich glaube, dass ich einen besseren Kernel oder eine bessere Maske angeben muss, aber ich bin mir nicht wirklich sicher, warum ich eine grüne Ausgabe für Erosion und komplett whi bekomme Der Ausgang für die Dilatation.

+1

binäre Operatoren erwarten binäre Eingabe im Gegensatz zu Ihnen – theta

Antwort

9

Ich verwendete die binäre Erosion anstelle der grey erosion Array. Ich wandelte das Originalbild durch in Graustufen flatten=true mit etwa so:

im = scipy.misc.imread('flower.png', flatten=True).astype(np.uint8) 

dann genannt:

im1 = ndimage.grey_erosion(im, size=(15,15)) 

Und bekam eine schön erodiert Bild, obwohl es Graustufen ist.

2

Sie haben zwei Probleme: wie im Kommentar von @theta erwähnt, binäre ops Eingang erwarten die nur aus 0 und 1. Die zweite Ausgabe der nd in ndimage ist --- Sie in einer Reihe von Form liefern (nx, ny, 3). Die letzte Achse der Länge 3 wird als dritte räumliche Dimension betrachtet, nicht die drei Farbkanäle.