如何将颜色从HSV更改回RGB

时间:2019-11-22 06:14:29

标签: python numpy colors

我正在做一个小实验来调试我的项目。我试图在HSV色彩空间上操纵色相值,以将其更改回RGB时看到对其的影响。

我有一个带有整个蓝色背景的简单图像,其中有一个红色圆圈。我将其从RGB转换为HSV,然后更改其中一个值,然后将其恢复为先前的值(请查看代码,我不能仅使用单词来解释它)。我原本希望图像保持不变,但令我惊讶的是,当我将其从HSV更改回RGB时,它会提供不同的图像。

import cv2
import sys
import numpy as np
from matplotlib import pyplot as plt
from bqplot import pyplot as bq
import math
import os

ori_image = cv2.imread('../test.png')
image = np.float32(ori_image)
image = cv2.cvtColor(ori_image,cv2.COLOR_BGR2HSV_FULL)
hues=np.round(image[:,:,0]/255*360)
np.place(hues,hues==229,50)
np.place(hues,hues==50,229)
hues=hues/360*255
temp_image = image.copy()
temp_image[:,:,0]=hues
temp_image=cv2.cvtColor(temp_image,cv2.COLOR_HSV2RGB)
plt.imshow(temp_image)
plt.show()

有人可以对此进行解释吗?

1 个答案:

答案 0 :(得分:1)

基本上,您在第二次转换中使用了错误的ColorConversionCode。如果将COLOR_BGR2HSV_FULL用于“正向转换”,则需要使用COLOR_HSV2BGR_FULL用于“向后转换”。您使用了COLOR_HSV2RGB,这确实有两种错误:(1)您转换为RGB而不是BGR,并且(2)您没有对H通道使用完全转换。

import cv2
import numpy as np
from matplotlib import pyplot as plt

orig_image = np.ones((400, 400, 3), np.uint8)
orig_image[:, :, 0] *= 255
orig_image[:, :, 1:3] = 0
cv2.circle(orig_image, (100, 100), 50, (0, 0, 255), cv2.FILLED)

image = np.float32(orig_image)                                  # this line is ignored either way
image = cv2.cvtColor(orig_image, cv2.COLOR_BGR2HSV_FULL)
hues = np.round(image[:, :, 0] / 255 * 360)
np.place(hues, hues == 229, 50)
np.place(hues, hues == 50, 229)
hues = np.round(hues / 360 * 255)                               # Use np.round here, too, to prevent integer cutting
temp_image = image.copy()
temp_image[:, :, 0] = hues
temp_image = cv2.cvtColor(temp_image,  cv2.COLOR_HSV2BGR_FULL)  # You need to use the proper color conversion code here

plt.figure(1)
plt.subplot(1, 2, 1), plt.imshow(orig_image), plt.title('Original image')
plt.subplot(1, 2, 2), plt.imshow(temp_image), plt.title('Modified image')
plt.savefig('C:/Users/c.wilde/Desktop/output.png')
plt.show()

Output

注意:Matplotlib使用RGB排序,OpenCV BGR排序,这就是为什么图中的蓝色和红色被反转的原因。

另外,请注意:我在hues = np.round(hues / 360 * 255)处添加了一个舍入,因为imagetemp_image(转换为BGR之前)由于“整数切割”而略有不同; image的大多数值为171,而temp_image的大多数值为170。转换为BGR后的主要结果是相同的,但是出于完整性考虑,我想提一提。

希望有帮助!