更新於 2024/04/17閱讀時間約 5 分鐘

[OpenCV基礎][Python]影像增強_伽瑪校正Gamma correction

伽瑪校正(Gamma correction)被視為影像增強的一種方法之一。

通過調整 gamma 值,可以改變圖像的亮度和對比度,從而使圖像更清晰或更具有視覺效果。

以下將利用cv2.LUTnumpy的組合實現伽瑪校正,及詳細介紹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_mina_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 校正。它的具體步驟是:

  1. np.arange(256) / 255:創建一個從 0 到 255 的數組,然後除以 255,將像素值的範圍調整為 0 到 1 之間。
  2. pow(..., gamma):對每個值進行 gamma 次方運算,即 gamma 校正公式中的 (V / Vmax)^gamma。
  3. * 255:將校正後的值乘以 255,將值範圍調整回 0 到 255 之間。
  4. .astype(np.uint8):將數組轉換為無符號 8 位整數型別,這是圖像像素值的常見表示方式。
  5. .reshape((1, 256)):將數組調整為一行 256 列的形狀,這是 OpenCV 中 LUT 函式所需的查找表形式。

有關伽瑪校正我在網路上看到不錯的介紹






分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.