场景
我已将图像转换为 HSV,我想更改图像中的值。
代码
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)
输出
它确实会根据 V 值更改颜色,但是如果我想指定确切的颜色,我仍然无法弄清楚 HSV 值与我的 RGB 或十六进制颜色值之间的相互关系。 任何帮助将不胜感激。
最佳答案
关于RGB和HSV空间之间的关系,我可以推荐你看看这个blog post .这Wikipedia page对HSV及其与RGB空间的关系有详细的描述。
python 中的大多数可视化库,包括 matplotlib,默认使用 RGB 空间,因此您需要将 RGB 图像转换为 HSV,根据需要更改 HSV 值,然后将其转换回 RGB。我不太了解 cv2 库,但是当我想运行你的示例时,在 cv2.imshow 上收到一条错误消息,“如果你使用的是 Ubuntu 或 Debian,请安装 libgtk2.0-dev 和 pkg-config,然后重新-在函数 cvShowImage 中运行 cmake 或配置脚本”。因此,我建议您使用更可靠的库。
据我所知,用于此类目的的最佳库是 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 替换或更改给定 RGB 或十六进制值的 HSV 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51248667/