# 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]
# time = time + 1
sum_b = b[sum_ >= key].sum()
sum_g = g[sum_ >= key].sum()
sum_r = r[sum_ >= key].sum()
time = (sum_ >= key).sum()
avg_b = sum_b / time
avg_g = sum_g / time
avg_r = sum_r / time
maxvalue = float(np.max(img))
# maxvalue = 255
# for i in range(m):
# for j in range(n):
# b = int(img[i][j][0]) * maxvalue / int(avg_b)
# g = int(img[i][j][1]) * maxvalue / int(avg_g)
# r = int(img[i][j][2]) * maxvalue / int(avg_r)
# if b > 255:
# b = 255
# if b < 0:
# b = 0
# if g > 255:
# g = 255
# if g < 0:
# g = 0
# if r > 255:
# r = 255
# if r < 0:
# r = 0
# img[i][j][0] = b
# img[i][j][1] = g
# img[i][j][2] = r
b = img[:, :, 0].astype(np.int32) * maxvalue / int(avg_b)
g = img[:, :, 1].astype(np.int32) * maxvalue / int(avg_g)
r = img[:, :, 2].astype(np.int32) * maxvalue / int(avg_r)
b[b > 255] = 255
b[b < 0] = 0
g[g > 255] = 255
g[g < 0] = 0
r[r > 255] = 255
r[r < 0] = 0
img[:, :, 0] = b
img[:, :, 1] = g
img[:, :, 2] = r
return img
def gray_world_assumes_white_balance(img):
"""
灰度世界假设
:param img: cv2.imread读取的图片数据
:return: 返回的白平衡结果图片数据
"""
B, G, R = np.double(img[:, :, 0]), np.double(img[:, :, 1]), np.double(img[:, :, 2])
B_ave, G_ave, R_ave = np.mean(B), np.mean(G), np.mean(R)
K = (B_ave + G_ave + R_ave) / 3
Kb, Kg, Kr = K / B_ave, K / G_ave, K / R_ave
Ba = (B * Kb)
Ga = (G * Kg)
Ra = (R * Kr)
# for i in range(len(Ba)):
# for j in range(len(Ba[0])):
# Ba[i][j] = 255 if Ba[i][j] > 255 else Ba[i][j]
# Ga[i][j] = 255 if Ga[i][j] > 255 else Ga[i][j]
# Ra[i][j] = 255 if Ra[i][j] > 255 else Ra[i][j]
Ba[Ba > 255] = 255
Ga[Ga > 255] = 255
Ra[Ra > 255] = 255
# print(np.mean(Ba), np.mean(Ga), np.mean(Ra))
dst_img = np.uint8(np.zeros_like(img))
dst_img[:, :, 0] = Ba
dst_img[:, :, 1] = Ga
dst_img[:, :, 2] = Ra
return dst_img
def color_correction_of_image_analysis(img):
"""
基于图像分析的偏色检测及颜色校正方法
:param img: cv2.imread读取的图片数据
:return: 返回的白平衡结果图片数据
"""
def detection(img):
"""计算偏色值"""
img_lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(img_lab)
d_a, d_b, M_a, M_b = 0, 0, 0, 0
for i in range(m):
for j in range(n):
d_a = d_a + a[i][j]
d_b = d_b + b[i][j]
d_a, d_b = (d_a / (m * n)) - 128, (d_b / (n * m)) - 128
D = np.sqrt((np.square(d_a) + np.square(d_b)))
for i in range(m):
for j in range(n):
M_a = np.abs(a[i][j] - d_a - 128) + M_a
M_b = np.abs(b[i][j] - d_b - 128) + M_b
M_a, M_b = M_a / (m * n), M_b / (m * n)
M = np.sqrt((np.square(M_a) + np.square(M_b)))
k = D / M
# print('偏色值:%f' % k)
return
b, g, r = cv2.split(img)
# print(img.shape)
m, n = b.shape
# detection(img)
I_r_2 = np.zeros(r.shape)
I_b_2 = np.zeros(b.shape)
# sum_I_r_2, sum_I_r, sum_I_b_2, sum_I_b, sum_I_g = 0, 0, 0, 0, 0
# max_I_r_2, max_I_r, max_I_b_2, max_I_b, max_I_g = int(r[0][0] ** 2), int(r[0][0]), int(b[0][0] ** 2), int(
# b[0][0]), int(g[0][0])
#
# for i in range(m):
# for j in range(n):
# I_r_2[i][j] = int(r[i][j] ** 2)
# I_b_2[i][j] = int(b[i][j] ** 2)
# sum_I_r_2 = I_r_2[i][j] + sum_I_r_2
# sum_I_b_2 = I_b_2[i][j] + sum_I_b_2
# sum_I_g = g[i][j] + sum_I_g
# sum_I_r = r[i][j] + sum_I_r
# sum_I_b = b[i][j] + sum_I_b
# if max_I_r < r[i][j]:
# max_I_r = r[i][j]
# if max_I_r_2 < I_r_2[i][j]:
# max_I_r_2 = I_r_2[i][j]
# if max_I_g < g[i][j]:
# max_I_g = g[i][j]
# if max_I_b_2 < I_b_2[i][j]:
# max_I_b_2 = I_b_2[i][j]
# if max_I_b < b[i][j]:
# max_I_b = b[i][j]
I_r_2 = (r.astype(np.float32) ** 2).astype(np.float32)
I_b_2 = (b.astype(np.float32) ** 2).astype(np.float32)
sum_I_r_2 = I_r_2.sum()
sum_I_b_2 = I_b_2.sum()
sum_I_g = g.sum()
sum_I_r = r.sum()
sum_I_b = b.sum()
max_I_r = r.max()
max_I_g = g.max()
max_I_b = b.max()
max_I_r_2 = I_r_2.max()
max_I_b_2 = I_b_2.max()
[u_b, v_b] = np.matmul(np.linalg.inv([[sum_I_b_2, sum_I_b], [max_I_b_2, max_I_b]]), [sum_I_g, max_I_g])
[u_r, v_r] = np.matmul(np.linalg.inv([[sum_I_r_2, sum_I_r], [max_I_r_2, max_I_r]]), [sum_I_g, max_I_g])
# print(u_b, v_b, u_r, v_r)
# b0, g0, r0 = np.zeros(b.shape, np.uint8), np.zeros(g.shape, np.uint8), np.zeros(r.shape, np.uint8)
# for i in range(m):
# for j in range(n):
# b_point = u_b * (b[i][j] ** 2) + v_b * b[i][j]
# g0[i][j] = g[i][j]
# # r0[i][j] = r[i][j]
# r_point = u_r * (r[i][j] ** 2) + v_r * r[i][j]
# if r_point > 255:
# r0[i][j] = 255
# else:
# if r_point < 0:
# r0[i][j] = 0
# else:
# r0
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.暗通道图像去雾算法:何恺明的暗通道先验(dark channel prior)去雾算法是计算机视觉界去雾领域很有名的算法。2.光照不均匀校正:本实验使用动态阈值算法进行光照不均匀校正,该方法属于自动白平衡算法,参考论文 是《A Novel Automatic White Balance Method For Digital Still Cameras》。算法分为两个步骤:白点检测和白点调整。
资源详情
资源评论
资源推荐
收起资源包目录
project3.rar (12个子文件)
project3
2.png 289KB
illumination_correction.py 17KB
1.png 165KB
.idea
.gitignore 50B
misc.xml 204B
workspace.xml 6KB
inspectionProfiles
Project_Default.xml 447B
profiles_settings.xml 174B
project3.iml 291B
modules.xml 275B
defog.jpg 53KB
defogging.py 2KB
共 12 条
- 1
wtHannah
- 粉丝: 2
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0