2013-04-06 18 views
9

Próbuję użyć scipy do wykonania erosion i dilation obrazu. Wydaje się całkiem proste, używając scipy ->binary_erosion/dialation. Jednak wynik nie jest wcale taki, jak się spodziewano.Erozja obrazu i rozszerzenie za pomocą Scipy

Tu jest mój podstawowy kod:

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) 

To wyjście:

enter image description here

Wyjście do dylatacji jest po prostu całkowicie biały obraz w oryginalnym "flower.png"

Uważam, że muszę określić lepsze jądro lub maskę, ale nie jestem do końca pewien, dlaczego otrzymuję zieloną produkcję erozji i całkowicie te wyjście do dylatacji.

+1

Operatory binarne oczekują wejścia binarnego w przeciwieństwie do twojego – theta

Odpowiedz

9

Używałem erozji binarnej zamiast tablicy grey erosion. I konwertowane oryginalnego obrazu do skali szarości za pomocą flatten=true jak tak:

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

następnie o nazwie:

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

i dostaliśmy ładnie erozji obrazu, mimo że jest w skali szarości.

2

mieć dwa problemy: jak zauważono w komentarzu przez @theta, ops binarne spodziewać wejścia składający się wyłącznie z 0 i 1. Drugą kwestią jest nd w ndimage --- podać w tablicy kształcie (nx, ny, 3). Ostatnia oś długości 3 jest uważana za trzeci wymiar przestrzenny, a nie za kanały trójwymiarowe.

Powiązane problemy