【问题标题】:How can i get the rgb color values from inside of a contour in image using opencv?如何使用opencv从图像轮廓内部获取rgb颜色值?
【发布时间】:2023-03-31 22:20:02
【问题描述】:

我知道这里已经提出了一些问题,但它们并没有帮助我解决我的问题。我将不胜感激任何帮助解决我的问题。 我是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) 为什么在转换为 HSV 颜色空间之前“反转”输入图像:img_hsv = cv2.cvtColor(255-img, cv2.COLOR_BGR2HSV)? 2)你期望输出是什么样的?像某种直方图?像素特定的 RGB 值(如 JUST 像素)?
  • 我反转图像以检测两条彩色线,如图所示(两条红线)。如果这不是一个好方法,那么请帮助我改进它。我想要像素特定的 RGB 值,例如 [183, 172, 167]
  • 用于选择“正确的”HSV 颜色范围:在one of my answers to an earlier question 中有一个简短的介绍。查看您的输入图像,我非常怀疑您是否可以准确地提取第二个较轻的条纹,并至少保持一些代码的通用性。如果您设置了适当的红色范围,则可以找到第一个更存在的条纹,可能位于色相光谱的“紫色末端”(有关进一步说明,请参阅链接)。
  • 好的,那很好,您能否提供我的问题的解决方案,例如如何从 opencv 中的轮廓内部获取 rgb 值?谢谢

标签: python opencv


【解决方案1】:

正如 cmets 中所要求的,这是从之前找到的轮廓内的图像像素中提取 BGR(!) 值的可能解决方案。此处省略了对所需彩色条纹的正确检测,这也在 cmets 中进行了讨论。

拥有一个图像和一个轮廓的填充掩码,例如来自cv2.drawContours,我们可以简单地使用 NumPy 的boolean array indexing,将(很可能是uint8)掩码转换为bool_ 数组。

这是一个短代码 sn-p,它使用 NumPy 的 savetxt 将所有值存储在某个 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()

虚拟图像如下所示:

虚拟轮廓蒙版如下所示:

生成的 values.txt 有超过 1000 个条目,请自行检查。注意:数值为 BGR 值;例如需要先将图像转换为 RGB 才能获得 RGB 值。

希望有帮助!

【讨论】:

  • 您能否通过给我准确的下限值和上限值,方便我正确检测图像中显示的两条线?谢谢
猜你喜欢
  • 2021-11-26
  • 2020-09-22
  • 1970-01-01
  • 2013-04-23
  • 2014-11-29
  • 2012-07-04
  • 2020-05-08
  • 2013-04-02
  • 1970-01-01
相关资源
最近更新 更多