我正在进行一些图像处理,需要一个自动白平衡算法,不会太耗费CPU计算时间。 有任何建议吗?
编辑:如果与效率相关,则将以Java实现它,并使用整数数组作为彩色图像。
我正在进行一些图像处理,需要一个自动白平衡算法,不会太耗费CPU计算时间。 有任何建议吗?
编辑:如果与效率相关,则将以Java实现它,并使用整数数组作为彩色图像。
GIMP 显然使用一种非常简单的算法进行自动白平衡。 http://docs.gimp.org/en/gimp-layer-white-balance.html
白平衡命令通过分别拉伸红色、绿色和蓝色通道来自动调整活动图层的颜色。为此,它会丢弃红色、绿色和蓝色直方图两端的像素颜色,这些像素只在图像中占0.05%左右,并尽可能地拉伸剩余范围。结果是,在直方图的外缘非常少出现的像素颜色(如灰尘等)不会与拉伸直方图所用的最小和最大值发生负面影响,相比于“拉伸对比度”。但是,类似于“拉伸对比度”,处理后的图像可能会出现色调变化。
实际上,这里还有一些微调,因为我第一次尝试实现这个工作似乎对大多数照片有效,但其他照片似乎会产生伪影或包含过多的红色、绿色或蓝色 :/
@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)] )
它快速、简单,并提供相当不错的结果。
白平衡算法很难。即使是数码相机有时也会出错,尽管它们知道很多关于图片的额外信息-例如是否使用了闪光灯和光线水平。
首先,我只会平均红色、绿色和蓝色,并将其用作白平衡点。对其进行限制-保持在钨丝灯、荧光灯和日光范围内。虽然不完美,但当错误发生时,解释起来相对容易。