场景

Previous Question

我已经将图像转换为HSV,并且想要更改Image中的值。

代码

import numpy as np
import cv2

image = cv2.imread('4.png')
#cv2.imshow("images",image)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)


hsv[:,:,0] = 0 # Changes the V value

out = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imshow("images", np.hstack([hsv, out]))

cv2.waitKey(0)

输出

python - Python为给定的RGB或十六进制值替换或更改HSV值-LMLPHP

它确实会根据V值更改颜色,但是如果我想指定确切的颜色,我仍然无法弄清楚HSV值与RGB或Hex颜色值之间的相互关系。
任何帮助将不胜感激。

最佳答案

关于RGB和HSV空间之间的关系,我建议您看一下blog post。此Wikipedia page详细描述了HSV及其与RGB空间的关系。

python中的大多数可视化库(包括matplotlib)默认情况下使用RGB空间,因此您需要将RGB图像转换为HSV,根据需要更改HSV值,然后将其转换回RGB。我对cv2库不是很了解,但是当我想运行您的示例时,在cv2.im上显示了一条错误消息,提示“如果您使用Ubuntu或Debian,请安装libgtk2.0-dev和pkg-config,然后重新-运行cmake或在函数cvShowImage中配置脚本”。因此,我建议您使用更可靠的库。

据我所知,为此目的最好的库是skimage。因此,示例代码可以如下。我将其运行在从here获得的木星行星的图像上。

import matplotlib.pyplot as plt
from skimage.color import rgb2hsv, hsv2rgb
image = plt.imread('jupiter.jpg')
image_hsv = rgb2hsv(image)
image2 = hsv2rgb(image_hsv)
fig, ax = plt.subplots(1,3, figsize = (18,6))
ax[0].imshow(image)
ax[1].imshow(image2)
ax[2].imshow(image-image2)

如您所见,尽管原始RGB图像与转换为HSV并返回RGB的图像之间的差异并不完全为零,但实际上该差异可以忽略不计。如果要对图像的HSV值应用任何更改,可以将其应用到image_hsv,然后将其转换回RGB。
您可以使用以下代码来了解您的HSV图像:
fig, ax = plt.subplots(3,1, figsize = (8,8))
fig.subplots_adjust(hspace = .4)

a = image_hsv[:,:,0]
hist, bins = np.histogram(a, bins=100, normed=True)
bin_centers = (bins[1:]+bins[:-1])*0.5
ax[0].plot(bin_centers, hist)
ax[0].set(title = 'Hue')

a = image_hsv[:,:,1]
hist, bins = np.histogram(a, bins=100, normed=True)
bin_centers = (bins[1:]+bins[:-1])*0.5
ax[1].plot(bin_centers, hist)
ax[1].set(title = 'Saturation', xlim = [0,1])

a = image_hsv[:,:,2]
hist, bins = np.histogram(a, bins=100, normed=True)
bin_centers = (bins[1:]+bins[:-1])*0.5
ax[2].plot(bin_centers, hist)
ax[2].set(title = 'Value', xlim = [0,1])

如果为木星图像的示例运行代码,则会看到色调值集中在0.0左右,代表红色阴影。我们可以使用以下代码将色相的值移至青色范围(约0.5):
image_hsv = rgb2hsv(image)
hue = image_hsv[:,:,0]
hue = hue+0.5
my_cond = hue[:,:]>1.0
hue[my_cond] = hue[my_cond]-1.0
image_hsv[:,:,0] = hue
image2 = hsv2rgb(image_hsv)

希望这会有所帮助。

关于python - Python为给定的RGB或十六进制值替换或更改HSV值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51248667/

10-12 15:02