
ГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., к.т.н., доц. |
|
|
|
О.О. Жаринов |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЁТ О ЛАБОРАТОРНОЙ РАБОТЕ №5 |
ИЗУЧЕНИЕ МЕТОДОВ УПРАВЛЕНИЯ КОНТРАСТНОСТЬЮ ИЗОБРАЖЕНИЙ |
по курсу: МУЛЬТИМЕДИА-ТЕХНОЛОГИИ |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4117 |
|
|
|
А.В. Иванова |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2025
Цель работы:
Изучить методологию управления контрастностью изображений с целью улучшения их визуального восприятия. Реализовать типовые методы контрастинирования изображений на языке Python.
Вариант 8:
Рисунок 1 — Варианты заданий
Краткие теоретические сведения:
Цифровые изображения принято представлять в виде матриц
с неотрицательными элементами. Каждый элемент матрицы отвечает одному элементу изображения - пикселю.
При рассмотрении методов обработки полутоновых изображений (значения элементов в диапазоне [0; 255]) изображение представляется матрицей чисел M×N, где значение каждого элемента отвечает определённому уровню квантования его яркости. Каждый пиксель цветного изображения кодируется тремя целыми числами, представляющими собой значения интенсивностей трёх основных цветов – красного, зелёного и синего. Таким образом, цветное изображение представляется трёхмерной матрицей M×N.
Одной из основных статистических характеристик полутонового изображения является гистограмма распределения яркостей элементов изображения, которую можно вычислять как для всего изображения целиком, так и локально.
Для построения общей гистограммы полутонового изображения используется, как правило, 256 уровней яркости (интенсивности) изображения (ширина интервалов гистограммы равна 1), а высота каждого столбца – это количество пикселей изображения соответствующей яркости.
Обработка монохромных изображений проще, так как не требуется выделять матрицу яркости. Однако использование методов для цветных изображений с черно-белыми может привести к ошибкам из-за несоответствия размерностей. Поэтому при разработке универсальной программы необходимо проверять размерности и использовать только подходящие функции.
В библиотеке skimage (scikit-image) Python для улучшения визуального восприятия изображения можно использовать следующие методы обработки изображений :
exposure.rescale_intensity() — увеличивает контраст, растягивая диапазон интенсивностей и выполняя гамма-коррекцию;
exposure.adjust_gamma() — выполняет гамма-коррекцию, позволяя динамически затемнять или осветлять изображение;
exposure.equalize_hist() — эквализация гистограммы, увеличивающая контрастность путем преобразования гистограммы распределения интенсивностей, но может давать плохие результаты на слабоконтрастных изображениях;
exposure.equalize_adapthist() — контрастно-ограниченное адаптивное выравнивание гистограммы, основанное на анализе локальных окрестностей, с множеством настраиваемых параметров.
Каждый из этих методов имеет свои особенности применения, поэтому и свойства получаемых при их использовании изображений могут быть существенно различны.
Выполнение работы:
Часть 1. Рассмотрение методов преобразования изображения.
В соответствии с методическими указаниями реализованы четыре метода обработки изображений.
В начале произведено считывание изображения и написана функция его общей обработки (Листинг 1). Общая обработка заключается в определении формата изображения (цветное или черно-белое), нормализации, обработке выбранным методом, гамма-коррекции. Если изображения цветное, то после его преобразования в цветовое пространство Lab выделяется матрица яркости. Если нет — применяется только нормализация.
Далее изображение обрабатывается выбранным методом (функция которого передаётся как параметр) и подвергается обратному преобразованию (цветному изображению возвращается цвет, выполняется гамма-коррекция).
Листинг 1 — Программный код общей функции обработки изображения.
import numpy as np # для работы с данными
import matplotlib.pyplot as plt # для графиков
from skimage import io, color, exposure # для обработки изо
from skimage.color import rgb2lab, lab2rgb # для преобразования цветовых пространст
image_path = 'img/toad.jpg' # путь к изображению
image = io.imread(image_path) # считывание изображения
def process_image(img, method, n=None, gamma = 3):
# Проверка размерности изображения
if img.ndim == 3 and img.shape[2] == 3: # Цветное изображение
LAB_image = rgb2lab(img) # в пр-во LAB
L = LAB_image[:, :, 0] / 100 # выделяем матрицу яркости
elif img.ndim == 2: # Черно-белое изображение
L = img / 255.0 # нормализация пикселей
L_out = method(L, n) if n is not None else method(L) # обработка по переданному методу
if img.ndim == 3: # Если цветное изображение
LAB_image[:, :, 0] = exposure.adjust_gamma(L_out, gamma=gamma) * 100 # гамма-корр.
return lab2rgb(LAB_image) # возвращаем цвет в изображение
else: # Если черно-белое изображение
return (L_out * 255).astype(np.uint8) # Возвращаем черно-белое изображение
В Листинге 2 содержится функции реализации линейного контрастирования, эквализации гистограммы, адаптивной (локальной) эквализации гистограммы. В случае последней, передаётся параметр ширины локального окна, в котором будет проводиться эквализация.
Листинг 2 — Реализация методов обработки изображения.
# линейное контрастинирование
def linear_contr(L):
return exposure.rescale_intensity(L, in_range=(np.min(L), np.max(L)), out_range=(0, 1))
# эквализация
def equalize_contr(L):
return exposure.equalize_hist(L, nbins=64)
# адаптивная эквализация
def adaptive_contr(L, n=16):
return exposure.equalize_adapthist(L, kernel_size=(16, n), clip_limit=0.01, nbins=256)
Далее написана функция отображения передаваемого изображения и его гистограммы яркости (Листинг 3). Для удобства изображения размещены на одном холсте [2]. В конце приведён вызов разных методов обработки исходного изображения для построения результатов.
Листинг 3 — Функция построения гистограммы яркости.
# построение графиков
def plot_gray_scale(img, title):
# отображение полученного изображения
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
ax1.imshow(img)
ax1.axis('off')
ax1.set_title(title)
gray_image = color.rgb2gray(img)
# построение гистрограммы
histogram, bin_edges = np.histogram(gray_image, bins=256, range=(0, 1))
ax2.bar(bin_edges[:-1], histogram, width=1 / 128)
ax2.set_xlim(0, 1)
ax2.ticklabel_format(axis='y', style='sci', scilimits=(4, 4))
ax2.grid(True)
ax2.set_title("Гистрограмма яркости")
ax2.set_xlabel("Интенсивность")
ax2.set_ylabel("Кол-во пикселей")
plt.tight_layout()
plt.show()
# Обработка и отображение изображений
plot_gray_scale(image, "исходное изображение")
plot_gray_scale(process_image(image, linear_contr), "линейное контрастирование")
plot_gray_scale(process_image(image, equalize_contr), "эквализация")
plot_gray_scale(process_image(image, adaptive_contr, 16), "адаптивная эквализация") # n по умолчанию
В результате выполнения программы получены отображения исходного изображения (полный код в Приложении А); изображения с примененным линейным контрастинированием, глобальной эквализации гистограммы, адаптивной эквализации гистограммы. В случае обработки исходного изображения одним из приведённых методов также выполнялась гамма коррекция, с параметром gamma = 2, для затемнения исходного изображения и более наглядного действия обрабатывающих методов.
Исходное изображение с гистограммой отображено на Рисунке 2. Полученные в ходе обработки изображения представлены на Рисунках 3-5.
При линейной контрастинации растягивается диапазон яркости пикселей, в результате чего улучшается контрастность, но не меняется распределение интенсивностей (Рисунок 3). Если исходное изображение светлое, то после линейной контрастинации оно в целом становиться немного темнее, и наоборот, за счёт растягивания диапазона. На примере этого не видно, так как применена гамма-коррекция.
При глобальной эквализации интенсивность пикселей перераспределяется равномерно по диапазону всего изображения. В результате получается гораздо более плавная гистограмма яркости (Рисунок 4). Так как исходное изображение содержит много тёмных пикселей в результате эквализации изображение стало заметно светлее. Особенно хорошо видно изменение интенсивности на участке с камнем (левый верхний угол), который сильно осветляется.
При адаптивной эквализации интенсивность пикселей распределяется в зависимости от диапазона яркости в рассматриваемом окне. При размере окна 16 на 16 пикселей и размере изображения 960 на 1280 пикселей получается довольно плавный переход и выраженное различие яркости по областям. Например в отличие от глобального выравнивания, при локальном заметно, что степень осветления у листа и лягушки разная. Контрастность повышается, изображение становиться чётче.
Рисунок 2 — Исходное изображение и его гистограмма яркости
Рисунок 3 — Линейное контрастирование изображения (гамма-коррекция 2)
Рисунок 4 — Глобальная эквализация гистограммы (гамма-коррекция 2)
Рисунок 5 — Локальная эквализация гистограммы (гамма-коррекция 2.