
5
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ
доц., к.т.н., доц. |
|
|
|
О. О. Жаринов |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Лабораторная работа №5
ИЗУЧЕНИЕ МЕТОДОВ УПРАВЛЕНИЯ КОНТРАСТНОСТЬЮ ИЗОБРАЖЕНИЙ
по курсу: Мультимедиа технологии
СТУДЕНТКА ГР. № |
Z0411 |
|
01.04.25 |
|
М. В. Карелина |
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2025
Цель работы. Изучить методологию управления контрастностью
изображений с целью улучшения их визуального восприятия. Реализоватьтиповые методы контрастирования изображений на языке Python. Вариант 7: exposure.equalize_adapthist(image, kernel_size=(m, n), clip_limit=C), параметр С.
Цифровая обработка изображений представляет собой важную область, в которой изображения рассматриваются как матричные структуры. Эти матрицы состоят из элементов, которые могут принимать различные значения в зависимости от типа изображения. Например, для черно-белых изображений каждый элемент матрицы указывает уровень яркости пикселя, который варьируется в диапазоне от 0 (черный) до 255 (белый). Цветные изображения, в свою очередь, требуют более сложной структуры, так как каждый пиксель кодируется тремя значениями, представляющими интенсивности основных цветов: красного, зеленого и синего, что приводит к созданию трех отдельных матриц.
Для эффективной работы с такими матрицами существуют разнообразные библиотеки в языке программирования Python, среди которых наиболее известными являются OpenCV, scikit-image и PIL/Pillow. Эти инструменты предлагают широкий набор функций для выполнения различных операций, таких как изменение яркости и контрастности, фильтрация, преобразования и сегментация. Обработка изображений часто включает предварительный анализ данных, позволяющий выявить статистические характеристики, такие как гистограммы, которые отображают распределение яркости в изображении.
Одной из наиболее распространенных задач в области обработки изображений является улучшение их визуального восприятия через коррекцию яркости и контрастности. Эти настройки обычно проводятся после анализа гистограммы, что позволяет понять, как распределены яркости и какое воздействие окажет изменение параметров на итоговое изображение.
Таким образом, цифровая обработка изображений служит мощным инструментом для модификации визуальных данных и позволяет достигать требуемых характеристик изображений, ориентируясь на конкретные задачи и цели. Программа, посредством которой осуществляется построение гистограммы яркости изображения, показана на листинге 1. Обработанное изображение и гистограмма представлены на рисунках 1-2.
Листинг 1. Программный код
import numpy as np import matplotlib.pyplot as plt from skimage import io, color # Загрузка изображения image_path = 'LR5.jpg' image = io.imread(image_path) # Считываем изображение # Преобразование изображения в оттенки серого gray_image = color.rgb2gray(image) # Отображение изображения в оттенках серого plt.imshow(gray_image, cmap='gray') # Задаем цветовую карту 'gray' plt.axis('off') # Отключаем оси, если нужно plt.show() # Рассчитываем данные гистограммы: histogram, bin_edges = np.histogram(gray_image, 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() |
Рисунок 1 – Изображение для построения гистограммы
Рисунок 2 – Гистограмма исходного изображения
Программа, в которой реализуется метод линейного контрастирования и метод гамма-коррекции показана на листинге 2.
Листинг 2. Программный код
import numpy as np import matplotlib.pyplot as plt from skimage import io, color, exposure from skimage.color import rgb2lab, lab2rgb image_path = 'LR5.jpg' image = io.imread(image_path) # считано изо LAB_image = rgb2lab(image) # в пр-во LAB L = LAB_image[:, :, 0]/100 # выделяем матрицу яркости plt.imshow(image) # отобразили изо plt.axis('off') plt.show() # применим метод .rescale_intensity: low, high = np.min(L) , np.max(L) bottom, top = 0, 1 L_out = exposure.rescale_intensity(L, in_range = (low, high), out_range= (bottom, top)).astype(np.float32) # ----------------------------------------------------- L_out_gam = exposure.adjust_gamma(L_out, gamma=1) # гамма-корр. LAB_image[:, :, 0] = L_out_gam*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('LR5.1.jpg',image_out, quality = 92) |
Обработанное изображение и его гистограмма представлены на рисунках 3 и 4, второе изображение и полученная гистограмма созданы, путем изменения метода эквализации гистограмм (рисунки 5 и 6) на L_out = exposure.equalize_hist(L, nbins=64), затем был использован метод exposure.equalize_adapthist(), путем модификации кода L_out=exposure.equalize_adapthist(L,kernel_size=(16,16),clip_lim it=0.01,nbins=256, результат представлен на рисунках 7 и 8.
Метод линейного контрастирования, как правило, дает хорошие результаты при обработке изображений. В то же время, использование метода эквализации гистограммы часто приводит к нежелательным эффектам: на однородных участках изображений могут проявляться артефакты и ложные контуры, особенно когда параметр nbins имеет относительно небольшие значения. Адаптивное выравнивание гистограммы, с одной стороны, оказывается весьма эффективным для выделения мелких деталей в слабоконтрастных изображениях, с другой стороны, его применение может негативно сказаться на естественности изображения: вокруг темных объектов могут появляться ореолы и "свечения", а также наблюдаются другие специфические изменения в самом изображении.
Рисунок 3 – Изображение для построения гистограммы
Рисунок 4 – Гистограмма оригинального изображения
Рисунок 5 – Изображение для построения гистограммы
Рисунок 6 – Гистограмма, полученная методом эквализации
Рисунок 4 – Изображение для построения гистограммы
Рисунок 8 – Гистограмма, полученная методом адаптивной эквализации
Дополнительно, на рисунках 9 и 10 приведен пример обработки изображения с помощью адаптивного метода эквализации, на рисунке 11 оказана гистограмма обработанного изображения.
Рисунок 9 – Оригинальное изображение
Рисунок 10 – Обработанное изображение
Рисунок 11 – Гистограмма, полученная методом адаптивной эквализации
Функция exposure.equalize_adapthist используется для адаптивной эквализации гистограммы изображения. Она улучшает контраст изображения, разделяя его на небольшие локальные области и применяя эквализацию к каждой из них.
Параметры функции:
- image: входное изображение, которое необходимо обработать.
- kernel_size=(m, n): размер блока (м) на (н), определяющий, насколько большую область будет охватывать эквализация.
- clip_limit=C: лимит по яркости, который используется для предотвращения чрезмерной контрастности в ярких областях.
В результате применения данной функции изображение становится более четким, особенно в слабоконтрастных участках, без значительных артефактов, возникающих при обычной эквализации гистограммы.
Программный код для поочередной проверки заданных значений (С = 0 – 0,2) выбранного изображения, представлен на листинге 3. Увеличение заданных значений приводит к ухудшению качества изображения и не представляется целесообразным. На рисунках 12 и 13 предтавлено оригинальное изображение и его гистограмма, на рисунках 14 и 15 лимит по яркости установлен 0,1, на рисунках 16 и 17 лимит–0,2.
Листинг 3. Программный код
import numpy as np import matplotlib.pyplot as plt from skimage import io, color, exposure from skimage.color import rgb2lab, lab2rgb # Загрузка изображения image_path = 'LR5.5.jpg' # Укажите путь к вашему изображению image = io.imread(image_path) # Считываем изображение # Преобразуем изображение в цветовое пространство LAB LAB_image = rgb2lab(image) # Преобразуем в пространство LAB L = LAB_image[:, :, 0] / 100 # Выделяем матрицу яркости # Отображаем исходное изображение plt.imshow(image) # Отобразили изображение plt.title('Исходное изображение') plt.axis('off') plt.show() # Пауза перед следующей фигуры plt.pause(1) # Пауза в 1 секунду # Рассчитываем и отображаем гистограмму оригинального изображения histogram_original, bin_edges_original = np.histogram(L, bins=256, range=(0, 1)) plt.figure(figsize=(6, 4)) plt.ticklabel_format(axis='y', style='sci', scilimits=(4, 4)) plt.grid(True) plt.title("Гистограмма яркости исходного изображения") plt.xlabel("Значение яркости") plt.ylabel("Количество пикселей") plt.bar(bin_edges_original[0:-1], histogram_original, width=1/128) plt.show() # Пауза перед следующей фигуры plt.pause(1) # Пауза в 1 секунду # Применяем адаптивную гистограммную эквализацию на матрице яркости kernel_size = (50, 50) # Размер ядра для адаптивной эквализации clip_limit = 0.01 # Порог для ограничения L_out = exposure.equalize_adapthist(L, kernel_size=kernel_size, clip_limit=clip_limit) # Обновляем матрицу яркости в LAB-изображении LAB_image[:, :, 0] = L_out * 100 # Возвращаем к диапазону [0, 100] image_out = lab2rgb(LAB_image) # Возвращаем цвет в изображение # Отображаем обработанное изображение plt.figure(figsize=(6, 4)) plt.imshow(image_out) # Отобразили изображение после обработки plt.title('Обработанное изображение') plt.axis('off') plt.show() # Пауза перед следующей фигуры plt.pause(1) # Пауза в 1 секунду # Рассчитываем и отображаем гистограмму обработанного изображения histogram_equalized, bin_edges_equalized = np.histogram(L_out, bins=256, range=(0, 1)) plt.figure(figsize=(6, 4)) plt.ticklabel_format(axis='y', style='sci', scilimits=(4, 4)) plt.grid(True) plt.title("Гистограмма яркости обработанного изображения") plt.xlabel("Значение яркости") plt.ylabel("Количество пикселей") plt.bar(bin_edges_equalized[0:-1], histogram_equalized, width=1/128) plt.show() # Сохраняем обработанное изображение в файл image_out = (255 * image_out).astype(np.uint8) # Преобразуем в формат uint8 io.imsave('LR5.6.jpg', image_out, quality=92) |
Рисунок 12 – Оригинальное изображение
Рисунок 13 – Гистограмма оригинального изображения
Рисунок
14 – Обработанное изображение
Рисунок 16 – Обработанное изображение
Рисунок
15 – Гистограмма оригинального изображени
Рисунок 17 – Гистограмма оригинального изображения
Вывод
Изучена методология управления контрастностью изображений с целью улучшения их визуального восприятия, реализованы типовые методы контрастирования изображений на языке Python - обработаны три тестовых
изображения с помощью методов линейного контрастирования, эквализации
гистограммы и адаптивной эквализации гистограммы. В качестве примера было обработано изображение с нормальной контрастностью, применение
адаптивного метода сделало фотографию города более фактурной. Влияние параметра С, exposure.equalize_adapthist(image, kernel_size=(m, n), clip_limit=C) было представлено на скриншотах при увеличении растет количество пикселей, но до определенного момента.
Ссылка на изображения: https://drive.google.com/drive/folders/1-T1Y_1foDcRzw5ROi7un1AuykKyI-kU1?usp=drive_link
Список используемых источников:
1. 10 инструментов Python для работы с изображениями URL: https://dzen.ru/a/XoS_XuNmhR6wjdJC
2. Основы цифровой обработки изображений: учеб. пособие / Жаринов О.О. СПб: ГУАП. 2023. – 122 с.
3. How to plot the histogram of an image in Python // URL: https://www.educative.io/answers/how-to-plot-the-histogram-of-an-image-in python
4. Creating Histograms // URL: https://bear-rsg.github.io/image processing/instructor/05-creating-histograms.html
5. Документация по skimage.exposure (на англ. яз.) // URL: https://scikit image.org/docs/stable/api/skimage.exposure.html (дата обращения 23.03.2025).
6. Жаринов О.О. Учебно-методические материалы к выполнению лабораторной работы №5 по дисциплине “Мультимедиа-технологии”, гр. Z0411, ГУАП, 2025. – 12 с.