Следующие, как мы надеемся, будут в порядке для ваших нужд (или, по крайней мере, помощи). Идея состоит в разделении на различные регионы с использованием логических проверок на основе пороговых значений. Кромки между этими областями, то можно обнаружить с помощью Numpy рулон, чтобы переместить пиксели в х и у и сравнения, чтобы увидеть, если мы на краю,
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()
который дает . Для простоты я использую roll с инверсией каждого региона. Вы можете катить каждую последующую область на следующую, чтобы обнаружить края.
Спасибо @Kabyle за вознаграждение, это проблема, которую я потратил некоторое время на поиск решения. Я пробовал scipy skeletonize, feature.canny, модуль топологии и openCV с ограниченным успехом ... Этот способ был самым надежным для моего случая (отслеживание интерфейса капель). Надеюсь, поможет!
Матрицы, как правило, не являются хорошим способом представления 2D-пиксельных данных ... это не то, на что нацелена их семантика. – Sneftel
@ На самом деле матрицы Sneftel являются наиболее распространенными, если не единственными и лучшими, способ представлять изображения в таких библиотеках, как OpenCV, SimpleCV и т. Д. –
Вы смешиваете матрицы с 2D-массивами. Первые имеют очень специфический набор операций, которые совершенно не имеют смысла применять к данным изображения. – Sneftel