我正在做一些图像处理,我需要一个自动白平衡算法,它在CPU计算时间方面不是太强烈。有什么建议吗?
编辑:如果它与效率相关,我将用Java实现它,彩色图像作为整数数组。
答案 0 :(得分:21)
一种相对简单的算法是对屏幕上最亮和最暗像素的色调(HSV或HSL)进行平均。在紧要关头,只使用最亮的像素。如果最亮和最暗之间的色调差别太大,请选择亮像素。如果黑暗接近黑色则使用亮像素。
为什么甚至看看暗像素?有时暗处不是黑色,暗示环境光线或雾或雾。
如果你是一个沉重的Photoshop用户,这对你有意义。照片中的高光与对象的底层颜色无关(或弱相关)。它们是你对光线偏色的最好表现,除非图像过度曝光,以至于所有东西都淹没了CCD。
然后调整所有像素的色调。
您需要快速RGB到HSV和HSV到RGB功能。 (但也许你可以使用RGB来进行LUT或线性插值的像素校正。)
您不希望使用平均像素颜色或最流行的颜色。那种方式就是疯狂。
要快速找到最亮的颜色(和最暗的颜色),你可以使用RGB,但你应该有绿色,红色和蓝色的乘数。在RGB监视器上,255绿色比255红色亮,亮度大于255蓝色。我过去常常有很好的乘数,但唉,他们已经逃离了我的记忆。你可以为他们谷歌。
这将在没有高光的图像中失败。例如,哑光漆墙。但我不知道你能做些什么。
这个简单的算法有很多改进。您可以对多个明亮像素进行平均,对图像进行网格划分,并从每个单元格中获取亮暗像素等。实现算法后,您会发现一些明显的调整。
答案 1 :(得分:19)
GIMP显然使用一种非常简单的算法来实现自动白平衡。 http://docs.gimp.org/en/gimp-layer-white-balance.html
白平衡命令通过分别拉伸红色,绿色和蓝色通道自动调整活动图层的颜色。为此,它会丢弃红色,绿色和蓝色直方图两端的像素颜色,这些直方图仅占图像中0.05%的像素,并尽可能地拉伸剩余范围。结果是,与拉伸对比度相比,在直方图的外边缘非常不频繁出现的像素颜色(可能是灰尘等)不会对用于拉伸直方图的最小值和最大值产生负面影响。但是,与“拉伸对比度”一样,结果图像中可能存在色调偏移。
由于我第一次尝试实现这项工作似乎适用于大多数照片,但其他照片似乎有工件或包含太多的红绿色或蓝色,所以还有比这里描述的更多的调整:/
答案 2 :(得分:6)
@Charles Ma建议使用Gimp
白平衡算法。在python
和numpy
中,这可能如下所示:
# 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)] )
它快速,简单,并提供相当不错的结果
答案 3 :(得分:4)
白平衡算法很难。即使数码相机偶尔会出错,即使他们知道很多关于图片的额外信息 - 例如是否使用了闪光灯,以及光线水平。
对于初学者,我只是平均红色,绿色和蓝色,并将其用作白平衡点。设定限制 - 保持在钨,荧光和日光的范围内。它不会是完美的,但如果错了,解释原因会相对容易。
答案 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/
有几种算法的各自源代码可能只是您要查找的算法。