2016-12-17 3 views
1

Я пытался подсчитать количество объектов из изображения и наткнулся на следующий код из другого вопроса, я применил его на моем образце изображения следующим образом:Объединение близких объектов после гауссова фильтра

import numpy 
import matplotlib.pyplot as plt 
from scipy import misc, ndimage 
from skimage import feature 
from skimage.filters import roberts, sobel 

im = misc.imread('/home/nvp/temp/kaw.png',flatten=True) 
im = im.astype('int32') 
edges1 = feature.canny(im, sigma=3) 
plt.imshow(edges1,interpolation='nearest') 
dx = ndimage.sobel(im, 1) # horizontal derivative 
dy = ndimage.sobel(im, 0) # vertical derivative 
mag = numpy.hypot(dx, dy) # magnitude 
mag *= 255.0/numpy.max(mag) 
dna = mag 
dnaf = ndimage.gaussian_filter(dna, 7) 
T = 27 # set threshold by hand to avoid installing `mahotas` or 
     # `scipy.stsci.image` dependencies that have threshold() functions 

# find connected components 
labeled, nr_objects = ndimage.label(dnaf > T) # `dna[:,:,0]>T` for red-dot case 
print(dnaf, labeled,len(labeled)) 
print("Number of objects is %d " % nr_objects) 

# show labeled image 
####scipy.misc.imsave('labeled_dna.png', labeled) 
####scipy.misc.imshow(labeled) # black&white image 
import matplotlib.pyplot as plt 
plt.imsave('labeled_dna.png', labeled) 
plt.imshow(labeled) 
plt.show() 

Однако это выводит следующее изображение:

Output

конечные объекты хранятся в labeled np.array Я думаю, что я хотел бы сделать, это объединить близкие объекты в этом выходном массиве. Как вы можете видеть, второй объект в последней строке имеет две части, но они очень близки друг к другу.

Поскольку я понятия не имею о numpy, я бы хотел установить порог и объединить объекты, которые имеют меньшее расстояние между ними. Любая помощь приветствуется. Спасибо :)

ответ

1

Два объекта, которые вы хотите объединить, находятся так близко, как объекты 3 и 4 первой строки ... Поэтому решение, основанное только на близости между объектами, не даст вам того, что вы хотите.

Одним из решений может быть dilate ваших объектов в соответствии с их площадью (расширение более мелких объектов).

Пример (не проверено):

import scipy.ndimage.morphology as morpho 

# parameters 
max_dilat = 20 # dilation (in number of pixels) for a small object 
sz_small = 100 # size of a small object (max dilated) 
sz_big = 10000 # size of a big object (not dilated) 

result = labeled*0 

# for each detected object 
for obj_id in range(1, nr_objects+1): 
    # creates a binary image with the current object 
    obj_img = (labeled==obj_id) 
    # computes object's area 
    area = numpy.sum(obj_img) 
    # dilatation factor inversely proportional to area 
    dfac = int(max_dilat*(1-min(1,(max(0,area-sz_small)/sz_big)))) 
    # dilates object 
    dilat = morpho.binary_dilation(obj_img, iterations=dfac) 

    result += dilat 

# result is now an int array with ones where you have a single 
# dilated object, and twos (or more) in overlapping parts 
labeled, nr_objects = ndimage.label(result>0) 
+0

могли бы вы разработать немного и показать пример, я могу следовать? –

+1

Я добавил псевдокод, я не могу проверить его сейчас, но он должен работать. Не стесняйтесь играть с параметрами для достижения ожидаемого результата. – Gwen

+0

Привет, я изменил значения на 'max_dilat = 9, sz_small = 90, sz_big = 10000', и результаты выглядят следующим образом: [результаты] (http://imgur.com/a/FPysS), как вы можете видеть объектов исчезает после расширения, любая идея, как противостоять этому? Большое спасибо! –

Смежные вопросы