Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Мультимедиа5

.docx
Скачиваний:
0
Добавлен:
20.06.2025
Размер:
3.7 Mб
Скачать

ГУАП

КАФЕДРА № 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.

Список использованных источников

  1. Жаринов О.О. Учебно-методические материалы к выполнению лабораторной работы №5 по дисциплине “Мультимедиа-технологии “. гр.4116,4117, 4118, Z0411. ГУАП, 2025. – 19 с. (Интернет-ресурс) URL: https://pro.guap.ru/inside/student/tasks/9457fc8043c1e8c891a195a7acda4d3a/download

  2. 10 инструментов Python для работы с изображениями URL: https://dzen.ru/a/XoS_XuNmhR6wjdJC

  3. Основы цифровой обработки изображений: учеб. пособие/ Жаринов О.О. СПб: ГУАП. 2023. – 122 с.

  4. Цветовые пространства: большой разбор, URL: https://skillbox.ru/media/design/rgb-cmyk-lab/

Соседние файлы в предмете Мультимедиа технологии