Thanks to visit codestin.com
Credit goes to Github.com

Skip to content

polesye/wavelet-tool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DICOM Wavelet / JPEG 2000 Дослідницький Інструмент

Цей пакет надає невеликий дослідницький набір інструментів для вивчення стиснення на основі вейвлетів та 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 всіх пакетних вимірювань (для офлайн-аналізу)

Основна мета - дослідження, а не готове до виробництва стиснення. Код структурований так, щоб було легко налаштовувати пороги, квантування та ентропійне кодування незалежно.


1. Встановлення

Створіть та активуйте віртуальне середовище (рекомендується), а потім встановіть залежності:

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.


2. Швидкий старт: Streamlit GUI

З папки, що містить цей пакет:

streamlit run app_streamlit.py

У браузері:

  1. Виберіть кодек:
    • wavelet – чистий вейвлет-кодек для досліджень
    • jpeg2000 – DICOM JPEG 2000 round-trip
  2. Встановіть папку введення (PNG/JPEG/TIFF або DICOM в залежності від кодека).
  3. За бажанням, встановіть папку виведення для відтворених зображень та карт диференціації.
  4. Виберіть файл та натисніть "Запустити стиснення для цього файлу".

Ви побачите:

  • Оригінальне зображення
  • Відтворене зображення
  • Зображення абсолютної різниці (нормалізоване до [0,1])
  • Метрики:
    • MSE, PSNR, SSIM
    • Максимальна та середня абсолютна амплітудна різниця
    • Коефіцієнт стиснення, розріджені коефіцієнти, часи
  • Для кодека вейвлетів:
    • Статистика на рівні піддіапазону (для кожної смуги LL / LH / HL / HH)

Розширений режим (кодек вейвлетів)

У бічній панелі увімкніть "Розширені налаштування для кожного піддіапазону", щоб розблокувати:

  • Ентропійні кодувальники для кожного піддіапазону:
    • Вибір окремо для:
      • LL
      • LH/HL (деталі)
      • HH (високочастотні)
    • Вибір:
      • успадкований глобальний (за замовчуванням)
      • немає, zlib, bz2, lzma, huffman (тільки оцінка)
  • Коефіцієнти масштабування квантування для кожного піддіапазону:
    • quant_scale_LL
    • quant_scale_detail (LH/HL)
    • quant_scale_HH
    • Більший коефіцієнт ⇒ грубіше квантування (більший крок) для цього піддіапазону.

Ці параметри використовуються для:

  • Експериментів з одним зображенням.
  • Пакетних сканувань (див. нижче).

3. Пакетні сканування та графіки

Внизу програми Streamlit ви можете виконати пакетні сканування для папки введення.

3.1 Пакетне сканування вейвлетів

Увімкніть "пакетне сканування вейвлетів" у бічній панелі та налаштуйте:

  • Діапазон coeff_fraction (cf_min, cf_max, cf_steps)
  • Інші налаштування вейвлетів та (за бажанням) розширені параметри для кожного піддіапазону.

Потім натисніть "Запустити пакетне сканування вейвлетів для папки".

Для кожного зображення та кожного значення coeff_fraction програма:

  1. Застосує 2D або 1D×2 стиснення вейвлетів.
  2. Відтворить зображення.
  3. Обчислить:
    • PSNR, SSIM, амплітудні метрики
    • Глобальний коефіцієнт стиснення та часи
    • Коефіцієнт стиснення тільки для HH (всі піддіапазони HH в агрегованому вигляді)
  4. Зберігає один рядок на (зображення, coeff_fraction) у DataFrame.

GUI потім показує:

  • Середній PSNR та SSIM проти coeff_fraction (лінійний графік)
  • Глобальні торгівельні відносини:
    • коефіцієнт_стиснення проти PSNR
    • час_сек проти PSNR
  • Торгівельні відносини тільки для HH:
    • коефіцієнт_стиснення_HH проти PSNR
  • Повна таблиця всіх вимірювань.
  • Кнопка CSV завантаження:
    • wavelet_batch_metrics.csv

Ви можете обробити цей CSV у своїх власних блокнотах для глибшого аналізу.

3.2 Пакетне сканування JPEG 2000 (DICOM)

Коли codec = jpeg2000 та увімкнено пакетний режим:

  • Налаштуйте rate_min, rate_max, rate_steps.
  • Для кожного DICOM та кожної ставки:
    • Виконати кодування+декодування JPEG 2000.
    • Обчислити PSNR/SSIM та амплітудні метрики на нормалізованих піксельних даних.
    • Записати коефіцієнт стиснення (оригінальні байти проти закодованих байтів) та часи.

Знову ж таки, ви отримуєте:

  • Середній PSNR/SSIM проти ставки
  • Діаграми розсіювання торгівельних відносин
  • Повна таблиця метрик
  • CSV завантаження: jpeg2000_batch_metrics.csv

4. Використання бібліотеки (Python API)

Ви також можете імпортувати бібліотеку безпосередньо.

from wavelet_j2k_tool import (
    load_image,
    compute_metrics,
    wavelet_compress_2d,
    wavelet_compress_1d2,
    dicom_roundtrip_jpeg2000,
)

4.1 Кодек 2D вейвлетів

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"]  # список словників для кожного піддіапазону

Примітка: відтворення використовує проріджені коефіцієнти з плаваючою комою; квантування та ентропійне кодування в даний час використовуються лише для аналізу поведінки бітрейту/часу. Це відокремлює спотворення в області перетворення (прорідження) від спотворень кодування.

4.2 Кодек 1D×2 вейвлетів

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 використовує глобальний вектор коефіцієнтів та глобальне ентропійне кодування, без деталей для кожного піддіапазону.

4.3 Утиліти JPEG 2000 DICOM

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.


5. Інтерфейс командного рядка (CLI)

Бібліотека надає простий CLI для пакетної роботи.

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 zlib
  • INPUT_FOLDER: папка з PNG/JPEG/TIFF або, з --dicom, файлами DICOM.
  • OUTPUT_FOLDER: відтворені зображення, зображення різниці та metrics.csv.
  • Використовуйте --dicom, щоб обробити введення як файли .dcm (для вейвлетів на DICOM).
  • CLI використовує:
    • глобальний ентропійний кодувальник
    • стандартні фактори квантування (1.0 для всіх піддіапазонів)

CLI JPEG 2000

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, амплітудними метриками, коефіцієнтом стиснення тощо.

6. Дослідницькі нотатки та розширення

Деякі ідеї для подальших досліджень з використанням цього інструментарію:

  • Аналіз, специфічний для піддіапазону:

    • Використовуйте info["subbands"], щоб перевірити:
      • коефіцієнт стиснення для кожного піддіапазону
      • кількість ненульових значень до/після прорідження
      • час, витрачений на ентропійне кодування для кожної смуги
    • Порівняйте продуктивність zlib проти huffman проти bz2 на смугах тільки для HH.
  • PSNR проти бітрейту піддіапазону:

    • Програма Streamlit вже будує графік PSNR проти коефіцієнта стиснення тільки для HH.
    • Ви можете розширити це на LH/HL або LL, змінивши логіку агрегації.
  • Квантування для кожного піддіапазону:

    • Змініть залежність між quant_scale_* та кроком квантування.
    • Спробуйте прив'язати quant_scale_* до дисперсії або енергії піддіапазону.
  • Спотворення в області перетворення проти спотворення кодування:

    • В даний час PSNR вимірює лише ефекти перетворення + порогового значення (квантування використовується лише для ентропійного кодування).
    • Для вивчення повного спотворення (включаючи квантування) ви можете додати шлях, який:
      • де-квантує цілі підband
      • повторно виконує зворотний DWT з квантованими коефіцієнтами.

Код навмисно залишений простим і з великою кількістю коментарів, щоб ви могли розвивати його в більш складні експерименти (наприклад, альтернативні сімейства вейвлетів, кодувальники бітових площин, користувацькі матриці квантування тощо).


7. Вимоги

Дивіться requirements.txt для повного списку, але основний стек:

  • numpy
  • pillow
  • pywavelets
  • scikit-image
  • streamlit
  • pydicom (для DICOM)
  • glymur (додатковий JPEG 2000)
  • imagecodecs (додатковий JPEG 2000)
  • altair (додаткове відображення)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages