Pin-Jiun / ComputerVision

0 stars 0 forks source link

3-HLS, Modify Lightness and Saturation #3

Open Pin-Jiun opened 1 year ago

Pin-Jiun commented 1 year ago

飽和度

飽和度是色彩的純度或鮮豔度,以白色缺乏程度表示。飽和度 100% 的色彩不包含任何白色。飽和度 0% 的色彩帶點灰色。

飽和度是色彩的鮮豔度。想像亮橘色,這是相當鮮豔的色彩。隨著彩度降低(色相和明度保持不變),橘色就會逐次變成褐色、褐灰色,最後是中性灰色(飽和度降至 0 之後)。

降低飽和度會使色彩流失,只剩下灰階元素。褐灰色和淡紫色都是飽和度低的色彩,因為兩色皆相當中性,只有少許色彩元素。 蘋果紅和香蕉黃是飽和度很高的色彩。飽和度是可測量色彩與相同亮度的中性灰之間的差異程度。 在數位影像中,提高飽和度可讓影像色彩更鮮豔、更有「震撼力」,但是飽和度太高也會扭曲色彩,造成膚色不自然等問題。您可以使用「自然飽和色調」控制項,將目標僅設定在低飽和度的區域,而不影響影像的其餘區域。例如,您可以加強影像飽和度較低部分的色彩,而不顯著改變膚色。

HLS 顏色空間

image

從上圖我們可以看見在 HLS 顏色空間 中色彩分佈的三維座標, 分別是 Hue(顏色)、Lightness(亮度)、Saturation(飽和度), 我們能透過這三維找到我們所需要的顏色,

至於看到這三維座標所代表的意義, 相信你們已經能了解我們怎麼改變 Lightness(亮度)與Saturation(飽和度)了吧!

import cv2

img = cv2.imread('2.jpg')[:500, :500, :]
img_hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)
cv2.imshow("o", img)
cv2.imshow('H', img_hls[:, :, 0])
cv2.imshow('L', img_hls[:, :, 1])
cv2.imshow('S', img_hls[:, :, 2])
cv2.waitKey(0)
cv2.destroyAllWindows()

image

運用 OpenCV 調整亮度、飽和度

def modify_lightness_saturation(img):

    origin_img = img

    # 圖像歸一化,且轉換為浮點型
    fImg = img.astype(np.float32)
    fImg = fImg / 255.0

    # 顏色空間轉換 BGR -> HLS
    hlsImg = cv2.cvtColor(fImg, cv2.COLOR_BGR2HLS)
    hlsCopy = np.copy(hlsImg)

    lightness = 0 # lightness 調整為  "1 +/- 幾 %"
    saturation = 300 # saturation 調整為 "1 +/- 幾 %"

    # 亮度調整
    hlsCopy[:, :, 1] = (1 + lightness / 100.0) * hlsCopy[:, :, 1]
    hlsCopy[:, :, 1][hlsCopy[:, :, 1] > 1] = 1  # 應該要介於 0~1,計算出來超過1 = 1

    # 飽和度調整
    hlsCopy[:, :, 2] = (1 + saturation / 100.0) * hlsCopy[:, :, 2]
    hlsCopy[:, :, 2][hlsCopy[:, :, 2] > 1] = 1  # 應該要介於 0~1,計算出來超過1 = 1

    # 顏色空間反轉換 HLS -> BGR 
    result_img = cv2.cvtColor(hlsCopy, cv2.COLOR_HLS2BGR)
    result_img = ((result_img * 255).astype(np.uint8))

    print("High Saturation:")
    show_img(result_img)

我們首先將int範圍 (0-255) 的顏色表示轉換為浮點數 (0-1) 這樣方便我們做比例上的運算。

在上面提供的程式碼裡面,最後的結果會改變為 1 + x/100.0, 我們改變的lightness, saturation值都是對應 x改變的% (正或負) 大小。

避免運算結果超過範圍,我們在運算後,將所有超過1的值皆設為1。

image

https://www.wongwonggoods.com/all-posts/python/python_opencv/opencv-lightness-saturation/