https://github.com/18150167970/image_process_tool/blob/master/lighting_enhancement.py
先上效果图,从上到下分别为
img : 原图
img1:均值白平衡法
img2: 完美反射
img3: 灰度世界假设
img4: 基于图像分析的偏色检测及颜色校正方法
img5: 动态阈值算法
img6: gamma校正
img7: HDR校正
7种变换原理:
灰度世界、完美反射、动态阈值原理及其c++实现: https://www.cnblogs.com/Imageshop/archive/2013/04/20/3032062.html
基于图像分析的偏色检测及颜色校正方法:http://www.wanfangdata.com.cn/details/detail.do?_type=perio&id=ckjs200805003
gamma校正:https://blog.csdn.net/tkokof1/article/details/87878442
HDR校正:contrast image correction
7种变换代码:
参考了:https://blog.csdn.net/qq_36187544/article/details/97657927 中几种白平衡的实现,对其进行速度优化,并增加了新的白平衡算法(伽马校正与HDR校正)。
github地址为:https://github.com/18150167970/image_process_tool/blob/master/lighting_enhancement.py 欢迎提意见和star
# Copyright 2020 chenli Authors. All Rights Reserved.
import cv2
import numpy as np
import math
def mean_white_balance(img):
"""
第一种简单的求均值白平衡法
:param img: cv2.imread读取的图片数据
:return: 返回的白平衡结果图片数据
"""
# 读取图像
b, g, r = cv2.split(img)
r_avg = cv2.mean(r)[0]
g_avg = cv2.mean(g)[0]
b_avg = cv2.mean(b)[0]
# 求各个通道所占增益
k = (r_avg + g_avg + b_avg) / 3
kr = k / r_avg
kg = k / g_avg
kb = k / b_avg
r = cv2.addWeighted(src1=r, alpha=kr, src2=0, beta=0, gamma=0)
g = cv2.addWeighted(src1=g, alpha=kg, src2=0, beta=0, gamma=0)
b = cv2.addWeighted(src1=b, alpha=kb, src2=0, beta=0, gamma=0)
balance_img = cv2.merge([b, g, r])
return balance_img
def perfect_reflective_white_balance(img_input):
"""
完美反射白平衡
STEP 1:计算每个像素的R\G\B之和
STEP 2:按R+G+B值的大小计算出其前Ratio%的值作为参考点的的阈值T
STEP 3:对图像中的每个点,计算其中R+G+B值大于T的所有点的R\G\B分量的累积和的平均值
STEP 4:对每个点将像素量化到[0,255]之间
依赖ratio值选取而且对亮度最大区域不是白色的图像效果不佳。
:param img: cv2.imread读取的图片数据
:return: 返回的白平衡结果图片数据
"""
img = img_input.copy()
b, g, r = cv2.split(img)
m, n, t = img.shape
sum_ = np.zeros(b.shape)
# for i in range(m):
# for j in range(n):
# sum_[i][j] = int(b[i][j]) + int(g[i][j]) + int(r[i][j])
sum_ = b.astype(np.int32) + g.astype(np.int32) + r.astype(np.int32)
hists, bins = np.histogram(sum_.flatten(), 766, [0, 766])
Y = 765
num, key = 0, 0
ratio = 0.01
while Y >= 0:
num += hists[Y]
if num > m * n * ratio / 100:
key = Y
break
Y = Y - 1
# sum_b, sum_g, sum_r = 0, 0, 0
# for i in range(m):
# for j in range(n):
# if sum_[i][j] >= key:
# sum_b += b[i][j]
# sum_g += g[i][j]
# sum_r += r[i][j]
#