擅长:python、mysql、java
<p>根据<a href="https://docs.gimp.org/2.10/en/gimp-layer-white-balance.html" rel="nofollow noreferrer">GIMP doc</a>,我们需要丢弃红、绿、蓝柱状图每端的像素颜色,这些直方图只使用图像中0.05%的像素,并尽可能扩展剩余的范围(<strong>Python代码</strong>):</p>
<pre class="lang-py prettyprint-override"><code>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])
</code></pre>
<p>结果与GIMP的“Colors->Auto->White Balance”之后的结果非常相同</p>
<p><strong>UPD:</strong>我们需要<code>np.clip()</code>,因为<code>OpenCV</code>和{<cd3>}不同地将int32转换为uint8:</p>
^{pr2}$