How to use Python OpenCV ConnectedComponents function to obtain the images?
From searching some past question, I have only been able to find how to shade the connected objects in different colors (Which I tested and it worked, but I have no idea how the labels work)
Reference from these previously answered questions: Stackoverflow question 48303309 and Stackoverflow question 46441893
Using this code, I can get the shaded output
import cv2
import numpy as np
img = cv2.imread('eGaIy.jpg', 0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1] # ensure binary
ret, labels = cv2.connectedComponents(img)
# 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.waitKey()
Is there any way I can get the connected objects out from the image?
So output would be multiple images from the original image
cv2. connectedComponents is simpler, and returns a tuple of component numbers and an image with labels for components ( labelmap ). In addition to the previous function's outputs, cv2. connectedComponentsWithStats also returns statistics about each component and the components' centroid locations.
We give Image name parameter with extension when we will run python script #Read the image. The first Command line argument is the image image = cv2. imread(sys. argv[1]) #The function to read from an image into OpenCv is imread() #imshow() is the function that displays the image on the screen.
image = cv2.imread('image.png', cv2.IMREAD_UNCHANGED);
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# getting mask with connectComponents
ret, labels = cv2.connectedComponents(binary)
for label in range(1,ret):
mask = np.array(labels, dtype=np.uint8)
mask[labels == label] = 255
cv2.imshow('component',mask)
cv2.waitKey(0)
# getting ROIs with findContours
contours = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
for cnt in contours:
(x,y,w,h) = cv2.boundingRect(cnt)
ROI = image[y:y+h,x:x+w]
cv2.imshow('ROI', ROI)
cv2.waitKey(0)
cv2.destroyAllWindows()
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