Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МТ_ЛР5_Иванова_4117.docx
Скачиваний:
0
Добавлен:
29.04.2025
Размер:
2.48 Mб
Скачать

Часть 2. Изучение влияния изменения параметра n при адаптивной эквализации изображения.

В функции реализации адаптивной эквализации exposure.equalize_adapthist(image, kernel_size=(m, n), clip_limit=C) параметр n задаёт ширину локального окна kernel, в котором будет производиться выравнивание гистограммы яркости.

Для автоматического перебора разных параметров и обработки изображения через адаптивную эквализацию написан код, приведённый в Листинге 4.

Листинг 4 — Перебор параметра n для метода локальной эквализации

# Список значений n для адаптивной эквализации

N = [1, 2, 4, 8, 16, 64, 640, 1280]

for n in N:

plot_gray_scale(process_image(image, adaptive_contr, n), "адаптивная эквализация при n = {0}".format(n))

В результате получены изображения, представленные на Рисунках 6-13. При увеличении параметра n замечен масштаб изменений на изображениях — чем меньше n, тем меньше рассматриваемые окна пикселей и соответственно при выравнивании гистограммы получается более резкий перепад между яркостью пикселей. Чем больше n — тем более плавный переход получается, вплоть до глобальной эквализации при n = 1280 (ширина картинки).

При слишком малых размерах n возникают множественные артефакты, которые частично разрушают изображение. Например при n= 1 яркость пикселей меняется в не зависимости от соседей по горизонтали, что приводит к тому, что лапки лягушки сливаются с листом.

Эффект также хорошо заметен на гистограммах, где при меньших n характерны множественные скачки, и при увеличении n количество пикселей по яркости располагается все более равномерно .

Рисунок 6 — Результат при n = 1

Рисунок 7 — Результат при n = 2

Рисунок 8 — Результат при n = 4

Р исунок 9 — Результат при n = 8

Рисунок 10 — Результат при n = 16

Рисунок 11 — Результат при n = 64

Рисунок 12 — Результат при n = 640

Рисунок 13 — Результат при n = 1280

Выводы:

В результате выполнения лабораторной работы изучена методология управления контрастностью изображений с целью улучшения их визуального восприятия.

На языке Python реализованы такие типовые методы контрастинирования изображений как гамма-коррекция, линейное контрастинирование, глобальная и локальная эквализация.

Изучено влияние размерности окна адаптивной эквализации на обработку изображения. Выявлена закономерность в увеличении плавности распределения интенсивностей пикселей изображения при увеличении размеров окна.

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

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

https://pro.guap.ru/inside/student/tasks/9457fc8043c1e8c891a195a7acda4d3a/download

(Дата обращения 13.03.2025)

2. Документация библиотеки matplotlib, использование метода subplot. (Интернет-ресурс): //URL:

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot.html

(Дата обращения 13.03.2025)

Приложение а. Полный код.

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) # Возвращаем черно-белое изображение

# линейное контрастинирование

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)

# построение графиков

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 по умолчанию

# Список значений n для адаптивной эквализации

N = [1, 2, 4 ,8 , 16, 64, 640, 1280]

for n in N:

plot_gray_scale(process_image(image, adaptive_contr, n), "адаптивная эквализация при n = {0}".format(n))