Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use OpenCV ConnectedComponents to get the images

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()

Original Shaded

Is there any way I can get the connected objects out from the image?
So output would be multiple images from the original image

like image 523
Chopin Avatar asked Jul 25 '18 16:07

Chopin


People also ask

What does cv2 connectedComponents return?

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.

How do I read an image in python cv2?

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.


1 Answers

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()
like image 107
zindarod Avatar answered Sep 21 '22 03:09

zindarod