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
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.
Connected components labeling scans an image and groups its pixels into components based on pixel connectivity, i.e. all pixels in a connected component share similar pixel intensity values and are in some way connected with each other.
ConnectedComponentsWithStats Method (InputArray, OutputArray, OutputArray, OutputArray, PixelConnectivity, MatType) computes the connected components labeled image of boolean image. image with 4 or 8 way connectivity - returns N, the total number of labels [0, N-1] where 0 represents the background label.
What are Connected Components? Connected Components or Components in Graph Theory are subgraphs of a connected graph in which any two vertices are connected to each other by paths, and which is connected to no other vertice in the supergraph.
Python has several libraries like OpenCV, PIL, and matplotlib that can be used to load and save the image.
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()
With blur_radius = 1.0
, this finds 4 objects.
With blur_radius = 0.5
, 5 objects are found:
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With