Расчет гистограммы
Гистограмма изображения — это графическое представление распределения интенсивностей пикселей в изображении. Она показывает, сколько пикселей изображения имеют определенное значение интенсивности (цвета или яркости).
Зачем рассчитывать гистограмму?
Гистограмма позволяет анализировать освещенность, регулировать контрастность, яркость изображения, выделять объекты, балансировать цвета и улучшать качество визуализации.
Гистограмма позволяет оценить, насколько яркое или темное изображение:
Если пиксели "скучены" слева (низкие интенсивности), изображение слишком темное.
Если пиксели "скучены" справа (высокие интенсивности), изображение пересвечено.
Подключаем необходимые пакеты для работы с изображениями
import Pkg
Pkg.add("Images")
Pkg.add("StatsBase")
Pkg.add("Plots")
using Images, StatsBase, Plots
Загрузка изображения
path_to_img_1 = "$(@__DIR__)/Cozy_Autumn_Beverage_Moment.jpeg";
Image_1 = load(path_to_img_1)
Обработка данных
channelview
преобразует изображение в массив, где каждый цветовой канал (красный, зеленый, синий) становится отдельным слоем.
rgb_planes = channelview(Image_1);
Далее разбиваем цветовые каналы в отдельные переменные
blue_channel = rgb_planes[3, :, :]
green_channel = rgb_planes[2, :, :]
red_channel = rgb_planes[1, :, :];
Визуализируем отдельный канал
red_image = colorview(RGB, red_channel, zeros(size(red_channel)), zeros(size(red_channel)))
Расчет гистограмм
red_channel
В ячейке выше мы видим массив значений интенсивностей красного канала изображения для каждого пикселя
Сначала разбиваем интенсивности на диапазоны. Например, для нормализованных данных
[0, 1], которые у нас и представлены
можно использовать 256 равных интервалов. Затем подсчитываем, сколько пикселей попадает в каждый диапазон.
Установите количество ячеек - 256
histSize = 256;
Установите диапазон значений (от 0 до 1)
hist_range = 0:1/(histSize-1):1;
Приступим к расчету гистограмм. StatsBase.Histogram
позволяет рассчитать гистограммы
b_hist = fit(Histogram, blue_channel[:], hist_range)
r_hist = fit(Histogram, red_channel[:], hist_range)
g_hist = fit(Histogram, green_channel[:], hist_range);
Визуализация
Визуализируем рассчитанные гистограммы для наглядной оценки распределения интенсивностей
plot(r_hist.edges[1][1:end-1], r_hist.weights, color=:red, label="Red Channel")
plot!(b_hist.edges[1][1:end-1], b_hist.weights, color=:blue, label="blue Channel")
plot!(g_hist.edges[1][1:end-1], g_hist.weights, color=:green, label="green Channel")
Как видно из графика выше, большая часть пикселей по уровню интенсивности находятся в левой части графика, что говорит о затемненности изображения
Вывод
В данном примере были рассчитаны гистограммы интенсивностей пикселей для оценки яркости изображения