Engee 文档
Notebook

从日光到日落:使用直方图匹配的逼真图像变换

该示例说明了一种直方图匹配技术,该技术用于变换一个图像的像素亮度分布,使其与参考图像的分布相匹配。 如果图像是多通道的,则对每个通道单独执行该过程,前提是通道数量匹配。

直方图匹配广泛应用于计算机视觉和图像处理任务中。 例如,在处理在不同照明条件下或从不同设备如相机或传感器获得的数据时,它是必不可少的。 此方法允许您统一图像的外观,这在对象识别,图像配准和特征匹配等任务中尤为重要。

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

  1. 医学图像的预处理,其中重要的是保持从不同设备获得的数据的均匀性。
  2. 处理在一天中不同时间或从不同角度拍摄的航空照片和卫星图像。
  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

功能 adjust_histogram 与参数 Matching 执行直方图匹配,允许您将日落的阴影转移到明亮的白天图像。 结果,图像变得更暗。

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]:

来源(Source):

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

参考(Reference):

亮度强烈集中在下部(0.0–0.3),这对应于日落天空的变暗区域和色调。

直方图匹配(匹配直方图):

进行直方图匹配后的直方图。
图像的亮度值已经被转换为近似参考直方图。:
亮度下降(在0.0-0.3的范围内)。
日光特征的高亮度峰值消失。

结论

这个例子展示了如何通过比较直方图和改变HSV通道的强度来将明亮的白天图像转换成日落阴影。