Cha*_* Ma 25 algorithm image-processing image-enhancement
我正在做一些图像处理,我需要一个自动白平衡算法,它在CPU计算时间方面不是太强烈.有什么建议?
编辑:如果它与效率相关,我将用Java实现它,彩色图像作为整数数组.
Nos*_*dna 21
一种相对简单的算法是对屏幕上最亮和最暗像素的色调(HSV或HSL)进行平均.在紧要关头,只使用最亮的像素.如果最亮和最暗之间的色调差别太大,请选择亮像素.如果黑暗接近黑色则使用明亮的像素.
为什么甚至看看暗像素?有时暗处不是黑色,暗示环境光线或雾或雾.
如果你是一个沉重的Photoshop用户,这将对你有意义.照片中的高光与对象的底层颜色无关(或弱相关).它们是你对光的偏色的最佳表现,除非图像过度曝光以至于所有东西都淹没了CCD.
然后调整所有像素的色调.
您需要快速RGB到HSV和HSV到RGB功能.(但也许你可以使用RGB来进行LUT或线性插值的像素校正.)
您不希望使用平均像素颜色或最流行的颜色.那种方式就是疯狂.
要快速找到最亮的颜色(和最暗的颜色),您可以使用RGB,但是您应该有绿色,红色和蓝色的乘数.在RGB监视器上,255绿色比255红色亮,亮度大于255蓝色.我过去常常有很好的乘数,但唉,他们已经逃离了我的记忆.你可以谷歌为他们.
这将在没有高光的图像中失败.例如,哑光漆墙.但我不知道你能做些什么.
对这个简单的算法有许多改进.您可以对多个明亮像素进行平均,对图像进行网格划分,并从每个单元格中获取亮暗像素等.在实现算法后,您会发现一些明显的调整.
Cha*_* Ma 21
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)] )
Run Code Online (Sandbox Code Playgroud)
它快速,简单,并提供相当不错的结果