2016-03-29 6 views
5

Esiste un'implementazione che utilizza OpenCV o scikit-image che è equivalente alla immagine in scala di grigi di Matlab imfill funciton (ad esempio riempimento del foro della scala di grigi)?Python equivalente a Matlab funciton 'imfill' per la scala di grigi?

Vedere la sezione di imfill per la scala di grigi (I2 = imfill (I)) nel seguente esempio di collegamento matlab_imfill. Oppure vedi immagine: matlab_tire_ex

Ecco un link per l'immagine del pneumatico nell'esempio

tire

Ho cercato di replicare l'uscita Matlab utilizzando scipy.ndimage.grey_closing funzione con variando la parametro di dimensione, ma non ha avuto successo.

Sto usando Python 3.5.

+0

Controllare [questo link] (http://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python -c /) per vedere una sua implementazione in Python. –

+2

@BillBEGUERADJ Questo vale per le immagini binarie. L'OP vuole fare questo per le immagini in scala di grigi. – rayryeng

risposta

1

due versioni dell'algoritmo alluvione di riempimento sono state implementate in Python qui:

http://arcgisandpython.blogspot.de/2012/01/python-flood-fill-algorithm.html

La prima, più semplice una conteneva due variabili non definite, ma qui è una versione funzionante:

import numpy as np 
import scipy as sp 
import scipy.ndimage 

def flood_fill(test_array,h_max=255): 
    input_array = np.copy(test_array) 
    el = sp.ndimage.generate_binary_structure(2,2).astype(np.int) 
    inside_mask = sp.ndimage.binary_erosion(~np.isnan(input_array), structure=el) 
    output_array = np.copy(input_array) 
    output_array[inside_mask]=h_max 
    output_old_array = np.copy(input_array) 
    output_old_array.fill(0) 
    el = sp.ndimage.generate_binary_structure(2,1).astype(np.int) 
    while not np.array_equal(output_old_array, output_array): 
     output_old_array = np.copy(output_array) 
     output_array = np.maximum(input_array,sp.ndimage.grey_erosion(output_array, size=(3,3), footprint=el)) 
    return output_array 
+0

Grazie! Stanco dell'esempio di pneumatici e funziona bene! –

1

Matlab riempimento() a sua volta utilizza una funzione IM = imreconstruct (marker, maschera)

Scikit-image ha un simile funzione di ... skimage.morphology.reconstruction(seed, mask, method='dilation', selem=None, offset=None)

L'algoritmo è dettagliato nel Soille, P., Morfologiche Image Analysis:. Principi e applicazioni, Springer-Verlag, 1999, pp 208-209. sezione sezione 6.3.7 "_FillHole"

import numpy as np 
from skimage.morphology import reconstruction 
import matplotlib.pyplot as plt 
from skimage.io import imread, imsave 


# Use the matlab reference Soille, P., Morphological Image Analysis: Principles and Applications, Springer-Verlag, 1999, pp. 208-209. 
# 6.3.7 Fillhole 
# The holes of a binary image correspond to the set of its regional minima which 
# are not connected to the image border. This definition holds for grey scale 
# images. Hence, filling the holes of a grey scale image comes down to remove 
# all minima which are not connected to the image border, or, equivalently, 
# impose the set of minima which are connected to the image border. The 
# marker image 1m used in the morphological reconstruction by erosion is set 
# to the maximum image value except along its border where the values of the 
# original image are kept: 

img = imread("tyre.jpg") 

seed = np.ones_like(img)*255 
img[ : ,0] = 0 
img[ : ,-1] = 0 
img[ 0 ,:] = 0 
img[ -1 ,:] = 0 
seed[ : ,0] = 0 
seed[ : ,-1] = 0 
seed[ 0 ,:] = 0 
seed[ -1 ,:] = 0 


fill = reconstruction(seed, img, method='erosion') 

f, (ax0, ax1) = plt.subplots(1, 2, 
    subplot_kw={'xticks': [], 'yticks': []}, 
    figsize=(12, 8)) 
ax0.imshow(img) 
ax1.imshow(fill) 
plt.show() 

Link to tyre image and filled image

Problemi correlati