白平衡算法[关闭]

问题描述 投票:25回答:5

我正在做一些图像处理,我需要一个自动白平衡算法,它在CPU计算时间方面不是太强烈。有什么建议?

编辑:如果它与效率相关,我将用Java实现它,彩色图像作为整数数组。

algorithm image-processing image-enhancement
5个回答
21
投票

一种相对简单的算法是对屏幕上最亮和最暗像素的色调(HSV或HSL)进行平均。在紧要关头,只使用最亮的像素。如果最亮和最暗之间的色调差别太大,请选择亮像素。如果黑暗接近黑色则使用明亮的像素。

为什么甚至看看暗像素?有时暗处不是黑色,暗示环境光线或雾或雾。

如果你是一个沉重的Photoshop用户,这将对你有意义。照片中的高光与对象的底层颜色无关(或弱相关)。它们是你对光的偏色的最佳表现,除非图像过度曝光以至于所有东西都淹没了CCD。

然后调整所有像素的色调。

您需要快速RGB到HSV和HSV到RGB功能。 (但也许你可以使用RGB来进行LUT或线性插值的像素校正。)

您不希望使用平均像素颜色或最流行的颜色。那种方式就是疯狂。

要快速找到最亮的颜色(和最暗的颜色),您可以使用RGB,但是您应该有绿色,红色和蓝色的乘数。在RGB监视器上,255绿色比255红色亮,亮度大于255蓝色。我过去常常有很好的乘数,但唉,他们已经逃离了我的记忆。你可以谷歌为他们。

这将在没有高光的图像中失败。例如,哑光漆墙。但我不知道你能做些什么。


对这个简单的算法有许多改进。您可以对多个明亮像素进行平均,对图像进行网格划分,并从每个单元格中获取亮暗像素等。在实现算法后,您会发现一些明显的调整。


19
投票

GIMP显然使用一种非常简单的算法来实现自动白平衡。 http://docs.gimp.org/en/gimp-layer-white-balance.html

白平衡命令通过分别拉伸红色,绿色和蓝色通道自动调整活动层的颜色。为此,它会丢弃红色,绿色和蓝色直方图每一端的像素颜色,这些直方图仅占图像中0.05%的像素,并尽可能地拉伸剩余范围。结果是,与拉伸对比度相比,在直方图的外边缘非常不频繁出现的像素颜色(可能是灰尘等)不会对用于拉伸直方图的最小值和最大值产生负面影响。但是,与“拉伸对比度”一样,结果图像中可能存在色调偏移。

由于我第一次尝试实现这项工作似乎适用于大多数照片,但其他照片似乎有文物或包含太多的红绿色或蓝色,所以还有比这里描述的更多的调整:/


6
投票

@Charles Ma建议使用Gimp白平衡算法。在pythonnumpy,这可能是这样的:

# white balance for every channel independently
def wb(channel, perc = 0.05):
    mi, ma = (np.percentile(channel, perc), np.percentile(channel,100.0-perc))
    channel = np.uint8(np.clip((channel-mi)*255.0/(ma-mi), 0, 255))
    return channel

image = cv2.imread("foo.jpg", 1) # load color
imWB  = np.dstack([wb(channel, 0.05) for channel in cv2.split(img)] )

它快速,简单,并提供相当不错的结果


4
投票

白平衡算法很难。即使数码相机偶尔也会出错,即使他们知道很多关于图片的额外信息 - 例如是否使用了闪光灯,以及光线水平。

对于初学者,我只是平均红色,绿色和蓝色,并将其用作白平衡点。设定限制 - 保持在钨,荧光和日光的范围内。它不会是完美的,但如果错了,解释原因会相对容易。


3
投票

最近发布的一种算法是颜色分布算法,它可以在这里找到:http://www.comp.nus.edu.sg/~brown/pdf/ColorConstancyJOSAv10.pdf本文还提到了Matlab源代码(http://www.comp.nus.edu.sg/~whitebal/illuminant/files/illuminantEstimator.m)。这是一个简单的算法,可以很容易地编程,结果表明它非常快。

如果你需要额外的快速和同时准确的白平衡(颜色恒定)算法,你应该检查这个网站:http://www.fer.unizg.hr/ipg/resources/color_constancy/

有几种算法及其各自的源代码可能只是您要查找的算法。

© www.soinside.com 2019 - 2024. All rights reserved.