Документация 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), что соответствует затемнённым областям и тонам закатного неба.

Histograms Matched (Сопоставление гистограмм):

Гистограмма после выполнения гистограммного сопоставления. Значения яркости изображения преобразованы так, чтобы приблизиться к эталонной гистограмме: Яркость снизилась (в области 0.0–0.3). Исчезли пики в высокой яркости, характерные для дневного света.

Вывод

В данном примере показано, как с помощью сопоставление гистограмм и изменению интенсивности каналов HSV преобразовать светлое дневное изображение в оттенки заката