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

閱讀時間約 5 分鐘

伽瑪校正(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 函式所需的查找表形式。

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






avatar-img
125會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
[OpenCV應用][Python]找出圖像中的四個方位的邊緣點求出寬高 呈上篇應用Numpy找到的座標點,那我們如何捨棄掉差異過大的座標點呢? 可能圖像物件邊緣不佳,採樣就會差異過大,造成計算出的寬高是不準確的。 遇到這種狀況,就可以使用下方的程式範例來篩選座標點。 為求方便,此範例跟圖
使用反三角函數鐘的反正切函數 math.atan2() 計算出兩個座標之間的角度。 實現方法 邊界的最大最小值,相減求得對邊,鄰邊由檢測ROI的寬或高,求得角度 定義旋轉方向性,由邊界最大最小值的座標位子得知,旋轉方向性 程式範例 利用圖中白色物體的上邊界兩個座標點位,算出物體旋轉角度。
觀看本文將可以學習到如何利用Numpy求得物件的邊緣點,及算出物件的寬跟高。 有詳細的程式邏輯說明,及各函式用法說明。 綠點及紅點則是採樣到的邊界點,比較粗的點是偵測到的最大值 完整程式碼 import cv2 import numpy as np import matplotl
瞭解二值化影像的應用和程式語法,包括物體檢測和分割、邊緣檢測、圖像分析和測量、文檔辨識,以及使用cv2.threshold的參數和程式範例。
在影像處理中,我們總是想要讓特徵更加明顯一點,可以使用銳利化的方式將特徵的邊緣增強,提升影像的細節,圖像銳利後就會有提升解析度的感覺。 拉普拉斯運算子是一種常用於影像增強的方法之一,特別是用於提高影像的邊緣和細節。 在OpenCV中,你可以使用cv2.Laplacian函數來應用拉普拉斯運算子。
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
[OpenCV應用][Python]找出圖像中的四個方位的邊緣點求出寬高 呈上篇應用Numpy找到的座標點,那我們如何捨棄掉差異過大的座標點呢? 可能圖像物件邊緣不佳,採樣就會差異過大,造成計算出的寬高是不準確的。 遇到這種狀況,就可以使用下方的程式範例來篩選座標點。 為求方便,此範例跟圖
使用反三角函數鐘的反正切函數 math.atan2() 計算出兩個座標之間的角度。 實現方法 邊界的最大最小值,相減求得對邊,鄰邊由檢測ROI的寬或高,求得角度 定義旋轉方向性,由邊界最大最小值的座標位子得知,旋轉方向性 程式範例 利用圖中白色物體的上邊界兩個座標點位,算出物體旋轉角度。
觀看本文將可以學習到如何利用Numpy求得物件的邊緣點,及算出物件的寬跟高。 有詳細的程式邏輯說明,及各函式用法說明。 綠點及紅點則是採樣到的邊界點,比較粗的點是偵測到的最大值 完整程式碼 import cv2 import numpy as np import matplotl
瞭解二值化影像的應用和程式語法,包括物體檢測和分割、邊緣檢測、圖像分析和測量、文檔辨識,以及使用cv2.threshold的參數和程式範例。
在影像處理中,我們總是想要讓特徵更加明顯一點,可以使用銳利化的方式將特徵的邊緣增強,提升影像的細節,圖像銳利後就會有提升解析度的感覺。 拉普拉斯運算子是一種常用於影像增強的方法之一,特別是用於提高影像的邊緣和細節。 在OpenCV中,你可以使用cv2.Laplacian函數來應用拉普拉斯運算子。
你可能也想看
Google News 追蹤
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
點陣圖 點陣圖是由許多方格像素組成的圖片, 因此我們常常在將圖片放大時會呈現像是馬賽克的狀況, 假設期望圖片越清晰那所需要的像素會較多個, 因此空間耗用量也相對較大。 常見的格式有: .JPG .PNG .GIF .BMP .TIFF等格式。 繪製程式碼: 向量圖 向量
Thumbnail
繼上次分享的「【🔒 影像辨識 - 影像處理】Ep.1 關於影像的基本單位, 相信我們對於影像的儲存應該有了基本的認識了, 那麼接下來我們會需要的是了解顏色的組成。 我們除了在文章裡講述概念之外, 也會提供實作的數位作品分享給大家, 請大家根據範例學習與練習。 關於顏色 灰階的時代 早期尚未
Thumbnail
歡迎來到「阿Han的軟體心法實戰營 - 影像處理」系列的文章區,我們會針對影像處理的相關知識、開發技巧進行分享,並教你手把手用程式寫出屬於自己的影像處理程式, 當然也會包括AI模型訓練的部分,就讓我們一起來探索影像處理的領域吧! 在進入影像辨識的世界之前, 我們先來了解一下關於解析度的基本概念吧!
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
Thumbnail
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
點陣圖 點陣圖是由許多方格像素組成的圖片, 因此我們常常在將圖片放大時會呈現像是馬賽克的狀況, 假設期望圖片越清晰那所需要的像素會較多個, 因此空間耗用量也相對較大。 常見的格式有: .JPG .PNG .GIF .BMP .TIFF等格式。 繪製程式碼: 向量圖 向量
Thumbnail
繼上次分享的「【🔒 影像辨識 - 影像處理】Ep.1 關於影像的基本單位, 相信我們對於影像的儲存應該有了基本的認識了, 那麼接下來我們會需要的是了解顏色的組成。 我們除了在文章裡講述概念之外, 也會提供實作的數位作品分享給大家, 請大家根據範例學習與練習。 關於顏色 灰階的時代 早期尚未
Thumbnail
歡迎來到「阿Han的軟體心法實戰營 - 影像處理」系列的文章區,我們會針對影像處理的相關知識、開發技巧進行分享,並教你手把手用程式寫出屬於自己的影像處理程式, 當然也會包括AI模型訓練的部分,就讓我們一起來探索影像處理的領域吧! 在進入影像辨識的世界之前, 我們先來了解一下關於解析度的基本概念吧!
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
Thumbnail
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib