Engee 文档
Notebook

从日光到夕阳:利用直方图匹配实现逼真图像转换

本示例说明了直方图匹配技术,该技术用于转换一幅图像的像素亮度分布,使其与参考图像的像素亮度分布相匹配。如果图像是多通道的,则在通道数匹配的前提下,对每个通道分别进行处理。

直方图匹配被广泛应用于计算机视觉和图像处理任务中。例如,在处理不同光照条件下或从不同设备(如相机或传感器)获取的数据时,它是不可或缺的。这种方法可以统一图像的外观,在物体识别、图像注册和特征匹配等任务中尤为重要。

直方图匹配的实际应用实例

1.医学图像预处理,在这种情况下,保持来自不同设备的数据的一致性非常重要。 处理一天中不同时间或不同角度拍摄的航空和卫星图像。 3.为机器学习准备数据,一致的图像统计有助于提高模型的质量。

这项技术有很多应用,现在让我们来看一个例子

任务是通过改变图像的色调和亮度,使天空呈现暖色调(粉色和橙色),灯光变得更加柔和,具有傍晚的特征,从而将白天的风景图片转换成逼真的夕阳风景。

基本变换

导入所有必要的库

In [ ]:
import Pkg;
Pkg.add("TestImages")
Pkg.add("Images")
Pkg.add("Plots")
Pkg.add("ImageShow")
Pkg.add("ImageContrastAdjustment");
In [ ]:
using TestImages, Images, Plots
using ImageShow # Библиотека отрисовки изображений
using ImageContrastAdjustment
In [ ]:
cd( @__DIR__ )

下载图像

In [ ]:
download("https://i.pinimg.com/736x/b1/bd/66/b1bd661ff2bbc212eb3f44b209c1facf.jpg", "sourse.jpg")
download("https://i.pinimg.com/736x/1a/0e/3b/1a0e3b0301e2275f81d2abdf904ec12b.jpg", "reference.jpg");

上传图像

In [ ]:
path1 = "$(@__DIR__)/sourse.jpg"
path2 = "$(@__DIR__)/reference.jpg"

sourse = load(path1)
reference = load(path2);

可视化图像

In [ ]:
simshow(sourse)
Out[0]:
No description has been provided for this image
In [ ]:
simshow(reference)
Out[0]:
No description has been provided for this image

带有参数Matching 的功能adjust_histogram 可以进行直方图匹配,从而将日落的阴影转移到明亮的日间图像中。因此,图像会变得更暗。

In [ ]:
matched_image = adjust_histogram(sourse, Matching(targetimg=reference))
Out[0]:
No description has been provided for this image

让我们添加粉色色调,使图像闪耀着夕阳的色彩

In [ ]:
hsv_img = map(RGB -> convert(HSV, RGB), matched_image)
evening_hsv = map(hsv -> begin
if hsv.s < 0.2 && hsv.v > 0.7  
    HSV(0.95, min(hsv.s + 0.3, 1.0), hsv.v * 0.9)  
else
    HSV(hsv.h + 0.05, hsv.s + 0.1, hsv.v * 0.7) 
end
end, hsv_img)
final_img = map(HSV -> convert(RGB, HSV), evening_hsv)
Out[0]:
No description has been provided for this image

为了显示直方图匹配的效果,我们绘制每个 RGB 通道的直方图。

In [ ]:
hist_final = [histogram(vec(c.(img)))
    for c in (red, green, blue)
    for img in [sourse, reference, final_img]
]

plot(
    hist_final...,
    layout = (3, 3),
    size = (800, 800),
    legend = false,
    title = ["Source" "Reference" "Histograms Matched"],
    reuse = false,
)
Out[0]:

来源:

亮度均匀分布,峰值位于中高强度区域(0.5-0.9),对应于明亮的一天。

参考文献:

亮度高度集中在下部(0.0-0.3),与日落天空的暗区和色调相对应。

组图匹配:

进行直方图匹配后的直方图。 图像亮度值经过转换,以接近参考直方图: 亮度降低(在 0.0-0.3 区域)。 日光特有的高亮度峰值消失。

结论

本示例展示了如何使用直方图匹配和改变 HSV 通道的强度将明亮的日光图像转换为日落色调