Die folgenden sollten hoffentlich für Ihre Bedürfnisse in Ordnung sein (oder zumindest helfen). Die Idee besteht darin, sich in die verschiedenen Regionen unter Verwendung logischer Prüfungen auf der Basis von Schwellenwerten aufzuteilen. Die Kante zwischen diesen Bereichen kann dann numpy Rolle zu verschieben Pixel in x und y und den Vergleich festgestellt werden, um zu sehen, wenn wir an einem Rand sind,
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()
Welche der verleiht. Der Einfachheit halber verwende ich Roll mit der Umkehrung jeder Region. Sie könnten jede folgende Region auf die nächste rollen, um Kanten zu erkennen.
Vielen Dank an @Kabyle für die Belohnung, das ist ein Problem, das ich eine Weile nach einer Lösung gesucht habe. Ich habe scipy skelettiere, feature.canny, topology module und openCV mit begrenztem Erfolg ausprobiert ... Dieser Weg war der robusteste für meinen Fall (Droplets Interface Tracking). Ich hoffe es hilft!
Matrizen sind im Allgemeinen keine gute Möglichkeit, 2D-Pixeldaten darzustellen ... darauf zielt ihre Semantik nicht ab. – Sneftel
@Sneftel tatsächlich Matrizen sind die häufigste, wenn nicht die einzige und beste Möglichkeit, Bilder in Bibliotheken wie OpenCV, SimpleCV und so weiter darzustellen. –
Sie verwechseln Matrizen mit 2D-Arrays. Erstere sind mit einem sehr spezifischen Satz von Operationen ausgestattet, die für Bilddaten völlig bedeutungslos sind. – Sneftel