如何使用opencv从图像轮廓内部获取rgb颜色值?

时间:2019-09-30 09:13:37

标签: python opencv

我知道这里已经提出了一些问题,但是它们并没有帮助我解决问题。我将感谢您为解决我的问题提供的任何帮助。 我是opencv的新手。

我有一个image,并应用了一些代码来从图像中获取轮廓。现在我想从检测到的轮廓中获取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 :(得分:0)

正如评论中所问,这是一种可能的解决方案,用于从预先发现的轮廓内的图像像素中提取BGR(!)值。如注释中所述,此处省略了对所需的彩色条纹的正确检测。

具有图像和轮廓填充的蒙版(例如来自cv2.drawContours的轮廓),我们可以通过将(最有可能的uint8)蒙版转换为{{来使用NumPy的boolean array indexing 1}}数组。

这是一个简短的代码段,它使用NumPy的savetxt将所有值存储在某个bool_文件中:

txt

虚拟图像如下:

Dummy image

虚拟轮廓蒙版如下:

Dummy contour mask

生成的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() 有超过1000个条目,请检查一下自己。注意:值是BGR值;例如需要先将图像转换为RGB以获得RGB值。

希望有帮助!