使用Python和OpenCV实现超快速,简单的伽玛校正功能
生活随笔
收集整理的這篇文章主要介紹了
使用Python和OpenCV实现超快速,简单的伽玛校正功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Python和OpenCV實現超快速,簡單的伽瑪校正功能
- 1. 效果圖
- 2. 什么是伽瑪校正?
- 3. 源碼
- 參考
這篇博客將介紹伽馬校正(也稱為冪律變換)是什么,并將演示如何使用Python和OpenCV實現超快速,簡單的伽瑪校正功能。
使用伽瑪校正的原因是因為眼睛與數碼相機中的傳感器所感知的顏色和亮度不同。
當數碼相機上的傳感器接收到兩倍數量的光子時,信號將加倍(線性關系)。但是當光子增加一倍時,眼睛感知到的光量只是原來的一小部分(非線性關系)。
伽瑪校正可以看作是眼睛靈敏度和相機傳感器之間的轉換。
學習完可以嘗試對自己的照片進行伽瑪校正。查找過暗或過亮并被過量曝光的圖像。然后對這些圖像進行伽瑪校正,看它們是否在視覺上更具吸引力。
1. 效果圖
原圖 VS 0.1伽瑪值 如下:
原圖 VS 0.5伽瑪值 如下:
原圖 VS 1.5伽瑪值 如下:
- 可以看到伽瑪值0.1使得圖像足夠暗沒法看;
- 伽瑪值為0.5會使結果圖像顯得比原始圖像更暗;
- 伽瑪值1.5使得結果圖像比原始圖像更亮,基本會報廢掉;
上圖效果不是很明顯,下邊的右側伽瑪圖像更具有吸引力,對比度更強,比原始圖更好看
2. 什么是伽瑪校正?
- Gamma correction 伽瑪校正
- the Power Law Transform 冪律變換
伽瑪校正也稱為冪律變換。首先,圖像像素強度必須在[0,255]到[0,1.0]的范圍內縮放。然后可以通過應用以下方程式獲得輸出的伽瑪校正圖像:
O = I ^(1 / G)
其中I是輸入圖像,G是伽瑪值。然后將輸出圖像O縮放回范圍[0,255]。
伽瑪值<1將使圖像移向光譜的較暗端,而伽瑪值> 1將使圖像顯得較亮。 Gamma值G = 1對輸入圖像沒有影響。
有兩種(簡單)的方法可以使用OpenCV和Python進行伽瑪校正:
- 簡單地利用Python + OpenCV將圖像表示為NumPy數組。只需將像素強度縮放到[0,1.0]范圍,應用變換,然后再縮放回[0,255]范圍。總體而言,NumPy方法涉及除法,加到冪,再乘以乘法-由于所有這些運算都是矢量化的,因此非常快。
- 借助OpenCV,可以更快地執行伽瑪校正。需要建立一張表格(即字典),將輸入像素值映射到輸出經過伽瑪校正的值。然后,OpenCV可以獲取該表并快速確定O(1)時間中給定像素的輸出值。
3. 源碼
# Gamma correction and the Power Law Transform,伽馬校正也稱冪律交換;使圖像變得更亮或者更暗的方法;
# USAGE
# python adjust_gamma.py --image images/_L3A4387.jpg# 導入必要的包
from __future__ import print_function
import numpy as np
import argparse
import cv2
import imutils# 伽馬校正
# --image 要對其應用伽瑪校正的圖像。
# --gamma (可選)伽瑪值,默認1.0
def adjust_gamma(image, gamma=1.0):# 建立查找表,將像素值[0,255]映射到調整后的伽瑪值# 遍歷[0,255]范圍內的所有像素值來構建查找表,然后再提高到反伽馬的冪-然后將該值存儲在表格中invGamma = 1.0 / gammatable = np.array([((i / 255.0) ** invGamma) * 255for i in np.arange(0, 256)]).astype("uint8")# 使用查找表應用伽瑪校正return cv2.LUT(image, table)# 構建命令行參數及解析
# --image 圖像路徑
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to input image")
args = vars(ap.parse_args())# 加載原始圖像
original = cv2.imread(args["image"])
original = imutils.resize(original, width=300)# 通過使用各種伽瑪值并檢查每個圖像的輸出圖像來探索伽瑪校正;
# 遍歷各種不同的伽馬值
for gamma in np.arange(0.0, 2, 0.5):# 忽略伽馬值為1的情況,因為跟原始圖像沒有任何差別if gamma == 1:continue# 應用伽馬校正并展示圖像gamma = gamma if gamma > 0 else 0.1adjusted = adjust_gamma(original, gamma=gamma)cv2.putText(adjusted, "g={}".format(gamma), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)cv2.imshow("Images", np.hstack([original, adjusted]))name = str(args['image']).replace(".jpg", "_" + str(gamma) + ".jpg")cv2.imwrite(name, adjusted)cv2.waitKey(0)
參考
- https://www.pyimagesearch.com/2015/10/05/opencv-gamma-correction/
總結
以上是生活随笔為你收集整理的使用Python和OpenCV实现超快速,简单的伽玛校正功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python,OpenCV+OCR检
- 下一篇: 使用Python和OpenCV构建图像金