問題
如何調整彩色圖像的飽和度和亮度
解決思路
詳細步驟:
- 將RGB圖像值歸一化到[0, 1]
- 然后使用函數cvtColor進行色彩空間的轉換
- 接下來可以根據處理灰度圖像對比度增強伽馬變換或者線性變換調整飽和度和亮度分量
- 最后轉換到RGB色彩空間
代碼
# !/usr/bin/env python
# -*-encoding: utf-8-*-
# author:LiYanwei
# version:0.1
import numpy as np
import cv2
def main():
# 加載圖片 讀取彩色圖像
image = cv2.imread('./Files_image/img1.jpg', cv2.IMREAD_COLOR)
# print(image)
# cv2.imshow("image", image)
# 圖像歸一化,且轉換為浮點型
fImg = image.astype(np.float32)
fImg = fImg / 255.0
# 顏色空間轉換 BGR轉為HLS
hlsImg = cv2.cvtColor(fImg, cv2.COLOR_BGR2HLS)
l = 100
s = 100
MAX_VALUE = 100
# 調節飽和度和亮度的窗口
cv2.namedWindow("l and s", cv2.WINDOW_AUTOSIZE)
def nothing(*arg):
pass
# 滑動塊
cv2.createTrackbar("l", "l and s", l, MAX_VALUE, nothing)
cv2.createTrackbar("s", "l and s", s, MAX_VALUE, nothing)
# 調整飽和度和亮度后的效果
lsImg = np.zeros(image.shape, np.float32)
# 調整飽和度和亮度
while True:
# 復制
hlsCopy = np.copy(hlsImg)
# 得到 l 和 s 的值
l = cv2.getTrackbarPos('l', 'l and s')
s = cv2.getTrackbarPos('s', 'l and s')
# 1.調整亮度(線性變換) , 2.將hlsCopy[:, :, 1]和hlsCopy[:, :, 2]中大於1的全部截取
hlsCopy[:, :, 1] = (1.0 + l / float(MAX_VALUE)) * hlsCopy[:, :, 1]
hlsCopy[:, :, 1][hlsCopy[:, :, 1] > 1] = 1
# 飽和度
hlsCopy[:, :, 2] = (1.0 + s / float(MAX_VALUE)) * hlsCopy[:, :, 2]
hlsCopy[:, :, 2][hlsCopy[:, :, 2] > 1] = 1
# HLS2BGR
lsImg = cv2.cvtColor(hlsCopy, cv2.COLOR_HLS2BGR)
# 顯示調整后的效果
cv2.imshow("l and s", lsImg)
ch = cv2.waitKey(5)
# 按 ESC 鍵退出
if ch == 27:
break
elif ch == ord('s'):
# 按 s 鍵保存並退出
# 保存結果
lsImg = lsImg * 255
lsImg = lsImg.astype(np.uint8)
cv2.imwrite("lsImg.jpg", lsImg)
break
# 關閉所有的窗口
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
