灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩变化的图像, R、 G、 B 三个分量的平均值趋于同一个灰度K。一般有两种方法来确定该灰度。灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩变化的图像, R、 G、 B 三个分量的平均值趋于同一个灰度K 算法的第二步是分别计算各通道的增益:

Raver、Gaver和Baver分别是三通道平均值

K=Gray 同一灰度

三通道增益系数:Kr=K/Raver;Kg=K/Gaver;Kb=K/Baver

算法第三步,根据Von Kries对角模型,对于图像像素中的每个像素C,调整其RGB分量:

Rnew=R x Kr; Gnew=G x Kg; Bnew= B x Kb

对于上式,可能会存在溢出(>255,不会出现小于0)的现象,处理方法有两种:

a.直接将像素设置为255,这可能会造成图像整体偏白

b.计算所有Rnew、Gnew、Bnew的最大值,然后利用该最大值将计算后数据重新线性映射到[0,255]内。实践阵营这种方式会使图像整体偏暗,建议用第一种。


import cv2
import numpy as np

def GW(orgImg):
    B, G, R = np.double(orgImg[:, :, 0]), np.double(orgImg[:, :, 1]), np.double(orgImg[:, :, 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)
    print(np.mean(Ba),np.mean(Ga),np.mean(Ra))
    dst_img = np.uint8(np.zeros_like(orgImg))
    dst_img[:, :, 0] = Ba
    dst_img[:, :, 1] = Ga
    dst_img[:, :, 2] = Ra
    cv2.imshow("dstimg", dst_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    orgImg = cv2.imread("/Users/mac/Desktop/Test/13.jpeg")
    cv2.imshow("orgImg",orgImg)
    cv2.waitKey(0)
    GW(orgImg)	

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐