我正在做一些图像处理,我需要一个在 CPU 计算时间方面不太密集的自动白平衡算法。有什么建议吗?
编辑:如果它与效率有关,我将在 Java 中用彩色图像作为整数数组来实现它。
我正在做一些图像处理,我需要一个在 CPU 计算时间方面不太密集的自动白平衡算法。有什么建议吗?
编辑:如果它与效率有关,我将在 Java 中用彩色图像作为整数数组来实现它。
GIMP 显然使用一种非常简单的算法来实现自动白平衡。 http://docs.gimp.org/en/gimp-layer-white-balance.html
白平衡命令通过分别拉伸红色、绿色和蓝色通道来自动调整活动层的颜色。为此,它会丢弃红色、绿色和蓝色直方图每一端的像素颜色,这些颜色仅被图像中 0.05% 的像素使用,并尽可能地扩展剩余范围。结果是,与拉伸对比度相比,很少出现在直方图外边缘的像素颜色(可能是灰尘等)不会对用于拉伸直方图的最小值和最大值产生负面影响。然而,像“拉伸对比度”一样,生成的图像中可能存在色调偏移。
由于我第一次尝试实施这项工作似乎适用于大多数照片,但其他照片似乎有伪影或包含过多的红绿或蓝色:/
一个相对简单的算法是平均屏幕上最亮和最暗像素的色调(在 HSV 或 HSL 中)。在紧要关头,只使用最亮的像素。如果最亮和最暗之间的色调差异太大,请使用亮像素。如果黑暗接近黑色,则使用明亮的像素。
为什么还要看暗像素?有时黑暗并不接近黑色,并暗示环境光或雾或霾。
如果您是 Photoshop 的重度用户,这对您来说很有意义。照片中的高光与对象的底层颜色无关(或弱相关)。它们是光线偏色的最佳表现,除非图像曝光过度以至于所有东西都淹没了 CCD。
然后调整所有像素的色调。
您需要快速 RGB 到 HSV 和 HSV 到 RGB 函数。(但也许您可以在 RGB 中使用 LUT 或线性插值进行像素校正。)
您不想使用平均像素颜色或最流行的颜色。那就是疯狂。
要快速找到最亮的颜色(和最暗的颜色),您可以使用 RGB,但您应该有绿色、红色和蓝色的乘数。在 RGB 显示器上,255 绿色比 255 红色亮,255 红色比 255 蓝色亮。我以前脑子里有很好的乘数,但可惜,它们已经从我的记忆中消失了。你可能可以用谷歌搜索他们。
这将在没有高光的图像中失败。例如,哑光漆墙。但我不知道你能做些什么。
这个简单的算法有很多改进。您可以平均多个亮像素,对图像进行网格化并从每个单元格中抓取亮像素和暗像素等。在实施算法后,您会发现一些明显的调整。
@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)] )
它快速、简单并且提供了相当不错的结果
白平衡算法很难。即使数码相机偶尔也会出错,即使他们知道很多关于图片的额外信息——比如是否使用了闪光灯,以及光线水平。
对于初学者,我只会平均红色、绿色和蓝色,并将其用作白平衡点。设置限制 - 保持在钨丝灯、荧光灯和日光的范围内。它不会是完美的,但当它出错时,解释原因相对容易。
最近发布的一种算法是颜色分布算法:
D. Cheng、DK Prasad 和 MS Brown,
“颜色恒定性的光源估计:为什么空间域方法起作用以及颜色分布的作用”
美国光学学会杂志 A 31 (5):1049-1058 (2014)
文档_ _
论文中还引用了Matlab 源代码(Internet Archive)。这是一个简单的算法,可以很容易地编程,结果表明它非常快。
如果您需要其他快速且同时准确的白平衡(颜色恒常性)算法,您应该查看此站点。
有几种算法具有各自的源代码,可能正是您要寻找的那些。