簡體   English   中英

如何將顏色從 HSV 更改回 RGB

[英]How to change color back from HSV to RGB

我正在做一個小實驗來調試我的項目。 我正在嘗試操縱 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()

有人可以對此做出解釋嗎?

基本上,您只是在第二次轉換中使用了錯誤的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)處添加了舍入,因為imagetemp_image (在轉換為 BGR 之前)由於“整數切割”而略有不同; image的主要值是171 ,而temp_image主要值是170 轉換為 BGR 后的主要結果是相同的,但為了完整起見,我想提一下。

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM