Quanto segue dovrebbe essere adatto alle vostre esigenze (o almeno aiutare). L'idea è quella di suddividersi nelle varie regioni usando controlli logici basati su valori soglia. Il bordo tra queste regioni può essere rilevato utilizzando rotolo NumPy per spostare i pixel x ed y e confronto per vedere se siamo a un bordo,
import matplotlib.pyplot as plt
import numpy as np
import scipy as sp
from skimage.morphology import closing
thresh1 = 127
thresh2 = 254
#Load image
im = sp.misc.imread('jBD9j.png')
#Get threashold mask for different regions
gryim = np.mean(im[:,:,0:2],2)
region1 = (thresh1<gryim)
region2 = (thresh2<gryim)
nregion1 = ~ region1
nregion2 = ~ region2
#Plot figure and two regions
fig, axs = plt.subplots(2,2)
axs[0,0].imshow(im)
axs[0,1].imshow(region1)
axs[1,0].imshow(region2)
#Clean up any holes, etc (not needed for simple figures here)
#region1 = sp.ndimage.morphology.binary_closing(region1)
#region1 = sp.ndimage.morphology.binary_fill_holes(region1)
#region1.astype('bool')
#region2 = sp.ndimage.morphology.binary_closing(region2)
#region2 = sp.ndimage.morphology.binary_fill_holes(region2)
#region2.astype('bool')
#Get location of edge by comparing array to it's
#inverse shifted by a few pixels
shift = -2
edgex1 = (region1^np.roll(nregion1,shift=shift,axis=0))
edgey1 = (region1^np.roll(nregion1,shift=shift,axis=1))
edgex2 = (region2^np.roll(nregion2,shift=shift,axis=0))
edgey2 = (region2^np.roll(nregion2,shift=shift,axis=1))
#Plot location of edge over image
axs[1,1].imshow(im)
axs[1,1].contour(edgex1,2,colors='r',lw=2.)
axs[1,1].contour(edgey1,2,colors='r',lw=2.)
axs[1,1].contour(edgex2,2,colors='g',lw=2.)
axs[1,1].contour(edgey2,2,colors='g',lw=2.)
plt.show()
del quale il
. Per semplicità ho usato il rotolo con l'inverso di ogni regione. Puoi spostare ogni regione successiva sulla successiva per rilevare i bordi
Grazie a @Kabyle per aver offerto una ricompensa, questo è un problema che ho impiegato un po 'a cercare una soluzione. Ho provato scipy skeletonize, feature.canny, modulo topology e openCV con scarso successo ... In questo modo è stato il più robusto per il mio caso (tracciamento dell'interfaccia droplet). Spero che sia d'aiuto!
Le matrici non sono generalmente un buon modo per rappresentare i dati dei pixel 2D ... non è quello a cui è rivolta la loro semantica. – Sneftel
@Le matrici di Sneftel sono le più comuni, se non l'unica e la migliore, per rappresentare le immagini in librerie come OpenCV, SimpleCV e così via. –
Si stanno confondendo le matrici con gli array 2D. I primi sono dotati di un insieme molto specifico di operazioni che sono del tutto prive di significato da applicare ai dati di immagine. – Sneftel