Gray World算法假设,对于一张色彩丰富的图像,R、G、B三个通道的像素均值趋于一个同一个灰度值 ϕ \phi ϕ。从物理意义上讲,灰色世界法假设自然界景物对于光线的平均反射的均值在总体上是个定值,这个定值近似地为“灰色”。颜色平衡算法将这一假设强制应用于待处理图像,可以从图像中消除环境光的影响,获得原始场景图像。
算法步骤:
- 计算
ϕ
\phi
ϕ:
ϕ = R ˉ + G ˉ + B ˉ 3 \phi=\frac{ \bar{R} + \bar{G} +\bar{B}}{3} ϕ=3Rˉ+Gˉ+Bˉ
其中, R ˉ \bar{R} Rˉ, G ˉ \bar{G} Gˉ, B ˉ \bar{B} Bˉ分别为R、G、B三波段的均值。 - 计算R、G、B三波段的增益系数:
k r = ϕ R ˉ k_r=\frac{\phi}{\bar{R}} kr=Rˉϕ
k g = ϕ G ˉ k_g=\frac{\phi}{\bar{G}} kg=Gˉϕ
k b = ϕ B ˉ k_b=\frac{\phi}{\bar{B}} kb=Bˉϕ - 根据Von Kries对角模型,对于图像中的每个像素C,分别计算R、G、B三个波段的值:
C ( R ′ ) = C ( R ) × k r C(R^{'})=C(R) \times k_r C(R′)=C(R)×kr
C ( G ′ ) = C ( G ) × k g C(G^{'})=C(G) \times k_g C(G′)=C(G)×kg
C ( B ′ ) = C ( R ) × k b C(B^{'})=C(R) \times k_b C(B′)=C(R)×kb
Python实现
import numpy as np
import cv2
image = cv2.imread('图片路径')
b,g,r = cv2.split(image)
b_avg = cv2.mean(b)[0]
g_avg = cv2.mean(g)[0]
r_avg = cv2.mean(r)[0]
avg = (b_avg+g_avg+r_avg)/3
b_k = avg/b_avg
g_k = avg/g_avg
r_k = avg/r_avg
b = (b*b_k).clip(0,255)
g = (g*g_k).clip(0,255)
r = (r*r_k).clip(0,255)
image = cv2.merge([b,g,r]).astype(np.uint8)
cv2.imshow('gray_world',image)
cv2.waitKey(0)
实验效果
用遥感影像实验了一下
原图:
Gray World后:
原图:
Gray World后: