Как я могу получить значения цвета RGB из контура в изображении, используя OpenCV? - PullRequest
0 голосов
/ 30 сентября 2019

Я знаю, что здесь уже задавались некоторые вопросы, но они не помогли мне решить мою проблему. Я буду признателен за любую помощь, чтобы решить мою проблему. Я новичок в opencv.

У меня есть изображение и применяю некоторый код для получения контуров из изображения. Теперь я хочу получить значения цвета RGB из обнаруженных контуров. Как я могу это сделать?

Я исследую его и нахожу, что его можно решить, используя контуры, поэтому я пытаюсь реализовать контуры, и теперь, наконец, я хочу получить значения цвета контуров.

Вот мой код:

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

Я ожидаю, что на выходе должны быть значения RGB обнаруженного цвета внутри контуров.

1 Ответ

0 голосов
/ 30 сентября 2019

Как указано в комментариях, вот возможное решение для извлечения значений BGR (!) Из пикселей изображения внутри ранее найденного контура. Правильное обнаружение нужных цветных полос здесь опущено, что также обсуждается в комментариях.

Имея изображение и заполненную маску контура, например от cv2.drawContours, мыможно просто использовать индексирование логического массива NumPy путем преобразования маски (наиболее вероятно uint8) в массив bool_.

Вот фрагмент кода, который использует * в NumPy1013 * для хранения всех значений в каком-то файле txt:

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

Фиктивное изображение выглядит следующим образом:

Dummy image

фиктивная контурная маска выглядит следующим образом:

Dummy contour mask

В результате values.txt содержит более 1000 записей, пожалуйста, проверьте себя. Внимание: значения являются значениями BGR;например, для получения значений RGB требуется предварительное преобразование изображения в RGB.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...