我在做一些图像处理,我需要一个自动白平衡算法,这不是在CPU计算时间方面过于密集。 任何建议?
编辑:如果它是有关提高效率,我会用彩色图像作为一个整数数组实现它在Java中。
我在做一些图像处理,我需要一个自动白平衡算法,这不是在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
白平衡算法。 在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)] )
它的快速,简便,提供了相当不错的结果
白平衡算法是很难的。 即使是数码相机的同时,得到错误的一次,即使他们知道了很多关于画面额外的信息 - 如是否使用了闪光灯,和光水平。
对于初学者来说,我只想平均红色,绿色和蓝色,并使用它作为白平衡点。 在其上设置的限制 - 留范围为钨,荧光灯,和日光中。 这不会是完美的,但是当它错了,这将是比较容易解释为什么。
一个最近公布的算法是颜色分布算法,它可以在这里找到: 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/
有几种算法各自的源编码,可能正是你寻找的人。