2015-01-30 4 views
0

Я пытаюсь найти количество объектов в данном изображении с использованием сегментации водораздела. Рассмотрим, например, coins image. Здесь я хотел бы узнать количество монет на изображении. Я внедрил код, доступный в документации Scikit-image, и немного подкорректировал его и получил результаты, аналогичные тем, которые показаны на странице документации.Подсчитать количество объектов с использованием алгоритма водораздела - Scikit-image

После подробного изучения функций, используемых в коде, я обнаружил, что ndimage.label() также возвращает количество уникальных объектов, найденных на изображении (упомянутых в его документации), но когда я печатаю это значение, я получаю 53 что очень велико по сравнению с количеством монет в фактическом изображении.

Может кто-нибудь предложить какой-либо метод для поиска количества объектов в изображении.

+0

Можете ли вы привести пример изображения? –

+0

Я приложил ссылку для входного изображения в самом вопросе. Окончательный результат доступен по ссылке [https://drive.google.com/file/d/0BxL8fZVtRVZPbldJUzVKazVmSlk/view?usp=sharing). Вот код [link] (https://drive.google.com/file/d/0BxL8fZVtRVZPbFFRbGczdzdGRzg/view?usp=sharing) –

ответ

1

Вот версия вашего кода, в которой монеты считаются одним из двух способов: а) путем прямой сегментации изображения расстояния и б), сначала сделав водораздел и отклонив крошечные пересекающиеся области.

from __future__ import print_function 

import numpy as np 
import matplotlib.pyplot as plt 
from skimage import io, color, filter as filters 
from scipy import ndimage 

from skimage.morphology import watershed 
from skimage.feature import peak_local_max 
from skimage.measure import regionprops, label 

image = color.rgb2gray(io.imread('water_coins.jpg', plugin='freeimage')) 
image = image < filters.threshold_otsu(image) 

distance = ndimage.distance_transform_edt(image) 

# Here's one way to measure the number of coins directly 
# from the distance map 
coin_centres = (distance > 0.8 * distance.max()) 
print('Number of coins (method 1):', np.max(label(coin_centres))) 

# Or you can proceed with the watershed labeling 
local_maxi = peak_local_max(distance, indices=False, footprint=np.ones((3, 3)), 
          labels=image) 


markers, num_features = ndimage.label(local_maxi) 
labels = watershed(-distance, markers, mask=image) 

# ...but then you have to clean up the tiny intersections between coins 
regions = regionprops(labels) 
regions = [r for r in regions if r.area > 50] 

print('Number of coins (method 2):', len(regions) - 1) 

fig, axes = plt.subplots(ncols=3, figsize=(8, 2.7)) 
ax0, ax1, ax2 = axes 

ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest') 
ax0.set_title('Overlapping objects') 
ax1.imshow(-distance, cmap=plt.cm.jet, interpolation='nearest') 
ax1.set_title('Distances') 
ax2.imshow(labels, cmap=plt.cm.spectral, interpolation='nearest') 
ax2.set_title('Separated objects') 

for ax in axes: 
    ax.axis('off') 

fig.subplots_adjust(hspace=0.01, wspace=0.01, top=1, bottom=0, left=0, 
        right=1) 
plt.show()