Skip to content Skip to sidebar Skip to footer

Use Cv2.connectedcomponents And Eliminate Elements With A Small Number Of Pixels

I want to use the function cv2.connectedComponents to connect components on a binary image, like the following... I have added the feature to cv2. connectedComponents to eliminate

Solution 1:

In python, you should avoid deep loop. Prefer to use numpy other than python-loop.

Imporved:

##################################################
ts = time.time()
num = labels.max()

N = 50## If the count of pixels less than a threshold, then set pixels to `0`.for i inrange(1, num+1):
    pts =  np.where(labels == i)
    iflen(pts[0]) < N:
        labels[pts] = 0print("Time passed: {:.3f} ms".format(1000*(time.time()-ts)))
# Time passed: 4.607 ms##################################################

Result:

enter image description hereenter image description here


The whole code:

#!/usr/bin/python3# 2018.01.17 22:36:20 CSTimport cv2
import numpy as np
import time

img = cv2.imread('test.jpg', 0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  # ensure binary
retval, labels = cv2.connectedComponents(img)

##################################################
ts = time.time()
num = labels.max()

N = 50for i inrange(1, num+1):
    pts =  np.where(labels == i)
    iflen(pts[0]) < N:
        labels[pts] = 0print("Time passed: {:.3f} ms".format(1000*(time.time()-ts)))
# Time passed: 4.607 ms################################################### Map component labels to hue val
label_hue = np.uint8(179*labels/np.max(labels))
blank_ch = 255*np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])

# cvt to BGR for display
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)

# set bg label to black
labeled_img[label_hue==0] = 0

cv2.imshow('labeled.png', labeled_img)
cv2.imwrite("labeled.png", labeled_img)
cv2.waitKey()

Post a Comment for "Use Cv2.connectedcomponents And Eliminate Elements With A Small Number Of Pixels"