在 Python 中实现 Gimp 的亮度图层模式
Implement Gimp's luminance layer mode in Python
Gimp 在图层设置中有一个“亮度”模式:
我用它在放大的低分辨率彩色图像上叠加高分辨率灰度图像,使彩色图像更清晰。例如,给定一张灰度图像和一张彩色图像
,
在模糊的彩色图像上应用灰度图像作为亮度“蒙版”的结果创建了清晰的彩色图像:
亮度过滤器如何工作,我将如何在 Python 中实现它(例如使用 Pillow)?
实验性地,使用这样的图像:
在白色之上,亮度模式下的层会渲染自身的副本,因此合成图像的底部与顶层的亮度完全相同。
如果您沿垂直方向(例如使用参考线)从一半移动到另一半,并查看 xyY
模型的指针值(其中 Y
是亮度),你发现亮度值变化不大,所以综合来看,你可以假设亮度混合模式:
将底部图像转换为具有亮度分量的某种颜色模型(可能 xyY
),
将顶部图像转换为相同颜色模型
使用顶部的亮度分量和底部的其他两个分量创建像素值。
将像素值转换回 RGB
这也与 LCh lightness
的工作方式一致,检查指针对话框中的 CIE LCh
值。
简单来说,人眼对亮度(亮度)的微小变化比对颜色的微小变化更敏感。顺便说一句,这就是 JPEG chroma-downsampling 但保留完整亮度数据的原因。
所以,基本上,您拍摄低分辨率彩色图像并将其转换为色彩空间,例如 Lab
或 HSV
或任何包含 L
或 [=14 的色彩空间=] 组件。然后用您的(高 quality/high 分辨率)亮度数据替换该组件并转换回 RGB。这样您可以保留较低质量的颜色数据,但将其与较高质量的亮度数据结合起来。
来晚了,我明天可能会写代码,但它看起来大致是这样的:
from PIL import Image
# Load low quality colour image and convert to HSV
lowQualColour = Image.open('colour.png')
HSV = lowQualColour.convert('HSV')
# Split channels, discarding Luminance
H, S, _ = HSV.split()
# Load high quality luminance as single channel
hiQualLuminance = Image.open('luminance.png').convert('L')
# Merge with colour channels and revert to RGB
result = Image.merge('HSV', (H,S,hiQualLuminance)).convert('RGB')
Gimp 在图层设置中有一个“亮度”模式:
我用它在放大的低分辨率彩色图像上叠加高分辨率灰度图像,使彩色图像更清晰。例如,给定一张灰度图像和一张彩色图像
在模糊的彩色图像上应用灰度图像作为亮度“蒙版”的结果创建了清晰的彩色图像:
亮度过滤器如何工作,我将如何在 Python 中实现它(例如使用 Pillow)?
实验性地,使用这样的图像:
在白色之上,亮度模式下的层会渲染自身的副本,因此合成图像的底部与顶层的亮度完全相同。
如果您沿垂直方向(例如使用参考线)从一半移动到另一半,并查看
xyY
模型的指针值(其中Y
是亮度),你发现亮度值变化不大,所以综合来看,你可以假设亮度混合模式:将底部图像转换为具有亮度分量的某种颜色模型(可能
xyY
),将顶部图像转换为相同颜色模型
使用顶部的亮度分量和底部的其他两个分量创建像素值。
将像素值转换回 RGB
这也与 LCh lightness
的工作方式一致,检查指针对话框中的 CIE LCh
值。
简单来说,人眼对亮度(亮度)的微小变化比对颜色的微小变化更敏感。顺便说一句,这就是 JPEG chroma-downsampling 但保留完整亮度数据的原因。
所以,基本上,您拍摄低分辨率彩色图像并将其转换为色彩空间,例如 Lab
或 HSV
或任何包含 L
或 [=14 的色彩空间=] 组件。然后用您的(高 quality/high 分辨率)亮度数据替换该组件并转换回 RGB。这样您可以保留较低质量的颜色数据,但将其与较高质量的亮度数据结合起来。
来晚了,我明天可能会写代码,但它看起来大致是这样的:
from PIL import Image
# Load low quality colour image and convert to HSV
lowQualColour = Image.open('colour.png')
HSV = lowQualColour.convert('HSV')
# Split channels, discarding Luminance
H, S, _ = HSV.split()
# Load high quality luminance as single channel
hiQualLuminance = Image.open('luminance.png').convert('L')
# Merge with colour channels and revert to RGB
result = Image.merge('HSV', (H,S,hiQualLuminance)).convert('RGB')