Цей пакет надає невеликий дослідницький набір інструментів для вивчення стиснення на основі вейвлетів та JPEG 2000 для медичних зображень (включаючи DICOM).
Ви отримуєте:
- Python-бібліотеку (
wavelet_j2k_tool.py), яка містить:- 2D та 1D×2 вейвлет-перетворення з використанням PyWavelets
- Гнучке прорідження коефіцієнтів (через
coeff_fraction) - Квантування та ентропійне кодування по піддіапазонах (LL / LH / HL / HH)
- Утиліти для JPEG 2000 DICOM round-trip (через
glymurабоimagecodecs) - Пакетну обробку через CLI
- Streamlit GUI (
app_streamlit.py), яка містить:- Вибір папки (зображення або DICOM)
- Експерименти з одним зображенням (оригінал / відтворене / різниця)
- Пакетні сканування з PSNR/SSIM проти параметра
- Діаграми розсіювання для компресійно-якісно-часових торгівельних відносин
- Розширене налаштування ентропійних кодувальників та квантувальних факторів для кожного піддіапазону
- Експорт CSV всіх пакетних вимірювань (для офлайн-аналізу)
Основна мета - дослідження, а не готове до виробництва стиснення. Код структурований так, щоб було легко налаштовувати пороги, квантування та ентропійне кодування незалежно.
Створіть та активуйте віртуальне середовище (рекомендується), а потім встановіть залежності:
pip install -r requirements.txt- Підтримка DICOM:
pydicom - JPEG 2000 через glymur:
glymur(вимагає OpenJPEG) - JPEG 2000 через imagecodecs:
imagecodecs(скомпільована бібліотека) - Краще відображення в Streamlit:
altair
Якщо вам не потрібні DICOM/JPEG 2000, ви все ще можете використовувати частини вейвлетів лише з NumPy, Pillow, PyWavelets та scikit-image.
З папки, що містить цей пакет:
streamlit run app_streamlit.pyУ браузері:
- Виберіть кодек:
wavelet– чистий вейвлет-кодек для дослідженьjpeg2000– DICOM JPEG 2000 round-trip
- Встановіть папку введення (PNG/JPEG/TIFF або DICOM в залежності від кодека).
- За бажанням, встановіть папку виведення для відтворених зображень та карт диференціації.
- Виберіть файл та натисніть "Запустити стиснення для цього файлу".
Ви побачите:
- Оригінальне зображення
- Відтворене зображення
- Зображення абсолютної різниці (нормалізоване до [0,1])
- Метрики:
- MSE, PSNR, SSIM
- Максимальна та середня абсолютна амплітудна різниця
- Коефіцієнт стиснення, розріджені коефіцієнти, часи
- Для кодека вейвлетів:
- Статистика на рівні піддіапазону (для кожної смуги LL / LH / HL / HH)
У бічній панелі увімкніть "Розширені налаштування для кожного піддіапазону", щоб розблокувати:
- Ентропійні кодувальники для кожного піддіапазону:
- Вибір окремо для:
- LL
- LH/HL (деталі)
- HH (високочастотні)
- Вибір:
успадкований глобальний(за замовчуванням)немає,zlib,bz2,lzma,huffman(тільки оцінка)
- Вибір окремо для:
- Коефіцієнти масштабування квантування для кожного піддіапазону:
quant_scale_LLquant_scale_detail(LH/HL)quant_scale_HH- Більший коефіцієнт ⇒ грубіше квантування (більший крок) для цього піддіапазону.
Ці параметри використовуються для:
- Експериментів з одним зображенням.
- Пакетних сканувань (див. нижче).
Внизу програми Streamlit ви можете виконати пакетні сканування для папки введення.
Увімкніть "пакетне сканування вейвлетів" у бічній панелі та налаштуйте:
- Діапазон
coeff_fraction(cf_min,cf_max,cf_steps) - Інші налаштування вейвлетів та (за бажанням) розширені параметри для кожного піддіапазону.
Потім натисніть "Запустити пакетне сканування вейвлетів для папки".
Для кожного зображення та кожного значення coeff_fraction програма:
- Застосує 2D або 1D×2 стиснення вейвлетів.
- Відтворить зображення.
- Обчислить:
- PSNR, SSIM, амплітудні метрики
- Глобальний коефіцієнт стиснення та часи
- Коефіцієнт стиснення тільки для HH (всі піддіапазони HH в агрегованому вигляді)
- Зберігає один рядок на (зображення, coeff_fraction) у DataFrame.
GUI потім показує:
- Середній PSNR та SSIM проти coeff_fraction (лінійний графік)
- Глобальні торгівельні відносини:
- коефіцієнт_стиснення проти PSNR
- час_сек проти PSNR
- Торгівельні відносини тільки для HH:
- коефіцієнт_стиснення_HH проти PSNR
- Повна таблиця всіх вимірювань.
- Кнопка CSV завантаження:
wavelet_batch_metrics.csv
Ви можете обробити цей CSV у своїх власних блокнотах для глибшого аналізу.
Коли codec = jpeg2000 та увімкнено пакетний режим:
- Налаштуйте
rate_min,rate_max,rate_steps. - Для кожного DICOM та кожної ставки:
- Виконати кодування+декодування JPEG 2000.
- Обчислити PSNR/SSIM та амплітудні метрики на нормалізованих піксельних даних.
- Записати коефіцієнт стиснення (оригінальні байти проти закодованих байтів) та часи.
Знову ж таки, ви отримуєте:
- Середній PSNR/SSIM проти ставки
- Діаграми розсіювання торгівельних відносин
- Повна таблиця метрик
- CSV завантаження:
jpeg2000_batch_metrics.csv
Ви також можете імпортувати бібліотеку безпосередньо.
from wavelet_j2k_tool import (
load_image,
compute_metrics,
wavelet_compress_2d,
wavelet_compress_1d2,
dicom_roundtrip_jpeg2000,
)orig = load_image("example.png", as_dicom=False)
recon, info = wavelet_compress_2d(
orig,
wavelet="bior4.4",
levels=4,
coeff_fraction=0.05,
mode="symmetric",
threshold_type="hard",
entropy_algo="zlib", # глобальний за замовчуванням
# необов'язкові переопределення для кожного піддіапазону:
entropy_algo_LL="huffman", # тільки для LL
entropy_algo_detail="zlib", # LH/HL
entropy_algo_HH="bz2", # HH
# необов'язкові фактори квантування:
quant_scale_LL=1.0, # тонко для LL
quant_scale_detail=2.0, # грубіше
quant_scale_HH=4.0, # ще грубіше
)
mse, psnr, ssim, amp_max, amp_mean = compute_metrics(orig, recon)
subbands = info["subbands"] # список словників для кожного піддіапазонуПримітка: відтворення використовує проріджені коефіцієнти з плаваючою комою; квантування та ентропійне кодування в даний час використовуються лише для аналізу поведінки бітрейту/часу. Це відокремлює спотворення в області перетворення (прорідження) від спотворень кодування.
recon, info = wavelet_compress_1d2(
orig,
wavelet="bior4.4",
levels=3,
coeff_fraction=0.1,
mode="symmetric",
threshold_type="hard",
entropy_algo="zlib",
)Шлях 1D×2 використовує глобальний вектор коефіцієнтів та глобальне ентропійне кодування, без деталей для кожного піддіапазону.
import pydicom
from wavelet_j2k_tool import dicom_roundtrip_jpeg2000
ds = pydicom.dcmread("image.dcm")
recon_norm, encoded, ds_j2k, time_sec = dicom_roundtrip_jpeg2000(
ds,
reversible=False, # True для безвтратного, False для з втратами
rate=10.0, # параметр якості / ставки (семантика залежить від бекенду)
backend="glymur", # або "imagecodecs"
ts_uid="lossy", # або "lossless" при використанні зворотного режиму
)recon_norm - це нормалізоване відтворення в [0,1].
encoded - це бітовий потік JPEG 2000.
ds_j2k - це набір даних DICOM з оновленим ідентифікатором синтаксису передачі та PixelData.
Бібліотека надає простий CLI для пакетної роботи.
python wavelet_j2k_tool.py INPUT_FOLDER OUTPUT_FOLDER \
--codec wavelet \
--wavelet bior4.4 \
--levels 3 \
--coeff_fraction 0.1 \
--mode symmetric \
--threshold_type hard \
--dwt_mode 2d \
--entropy_algo zlibINPUT_FOLDER: папка з PNG/JPEG/TIFF або, з--dicom, файлами DICOM.OUTPUT_FOLDER: відтворені зображення, зображення різниці таmetrics.csv.- Використовуйте
--dicom, щоб обробити введення як файли.dcm(для вейвлетів на DICOM). - CLI використовує:
- глобальний ентропійний кодувальник
- стандартні фактори квантування (1.0 для всіх піддіапазонів)
python wavelet_j2k_tool.py INPUT_FOLDER OUTPUT_FOLDER \
--codec jpeg2000 \
--jpeg_backend glymur \
--jpeg_reversible # необов'язково, для безвтратного
--jpeg_rate 10 # необов'язково параметр якості / ставки- Введення повинно бути файлами DICOM (
.dcm). - Папка виведення міститиме:
- відтворені PNG
- PNG різниці
- стиснуті DICOM у папці
compressed_dicom/ metrics.csvз PSNR/SSIM, амплітудними метриками, коефіцієнтом стиснення тощо.
Деякі ідеї для подальших досліджень з використанням цього інструментарію:
-
Аналіз, специфічний для піддіапазону:
- Використовуйте
info["subbands"], щоб перевірити:- коефіцієнт стиснення для кожного піддіапазону
- кількість ненульових значень до/після прорідження
- час, витрачений на ентропійне кодування для кожної смуги
- Порівняйте продуктивність
zlibпротиhuffmanпротиbz2на смугах тільки для HH.
- Використовуйте
-
PSNR проти бітрейту піддіапазону:
- Програма Streamlit вже будує графік PSNR проти коефіцієнта стиснення тільки для HH.
- Ви можете розширити це на LH/HL або LL, змінивши логіку агрегації.
-
Квантування для кожного піддіапазону:
- Змініть залежність між
quant_scale_*та кроком квантування. - Спробуйте прив'язати
quant_scale_*до дисперсії або енергії піддіапазону.
- Змініть залежність між
-
Спотворення в області перетворення проти спотворення кодування:
- В даний час PSNR вимірює лише ефекти перетворення + порогового значення (квантування використовується лише для ентропійного кодування).
- Для вивчення повного спотворення (включаючи квантування) ви можете додати шлях, який:
- де-квантує цілі підband
- повторно виконує зворотний DWT з квантованими коефіцієнтами.
Код навмисно залишений простим і з великою кількістю коментарів, щоб ви могли розвивати його в більш складні експерименти (наприклад, альтернативні сімейства вейвлетів, кодувальники бітових площин, користувацькі матриці квантування тощо).
Дивіться requirements.txt для повного списку, але основний стек:
- numpy
- pillow
- pywavelets
- scikit-image
- streamlit
- pydicom (для DICOM)
- glymur (додатковий JPEG 2000)
- imagecodecs (додатковий JPEG 2000)
- altair (додаткове відображення)