17

I have a graysacle png image and I want to extract all the connected components from my image. Some of the components have same intensity but I want to assign a unique label to every object. here is my image

enter image description here

I tried this code:

img = imread(images + 'soccer_cif' + str(i).zfill(6) + '_GT_index.png')
labeled, nr_objects = label(img)
print "Number of objects is %d " % nr_objects

But I get just three objects using this. Please tell me how to get each object.

unutbu
  • 842,883
  • 184
  • 1,785
  • 1,677
Khushboo
  • 1,716
  • 6
  • 24
  • 34

2 Answers2

25

J.F. Sebastian shows a way to identify objects in an image. It requires manually choosing a gaussian blur radius and threshold value, however:

from PIL import Image
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt

fname='index.png'
blur_radius = 1.0
threshold = 50

img = Image.open(fname).convert('L')
img = np.asarray(img)
print(img.shape)
# (160, 240)

# smooth the image (to remove small objects)
imgf = ndimage.gaussian_filter(img, blur_radius)
threshold = 50

# find connected components
labeled, nr_objects = ndimage.label(imgf > threshold) 
print("Number of objects is {}".format(nr_objects))
# Number of objects is 4 

plt.imsave('/tmp/out.png', labeled)
plt.imshow(labeled)

plt.show()

enter image description here

With blur_radius = 1.0, this finds 4 objects. With blur_radius = 0.5, 5 objects are found:

enter image description here

unutbu
  • 842,883
  • 184
  • 1,785
  • 1,677
4

If the border of objects are completely clear and you have a binary image in img, you can avoid Gaussian filtering and just do this line:

labeled, nr_objects = ndimage.label(img)
Daniel MM. Kamani
  • 855
  • 1
  • 7
  • 5