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

标签 python opencv image-processing

场景

Previous Question

我已将图像转换为 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)

输出

Output image

它确实会根据 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/

相关文章:

python - django 编码为 utf8 不工作

image-processing - 如何在 3D 中进行高斯滤波

python - 如何从 'ravi' 文件中获取数据?

opencv - 使用 DCT 嵌入水印

c++ - 快速访问 jpeg 图像的像素值

image-processing - Pytorch - 迁移学习教程中图像预处理的目的

python - 使用Python删除SQS的所有消息

python - 将一个 pandas 数据框中的值替换为另一个数据框中的值

algorithm - 检测部分模糊的图像

python - 如何将字符串转换为列表?