我正在做一个小实验来调试我的项目。我试图在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()
有人可以对此进行解释吗?
答案 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()
注意:Matplotlib使用RGB排序,OpenCV BGR排序,这就是为什么图中的蓝色和红色被反转的原因。
另外,请注意:我在hues = np.round(hues / 360 * 255)
处添加了一个舍入,因为image
和temp_image
(转换为BGR之前)由于“整数切割”而略有不同; image
的大多数值为171
,而temp_image
的大多数值为170
。转换为BGR后的主要结果是相同的,但是出于完整性考虑,我想提一提。
希望有帮助!