伽瑪校正(Gamma correction)被視為影像增強的一種方法之一。
通過調整 gamma 值,可以改變圖像的亮度和對比度,從而使圖像更清晰或更具有視覺效果。
以下將利用cv2.LUT
及numpy
的組合實現伽瑪校正,及詳細介紹cv2.LUT
函式應用。
cv2.LUT
函式的介紹:
用於進行查找表 (Look-Up Table, LUT) 的映射操作。在影像處理中,查找表是一種將輸入值映射到輸出值的機制,常用於進行顏色轉換、亮度調整等操作。
dst = cv2.LUT(src, lut)
src
: 原始影像,一般是一個 NumPy 陣列。lut
: 查找表,也是一個 NumPy 陣列,通常是一行 256 列的陣列,每列對應一個像素值的映射關係。cv2.LUT
函式可以想像成一張表格,裡面記錄了對應關係。比如,原始圖像中每個像素的數值(0 到 255)在這張表格中都有對應的新數值。當我們使用 cv2.LUT
函式時,它就會根據這張表格,把原始圖像的每個像素的數值轉換成表格中對應的新數值,最後生成一張新的圖像。
import cv2
import numpy as np
# 讀取彩色圖像
image = cv2.imread('./111.jpg')
# 提取紅色通道
red_channel = image[:, :, 2]
# 定義放大紅色通道的查找表
lut = np.arange(256, dtype=np.uint8)
lut = np.clip(2 * lut, 0, 255).astype(np.uint8)
# 將查找表應用到紅色通道上
enhanced_red_channel = cv2.LUT(red_channel, lut)
# 將放大後的紅色通道放回原始圖像中
image[:, :, 2] = enhanced_red_channel
# 顯示原始圖像和放大紅色通道後的圖像
cv2.imshow('Original Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
np.clip
用於將陣列中的元素限制在某個範圍內
numpy.clip(a, a_min, a_max, out=None)
a
:要進行操作的輸入陣列。a_min
:設定的最小值,小於這個值的元素將被設置為 a_min
。a_max
:設定的最大值,大於這個值的元素將被設置為 a_max
。out
:可選,用於指定結果的輸出陣列。np.clip()
將 a
中的每個元素限制在 a_min
和 a_max
之間
小於 a_min
的元素被設置為 a_min
大於 a_max
的元素被設置為 a_max
避免像素值溢出或超出範圍
import cv2
import numpy as np
# 讀取圖檔
img = cv2.imread('./123.png')
def gamma_correction(img: np.ndarray, gamma: float) -> np.ndarray:
look_up_table = (pow(np.arange(256) / 255, gamma) *
255).astype(np.uint8).reshape((1, 256))
res = cv2.LUT(img, look_up_table) #LUT,將look_up_table輸出進而改變亮度或曝光
return res
res = gamma_correction(img,2)
# 顯示結果圖像
cv2.imshow('reuslt', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
look_up_table = (pow(np.arange(256) / 255, gamma) * 255).astype(np.uint8).reshape((1, 256))
:
這一行代碼創建了一個查找表 (look_up_table
),實現於對每個像素值進行 gamma 校正。它的具體步驟是:
np.arange(256) / 255
:創建一個從 0 到 255 的數組,然後除以 255,將像素值的範圍調整為 0 到 1 之間。pow(..., gamma)
:對每個值進行 gamma 次方運算,即 gamma 校正公式中的 (V / Vmax)^gamma。* 255
:將校正後的值乘以 255,將值範圍調整回 0 到 255 之間。.astype(np.uint8)
:將數組轉換為無符號 8 位整數型別,這是圖像像素值的常見表示方式。.reshape((1, 256))
:將數組調整為一行 256 列的形狀,這是 OpenCV 中 LUT 函式所需的查找表形式。