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

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

有帮助吗?

解决方案

一个相对简单的算法是平均屏幕上的亮和最暗的像素的色调(在HSV或HSL)。在紧要关头,走,只有最亮像素。如果亮和最暗的色调差异太大,去与亮像素。如果是暗黑色的附近去与明像素。

为什么连看暗像素?有时暗不接近黑色,并且在环境光或雾或薄雾的提示。

这将是有意义的你,如果你是一个沉重的Photoshop用户。在相片亮点无关(或弱相关的)物体的基本颜色。他们是光的偏色你最好的表现,除非图像是如此的过度曝光,一切都已经不堪重负的CCD。

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

您将需要快RGB到HSV和HSV到RGB功能。 (但是,也许可以在RGB工作用于与LUT或线性内插像素的校正。)

您不想按平均像素颜色或最流行的颜色去。这样,位于疯狂。

要快速找到最亮的颜色(和最暗的一个),你可以在RGB的工作,但你应该有乘数绿色,红色和蓝色。在一个RGB显示器,255绿色亮超过255个红色比255蓝色明亮。我曾经有过很好的乘数在我的头上,但很可惜,他们已经逃离我的记忆中。你或许可以谷歌他们。

这将不具有亮点的图像中失败。哑光画墙,例如。但我不知道你可以做什么。


有许多改进,使该简单的算法。你可以从每个细胞等平均倍数为明亮像素,栅格图像,并抓住亮区和暗像素实现算法后,您会发现一些明显的调整。

其他提示

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

  

在白平衡命令通过分别拉伸红色,绿色和蓝色通道自动调节有源层的颜色。要做到这一点,它丢弃像素颜色在红色,绿色的各端和蓝直方图其通过仅0.05%的图像中的像素的使用,并且尽可能多的拉伸剩余范围越好。其结果是发生极少的直方图(也许的灰尘比特等)的外边缘不用于拉伸的直方图,在与拉伸对比度比较最小和最大值产生负面影响该像素的颜色。像“拉伸对比度”,但是,也可以是所得到的图像中的色调偏移。

有比在实施这一作品在这里说明,因为我第一次尝试多一点的调整似乎对大多数照片,但其他照片的工作似乎有文物或含有过多的任红,绿或蓝色:/

@Charles马曾建议使用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)] )

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

白平衡算法是很难的。即使是数码相机的同时,得到错误的一次,即使他们知道了很多关于画面额外的信息 - 如是否使用了闪光灯,和光水平

对于初学者来说,我只是普通的红,绿,蓝,和使用,作为白平衡点。在其上设置的限制 - 留范围为钨,荧光灯,和日光中。这不会是完美的,但是当它错了,这将是比较容易解释为什么。

最近发布的一种算法是颜色分布算法,可以在此处找到: http://www.comp.nus.edu.sg/~brown/pdf/ColorConstancyJOSAv10.pdf 论文中还参考了Matlab源代码(http://www.comp.nus.edu.sg/~whitebal/luminant/files/luminantEstimator.m)。这是一个简单的算法,可以轻松编程,结果表明它非常快。

如果您需要额外的快速且同时准确的白平衡(颜色恒常性)算法,您应该检查此站点: http://www.fer.unizg.hr/ipg/resources/color_constancy/

有几种算法及其各自的源代码,可能正是您所寻找的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top