关于脚本:如何在Python-Fu中完成相当于Gimp的Color,Auto,White Balance的操作?

How do I do the equivalent of Gimp's Colors, Auto, White Balance in Python-Fu?

我能找到的唯一功能是:GIMP颜色平衡,它采用了适用的参数:保留亮度(OSITY)、青色红、洋红绿和黄蓝。

我不知道这些参数要传递什么值来复制标题中的菜单选项。


根据gimp-doc,我们需要丢弃红色、绿色和蓝色柱状图每端的像素颜色,这些柱状图仅被图像中0.05%的像素使用,并尽可能地扩展剩余范围(python代码):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
img = cv2.imread('test.jpg')
x = []
# get histogram for each channel
for i in cv2.split(img):
    hist, bins = np.histogram(i, 256, (0, 256))
    # discard colors at each end of the histogram which are used by only 0.05%
    tmp = np.where(hist > hist.sum() * 0.0005)[0]
    i_min = tmp.min()
    i_max = tmp.max()
    # stretch hist
    tmp = (i.astype(np.int32) - i_min) / (i_max - i_min) * 255
    tmp = np.clip(tmp, 0, 255)
    x.append(tmp.astype(np.uint8))

# combine image back and show it
s = np.dstack(x)
plt.imshow(s[::,::,::-1])

结果与gimp的"颜色"-->auto->white balance"之后的结果完全相同。

upd:我们需要np.clip(),因为OpenCVnumpy不同地将in32转换为uint8:

1
2
3
4
# Numpy
np.array([-10, 260]).astype(np.uint8)
>>> array([246,   4], dtype=uint8)
# but we need just [0, 255]

K,酷。了解如何编写一个脚本。如果你喜欢的话就用它。我没问题。

https://github.com/doyousketch2/eawb

pic


根据我在快速查看源代码后的理解(或多或少用测试图像确认),这些都是不相关的,并且在引擎盖下,Colors>Auto>White Balance

  • 获取每个通道的直方图
  • 获取确定底部和顶部的值0.6%
  • 使用这两个值作为黑点和白点,使用与"级别"非常相似的内部调用来扩展该通道的值范围。

用合成图像证明:

之前:

enter image description here

后:

enter image description here

这一切在Python中并不难做到。