简体   繁体   中英

How can i get the rgb color values from inside of a contour in image using opencv?

I know here already some questions were asked but they did't help me to solve my problem. I will appreciate any help to solve my problem. I'm new to opencv.

I have an image and apply some code to get contours from image. Now i want to get the RGB color values from detected contours. How can i do that?

I do research on it and find that it could be solved by using contours so i try to implement contours and now finally i want to get the color values of the contours.

Here is my Code:

import cv2
import numpy as np

img = cv2.imread('C:/Users/Rizwan/Desktop/example_strip1.jpg')

img_hsv = cv2.cvtColor(255-img, cv2.COLOR_BGR2HSV)

lower_red = np.array([40, 20, 0])
upper_red = np.array([95, 255, 255])

mask = cv2.inRange(img_hsv, lower_red, upper_red)

contours, _ = cv2.findContours(mask, cv2.RETR_TREE, 
cv2.CHAIN_APPROX_SIMPLE)
color_detected_img = cv2.bitwise_and(img, img, mask=mask)
print(len(contours))
for c in contours:
    area = cv2.contourArea(c)
    x, y, w, h = cv2.boundingRect(c)
    ax = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 0), 2)
    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    im = cv2.drawContours(color_detected_img, [box], -1, (255, 0, 0), 2)


cv2.imshow("Cropped", color_detected_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

I expect the output should be the RGB values of the detected color inside the contours.

As asked in the comments, here's a possible solution to extract the BGR(.) values from the pixels of an image inside a before found contour, The proper detecting of the desired. colored stripes is omitted here as also discussed in the comments.

Having an image and a filled mask of a contour, for example from cv2.drawContours , we can simply use NumPy's boolean array indexing by converting the (most likely uint8 ) mask to an bool_ array.

Here's a short code snippet, that uses NumPy's savetxt to store all values in some txt file:

import cv2
import numpy as np

# Some dummy image
img = np.zeros((100, 100, 3), np.uint8)
img = cv2.rectangle(img, (0, 0), (49, 99), (255, 0, 0), cv2.FILLED)
img = cv2.rectangle(img, (50, 0), (99, 49), (0, 255, 0), cv2.FILLED)
img = cv2.rectangle(img, (50, 50), (99, 99), (0, 0, 255), cv2.FILLED)

# Mask of some dummy contour
mask = np.zeros((100, 100), np.uint8)
mask = cv2.fillPoly(mask, np.array([[[20, 20], [30, 70], [70, 50], [20, 20]]]), 255)

# Show only for visualization purposes
cv2.imshow('img', img)
cv2.imshow('mask', mask)

# Convert mask to boolean array
mask = np.bool_(mask)

# Use boolean array indexing to get all BGR values from img within mask
values = img[mask]

# For example, save values to txt file
np.savetxt('values.txt', values)

cv2.waitKey(0)
cv2.destroyAllWindows()

The dummy image looks like this:

虚拟图像

The dummy contour mask looke like this:

虚拟轮廓面具

The resulting values.txt has some >1000 entries, please check yourself. Attention: Values are BGR values; eg prior converting the image to RGB is needed to get RGB values.

Hope that helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM