繁体   English   中英

我如何在 Python-Fu 中做相当于 Gimp 的颜色、自动、白平衡?

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

我能找到的唯一函数是:gimp-color-balance,它采用适用的参数:preserve-lum(osity)、青色-红色、品红色-绿色和黄色-蓝色。

我不确定要为这些参数传递什么值以复制标题中的菜单选项。

为了完成@banderlog013 的回答,我认为Gimp Doc指定首先丢弃每个通道的结束像素,然后拉伸剩余范围。 我相信正确的代码是:

img = cv2.imread('test.jpg')
balanced_img = np.zeros_like(img) #Initialize final image

for i in range(3): #i stands for the channel index 
    hist, bins = np.histogram(img[..., i].ravel(), 256, (0, 256))
    bmin = np.min(np.where(hist>(hist.sum()*0.0005)))
    bmax = np.max(np.where(hist>(hist.sum()*0.0005)))
    balanced_img[...,i] = np.clip(img[...,i], bmin, bmax)
    balanced_img[...,i] = (balanced_img[...,i]-bmin) / (bmax - bmin) * 255

我用它获得了很好的结果,试试吧!

根据GIMP doc ,我们需要丢弃图像中仅 0.05% 的像素使用的红色、绿色和蓝色直方图每一端的像素颜色,并尽可能地拉伸剩余范围( Python 代码):

import numpy as np
import cv2  # opencv-python
import matplotlib.pyplot as plt


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 的“颜色 -> 自动 -> 白平衡”之后的结果非常相似

UPD:我们需要np.clip()因为OpenCVnumpy不同的方式将 int32 转换为 uint8:

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

如何从本质上获得相当于 GIMP 的Colors --> Auto --> White Balance功能:

在 Ubuntu 20.04 上测试。

从我的eRCaGuy_hello_world 存储库下载以下代码: python/auto_white_balance_img.py

安装依赖:

pip3 install opencv-python  # for cv2
pip3 install numpy

现在这里是一些功能齐全的代码,不像这里的其他一些答案是片段并且缺少import语句之类的东西。 我在这里借用@Canette Ouverture 的回答@banderlog013 的回答

创建文件auto_white_balance_img.py

#!/usr/bin/python3

import cv2
import numpy as np

file_in = 'test.jpg'

file_in_base = file_in[:-4] # strip file extension
file_in_extension = file_in[-4:]

img = cv2.imread(file_in)

# From @banderlog013's answer: https://stackoverflow.com/a/54864315/4561887
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%
    img_out1 = np.where(hist > hist.sum() * 0.0005)[0]
    i_min = img_out1.min()
    i_max = img_out1.max()
    # stretch hist
    img_out1 = (i.astype(np.int32) - i_min) / (i_max - i_min) * 255
    img_out1 = np.clip(img_out1, 0, 255)
    x.append(img_out1.astype(np.uint8))

# From @Canette Ouverture's answer: https://stackoverflow.com/a/56365560/4561887
img_out2 = np.zeros_like(img) # Initialize final image
for channel_index in range(3):
    hist, bins = np.histogram(img[..., channel_index].ravel(), 256, (0, 256))
    bmin = np.min(np.where(hist>(hist.sum()*0.0005)))
    bmax = np.max(np.where(hist>(hist.sum()*0.0005)))
    img_out2[...,channel_index] = np.clip(img[...,channel_index], bmin, bmax)
    img_out2[...,channel_index] = ((img_out2[...,channel_index]-bmin) / 
        (bmax - bmin) * 255)

# Write new files
cv2.imwrite(file_in_base + '_out1' + file_in_extension, img_out1)
cv2.imwrite(file_in_base + '_out2' + file_in_extension, img_out2)

使auto_white_balance_img.py可执行:

chmod +x auto_white_balance_img.py

现在将上面文件中的file_in变量设置为您想要的输入图像路径,然后运行它:

python3 auto_white_balance_img.py
# OR
./auto_white_balance_img.py

假设您已设置file_in = 'test.jpg' ,它将生成以下两个文件:

  1. test_out1.jpg # @banderlog013 的回答结果在这里
  2. test_out2.jpg # 来自@Canette Ouverture 的回答的结果在这里

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

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

用合成图像证明:

之前:

在此处输入图片说明

之后:

在此处输入图片说明

所有这些在 Python 中都不难做到。

克,酷。 想出了如何编写脚本。
如果您喜欢,请使用它。 对我没问题。

https://github.com/doyousketch2/eAWB

图片

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM