python - 如何将此 HSV 转换为 RGB

标签 python opencv

如何将此 HSV 转换为 RGB 我希望使用 cv2.color cv2.COLOR_BGR2RGB 但其结果不同。

这是我用过的图片 enter image description here

这是我想要的结果,但使用cv2.COLOR_BGR2RGB,但下面的代码使用cv2.COLOR_BGR2HSV enter image description here

import cv2
import numpy as np

## Read
img = cv2.imread("ni.jpg")

## convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

## mask of green (36,25,25) ~ (86, 255,255)
# mask = cv2.inRange(hsv, (36, 25, 25), (86, 255,255))
mask = cv2.inRange(hsv, (7, 25, 25), (70, 255,255))

## slice the green
imask = mask>0
green = np.zeros_like(img, np.uint8)
green[imask] = img[imask]

## save 
cv2.imwrite("green.png", green)

最佳答案

要将图像从 HSV 转换为 RGB,您可以执行以下操作:

rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)

将 HSV 转换为 BGR

bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

你必须知道OpenCV在读取/保存图像时使用BGR。 您可以使用 cvtColor 和 cv2.COLOR_RGB2BGR 或 cv2.COLOR_BGR2RGB 在 RGB 和 BGR 之间进行转换。

编辑:

但是,如果您想要的是绿色香蕉(或黄色香蕉)的面具,问题是您定义绿色的方式:它现在包含许多其他颜色,包括黄色。

您可以使用 HSV 做的就是仅查看第一个 channel ,即色调:

Hue of bananas

在这里您可以看到绿色和黄色是可以区分的:绿色香蕉的像素值大致在 30 到 50 之间,黄色香蕉的像素值在 20 到 30 之间。

你可以用它做一个面具。我使用另一个库来清理我们不需要的像素。这是 Scikit 图像。这也可以在 OpenCV 中完成,但需要更多时间......

这是我的代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.morphology import remove_small_objects, remove_small_holes
## Read
img = cv2.imread("ni.jpg")

## convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hue = hsv[:,:,0]

# plt.imshow(hue) # this show the figure in my post
# plt.show()

# mask = np.bitwise_and(hue > 20, hue < 35) # for yellow
mask = np.bitwise_and(hue > 30, hue < 50)  # for green
mask = remove_small_objects(mask, 1000)
mask = remove_small_holes(mask, 1000)

green = np.zeros_like(img, np.uint8)
green[mask] = img[mask]

## save
cv2.imwrite("green.png", green)

关于python - 如何将此 HSV 转换为 RGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60295773/

相关文章:

python - 将列表作为值的字典与生成值的字典进行比较

python - 寻找两个pytorch张量的非交集

Python "here, . . . where"构造

python - pycparser 是否支持用户定义的类型?

python opencv cv2.cv.CV_CAP_PROP_FRAME_COUNT 得到错误的数字

c++ - OpenCV - 不能画长线

opencv - 为什么 OpenCV 给我黑屏?

c - 树莓派和OpenCV的C语言库

c++ - OpenCV: vector < vector <Point>>到 vector <Mat>的转换,通过引用调用的问题

c# - 教程如何在Asp.Net MVC应用程序中使用EmguCV