
Мультимедиа5
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., к.т.н., доц. |
|
|
|
О.О. Жаринов |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №5 |
Изучение методов управления контрастностью изображений |
по курсу: МУЛЬТИМЕДИА ТЕХНОЛОГИИ |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ гр. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2025
Цель работы: изучить методологию управления контрастностью изображений с целью улучшения их визуального восприятия. Реализовать типовые методы контрастирования изображений на языке Python
Краткие теоретические сведения
Цифровые изображения принято представлять в виде матриц (двумерных прямоугольных массивов целых чисел) с неотрицательными элементами (для полутоновых, палитровых и полноцветных изображений значения элементов заключены в диапазоне [0, 255]).
Каждый элемент матрицы отвечает одному элементу изображения - пикселю. При рассмотрении методов обработки полутоновых изображений изображение представляется матрицей чисел M×N, где значение каждого элемента отвечает определенному уровню квантования его энергетической характеристики (яркости). Каждый пиксель цветного изображения кодируется уже тремя целыми числами, представляющими собой значения интенсивностей трех основных цветов – красного, зеленого и синего. Таким образом, цветное изображение представляется тремя матрицами (точнее, одним объектом с размерностью 3×M×N). Для обработки изображений в составе Python имеется ряд библиотек, из которых наиболее популярными являются OpenCV (cv2), scikit-image (skimage), PIL/Pillow, Mahotas [1]. Всегда актуальной задачей обработки изображений является изменение яркости и контрастности [2]. Управление яркостью и контрастностью обычно производится после анализа статистических характеристик обрабатываемого изображения. Для проведения такого анализа в библиотечных модулях Python имеются специализированные методы и функции. Одной из основных статистических характеристик черно-белого (синонимы: полутонового, монохромного) изображения является гистограмма распределения яркостей элементов изображения, которую можно вычислять как для всего изображения целиком, так и локально. Для построения общей гистограммы полутонового изображения используется, 256 уровней яркости (интенсивности) изображения (ширина интервалов гистограммы равна 1), а высота каждого столбца – это количество пикселей изображения соответствующей яркости (интенсивности).
Индивидуальный вариант
Рисунок 1- Индивидуальный вариант задания
Ход работы
Для выполнения работы выбрано изображение пальм на фоне звездного неба (Рисунок 1). Затем была построена гистограмма яркости данного изображения (Рисунок 2)
Рисунок 1- Исходное изображение
Рисунок 2- Гистограмма яркости исходного изображения
Гистограмма смещена влево, что говорит о преобладание темных тонов.
Далее изображение загружается и преобразуется из RGB в LAB с помощью функции rgb2lab из библиотеки skimage. RGB – это цветовое пространство, здесь каждый цвет задаётся в виде трёх координат. Значения цвета в LAB задаются через светлоту (Lightness) и две координаты, отвечающие за хроматическую составляющую: тон и насыщенность [4].
Затем применяется метод rescale_intensity для изменения контраста изображения. Значения яркости в диапазоне (low, high) преобразуются в значения яркости в диапазоне (bottom, top). После применения rescale_intensity получается новый массив L_out, где значения яркости находятся в диапазоне от 0,15 до 0,85 (Рисунок 3-4).
Листинг 1 - Реализация метода rescale_intensity, построение гистограммы яркости и вывод обработанного изображения
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color, exposure
from skimage.color import rgb2lab, lab2rgb
image_path = 'C:/s.jpg'
image = io.imread(image_path) # считано изо
LAB_image = rgb2lab(image) # в пр-во LAB
L = LAB_image[:, :, 0]/100 # выделяем матрицу яркости
plt.imshow(image)
plt.axis('off')
# метод .rescale_intensity:
low, high = np.min(L) , np.max(L)
bottom, top = 0.15, 0.85
L_out = exposure.rescale_intensity(L,
in_range = (low, high),
out_range= (bottom, top)).astype(np.float32)
LAB_image[:, :, 0] = L_out*100 # заменили матрицу яркости
image_out = lab2rgb(LAB_image) # вернули цвет в изображение
plt.imshow(image_out) # отобразили изо после обработки
plt.axis('off')
# рассчитали данные гистограммы
histogram, bin_edges = np.histogram(L_out,
bins=256, range=(0, 1))
# выводим график гистограммы
fig, ax = plt.subplots(figsize=(5, 4))
plt.ticklabel_format(axis='y', style='sci', scilimits=(4,4))
ax.set_xlim(0, 1)
ax.grid(True)
ax.set_title("Grayscale Histogram")
ax.set_xlabel("grayscale value")
ax.set_ylabel("pixel count")
ax.bar(bin_edges[0:-1], histogram, width = 1/128)
plt.show()
# сохраним обработанное изображение в файл
image_out = (255*image_out).astype(np.uint8)
io.imsave('output_s.jpg',image_out, quality = 92)
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.axis('off')
plt.title("Исходное изображение")
plt.subplot(1, 2, 2) =
plt.imshow(image_out)
plt.axis('off')
plt.title("Обработанное изображение")
plt.tight_layout()
plt.show(
Рисунок 3- Исходное и обработонное изображения после применения метода rescale_intensity
Изображение стало более тусклым, пальмы стали отчетливее видны.
Рисунок 4- Гистограмма яркости выходного изображения
Для более наглядной работы метода, были определены значения яркости в диапазоне от 1 до 0 (Рисунок 5).
Рисунок 5- Исходное и выходное изображения
Видно, что изменения параметров приводит к инверсии, цвета и яркость выглядят противоположно исходному изображению.
Далее к исходному изображению применен метод adjust_gamma ( гамма-коррекции изображения) Задан параметр gamma < 1, чтобы изображение стало светлее (увеличилась яркость) (Рисунок 6-7).
Листинг 2 – Применение метода adjust_gamma, построение гистограммы яркости и вывод обработанного изображения
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color, exposure
from skimage.color import rgb2lab, lab2rgb
image_path = 'C:/sss.jpg'
image = io.imread(image_path)
LAB_image = rgb2lab(image) # в пр-во LAB
L = LAB_image[:, :, 0] / 100 # выделяем матрицу яркости
plt.imshow(image) # отобразили изо
plt.axis("off")
L_out = exposure.adjust_gamma(L, gamma=0.4)
LAB_image[:, :, 0] = L_out * 100 # заменили матрицу яркости
image_out = lab2rgb(LAB_image) # вернули цвет в изображение
plt.imshow(image_out) # отобразили изо после обработки
plt.axis("off")
plt.show()
histogram, bin_edges = np.histogram(L_out,
bins=256, range=(0, 1))
fig, ax = plt.subplots(figsize=(5, 4))
plt.ticklabel_format(axis='y', style='sci', scilimits=(4,4))
ax.set_xlim(0, 1)
ax.grid(True)
ax.set_title("Grayscale Histogram")
ax.set_xlabel("grayscale value")
ax.set_ylabel("pixel count")
ax.bar(bin_edges[0:-1], histogram, width = 1/128)
plt.show()
image_out = (255*image_out).astype(np.uint8)
io.imsave('output_pa2.jpg',image_out, quality = 92)
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.axis('off')
plt.title("Исходное изображение")
plt.subplot(1, 2, 2)
plt.imshow(image_out)
plt.axis('off')
plt.title("Обработанное изображение")
plt.tight_layout()
plt.show()
Рисунок 6- Исходное и обработанное изображения после применения метода adjust_gamma
Рисунок 7- Гистограмма яркости выходного изображения
После применения гамма-коррекции гистограмма немного растянулась вправо и стала равномернее, что гооврит о то, что изображение стало светлее. По выходному изображению видно, что темные участки изображения осветлились, что улучшило видимость деталей. Можно сказать, что гамма-коррекция значительно улучшила изображение.
Затем применялся метод equalize_hist, который выполняет операцию эквализации гистограммы, которая направлена на увеличение контрастности изображения путем выравнивания распределения интенсивностей пикселей. Параметр bins задан 64, значит гистограмма будет разделена на 64 интервала (Рисунок 8-9).
Листинг 3 - Применение метода equalize_hist
L_out = exposure.equalize_hist(L, nbins=64)
Рисунок 8- Исходное тзображение и изображение после применения метода equalize_hist
Рисунок 9- Гистограмма яркости выходного изображения
По гистограмме видно, что она еще больше расстянулась вправо, значит изображение стало еще более светлее по сравнению с предыдущим методом. По выходному изображение видно, что оно действительно стало намного светлее, почти не видно звезд, небо уже не кажется ночным.
Следующий метод equalize_adapthist выполняет адаптивное выравнивание гистограммы с ограничением контраста. Этот метод улучшает контраст изображения, работая с локальными областями изображения, что неестественного усиления контраста. Заданы параметры clip_limit равный 0,1, kernel_size=(8, 8), nbins=128. Параметр clip_limit определяет границу усиления контраста. Чем больше установлено его значение, тем сильнее будет увеличен контраст в каждой локальной области (Рисунок 10-12)
Листинг 4 - Применение метода equalize_adapthist
L_out = exposure.equalize_adapthist(L, kernel_size=(8, 8), clip_limit=0.1, nbins=128)
Рисунок 10 – Входное и выходное изображения после применения метода equalize_adapthist
Рисунок 11- Гистограмма яркости выходного изображения
По выходному изображению видно, что увеличилась резкость, стало видно больше деталей.
Затем по индивидуальному варианту применен метод rescale_intensity, и исследовано влияние метода на изображение взависимости от изменения параметра low. Параметр low определяет нижнюю границу исходного диапазона, начения яркости между low и high будут масштабированы в диапазон от bottom до top (Рисунок 12-15).
Листинг 5 - Применение метода rescale_intensity с разными занчениями параметра low
# Параметры для изменения
low_values = [0, 0.1, 0.3, 0.7] # различные значения параметра low
high = np.max(L)
bottom, top = 0.2, 0.8
# обработка изображения с разными значениями low
for i, low in enumerate(low_values):
L_out = exposure.rescale_intensity(L, in_range=(low, high), out_range=(bottom, top)).astype(np.float32)
LAB_image[:, :, 0] = L_out * 100
image_out = lab2rgb(LAB_image)
# отдельное окно для каждой пары
fig, axes = plt.subplots(1, 2, figsize=(14, 6), gridspec_kw={'width_ratios': [2, 1]})
fig.tight_layout(pad=3.0)
# Изображение
axes[0].imshow(image_out)
axes[0].axis('off')
axes[0].set_title(f"Изображение (low = {low})")
# Гистограмма
histogram, bin_edges = np.histogram(L_out, bins=256, range=(0, 1))
axes[1].bar(bin_edges[:-1], histogram, width=0.01, color='indigo')
axes[1].set_title(f"Гистограмма (low = {low})")
axes[1].set_xlabel("Яркость")
axes[1].set_ylabel("Количество пикселей")
axes[1].set_xlim(0, 1)
axes[1].grid(True)
plt.show()
Рисунок 12- Выходное изображение и гистограмма при значении параметра low равным 0
Рисунок 13- Выходное изображение и гистограмма при значении параметра low равным 0.1
Рисунок 14- Выходное изображение и гистограмма при значении параметра low равным 0.3
Рисунок 15- Выходное изображение и гистограмма при значении параметра low равным 0.7
По рисункам 12- 15 можно сказат ь, что при увеличении параметра low, темные участки становятся еще темнее и увеличивается контраст.
Вывод
В ходе выполнения лабораторной работы были изучены и реализованы различные методы управления контрастностью изображений с использованием библиотеки skimage в Python. Исходное изображение с недостаточной видимостью деталей в тенях, имело гистограмму яркости, смещенную влево, что указывало на преобладание темных тонов. Методы управления контрастностью, такие как rescale_intensity, adjust_gamma, equalize_hist и equalize_adapthist позволили по своему эффективно улучшать видимость деталей и изменять контрастность изображения.
По выполненной работе можно сказать, что метод гамма-коррекции эффективен для осветления темных участков без потери деталей с параметром gamma < 1.
Список использованных источников
Жаринов О.О. Учебно-методические материалы к выполнению лабораторной работы №5 по дисциплине “Мультимедиа-технологии “. гр.4116,4117, 4118, Z0411. ГУАП, 2025. – 19 с. (Интернет-ресурс) URL: https://pro.guap.ru/inside/student/tasks/9457fc8043c1e8c891a195a7acda4d3a/download
10 инструментов Python для работы с изображениями URL: https://dzen.ru/a/XoS_XuNmhR6wjdJC
Основы цифровой обработки изображений: учеб. пособие/ Жаринов О.О. СПб: ГУАП. 2023. – 122 с.
Цветовые пространства: большой разбор, URL: https://skillbox.ru/media/design/rgb-cmyk-lab/