这篇文章主要介绍了python实现图像自动Gamma校正方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
文章源自设计学徒自学网-http://www.sx1c.com/41371.html
python图像自动Gamma校正
文章源自设计学徒自学网-http://www.sx1c.com/41371.html
关于Gamma
Gamma校正是对动态范围内亮度的非线性存储/还原算法,即输入值进行的非线性操作,使输出值与输入值呈指数关系;文章源自设计学徒自学网-http://www.sx1c.com/41371.html
从效果上来说Gamma校正调整图像的整体亮度,没有校正的图像看起来可能会存在过亮或太暗的情况,所以想要图像显示效果更完美,Gamma校正就显得很重要了。文章源自设计学徒自学网-http://www.sx1c.com/41371.html
Gamma矫正的计算过程如下:文章源自设计学徒自学网-http://www.sx1c.com/41371.html
1
|
output = 〖 input 〗^( 1 / Gamma) |
使用上面的指数函数把每个像素的RGB值进行变换。文章源自设计学徒自学网-http://www.sx1c.com/41371.html
具体执行下列转换公式(假定像素值的取值范围为0到255):文章源自设计学徒自学网-http://www.sx1c.com/41371.html
1
2
3
|
R = 〖 255X (R / 255 )〗^(( 1 / gamma)) G = 〖 255X (G / 255 )〗^(( 1 / gamma)) B = 〖 255X (B / 255 )〗^(( 1 / gamma)) |
一般处理Gamma矫正都是通过手动调节gamma值来完成的,文章源自设计学徒自学网-http://www.sx1c.com/41371.html
但如果图片多的情况下,手动设置gamma值显得过于麻烦,文章源自设计学徒自学网-http://www.sx1c.com/41371.html
这时候就需要采用自动Gamma矫正,将RGB图片转成灰度图,文章源自设计学徒自学网-http://www.sx1c.com/41371.html
计算灰度图的数据均值,通过下面的计算公式计算gamma值。
1
|
gamma_val = math.log10( 0.5 ) / math.log10(mean / 255 ) |
python实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import cv2 import numpy as np import math import os def gamma_trans(img, gamma): # gamma函数处理 gamma_table = [np.power(x / 255.0 , gamma) * 255.0 for x in range ( 256 )] # 建立映射表 gamma_table = np. round (np.array(gamma_table)).astype(np.uint8) # 颜色值为整数 return cv2.LUT(img, gamma_table) # 图片颜色查表。另外可以根据光强(颜色)均匀化原则设计自适应算法。 def nothing(x): pass data_base_dir = r './1' # 输入文件夹的路径 outfile_dir = r './2' # 输出文件夹的路径 list = os.listdir(data_base_dir) list .sort() list2 = os.listdir(outfile_dir) list2.sort() for file in list : # 遍历目标文件夹图片 read_img_name = data_base_dir + '/' + file .strip() # 取图片完整路径 image = cv2.imread(read_img_name) # 读入图片 img_gray = cv2.imread(read_img_name, 0 ) # 灰度图读取,用于计算gamma值 mean = np.mean(img_gray) gamma_val = math.log10( 0.5 ) / math.log10(mean / 255 ) # 公式计算gamma image_gamma_correct = gamma_trans(image, gamma_val) # gamma变换 out_img_name = outfile_dir + '/' + file .strip() cv2.imwrite(out_img_name, image_gamma_correct) print ( "The photo which is processed is {}" . format ( file )) |
总结
以上为个人经验,希望能给大家一个参考
评论