
Часть 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))