HuggingKatze's picture
add gif via LFS and update README/app
1fa8091
|
Raw
History Blame Contribute Delete
4.07 kB
metadata
title: Image Quantization and CT Windowing Explorer
emoji: 🩻
colorFrom: blue
colorTo: gray
sdk: docker
app_port: 8501
pinned: false

Image Quantization and CT Windowing Explorer

An interactive Streamlit app for exploring how quantization and CT-style windowing change grayscale medical image display.

Screenshots / GIF

Main app overview

Main app overview

Project Summary

This app compares two related but different operations on grayscale medical images:

  1. Quantization reduces the number of stored gray levels and can introduce banding or reconstruction error.
  2. Windowing changes only how a chosen intensity range is displayed and clips values outside that range.

The interface lets users adjust bit depth and window bounds, then compare four image states, a histogram, an error map, and summary metrics side by side.

Local Run

cd medical-quantization-windowing-explorer
make setup
source .venv/bin/activate
make run

Or run without activating:

uv run streamlit run app.py

Hugging Face Space URL

For the most stable viewing experience, use the direct app URL: https://huggingkatze-ct-windowing-quantization-demo.hf.space

The Hugging Face project page is: https://huggingface.co/spaces/HuggingKatze/ct-windowing-quantization-demo

Repository Structure

app.py
processing.py
metrics.py
utils.py
sample_images/
sample_images/builtin_samples/
docs/
requirements.txt
Makefile
Dockerfile

Features

  • Built-in CT-oriented examples from CT-RATE, LDCT-and-Projection-data, and RSNA PE
  • Upload support for PNG, JPG, JPEG, and single-slice DICOM
  • Automatic handling of grayscale images, including 3-channel grayscale copies
  • Adjustable quantization bit depth and CT-style window bounds
  • Slice selection for volumetric built-in samples
  • Rotation control for uploaded DICOM slices
  • Four synchronized views: original, windowed, quantized, and quantized + windowed
  • Histogram, squared-error map, and summary metrics (MSE, PSNR, gray levels, entropy)
  • Clickable comparison arrows synchronized with the metrics selector
  • In-app explanatory notes for each main control

Known Limitations

  • The app is educational and not intended for clinical interpretation.
  • Uploaded PNG/JPG images may already be restricted to 8-bit precision.
  • The current version works on one 2D slice at a time.
  • Uploaded files are limited to PNG/JPG and single-slice DICOM in the current app; NIfTI upload is not enabled in the active UI.
  • The CT-RATE built-in sample is rotated 90 degrees clockwise in the app to match the expected viewing orientation.
  • Public deployment should still respect the original dataset licenses and redistribution terms for bundled sample content.

Interface Guide

  • Input source switches between prepared built-in examples and your own uploaded data.
  • Built-in sample lets you compare different CT-oriented datasets quickly.
  • Slice index appears for volumetric built-in inputs and chooses the active axial slice.
  • Rotate uploaded image appears for uploaded DICOM data when the slice orientation needs correction.
  • Quantization bit depth controls how many gray levels remain after uniform quantization.
  • The app initializes the quantization display at 4 bits by default, unless the loaded image has a lower maximum bit depth.
  • CT window preset applies common lower/upper bound pairs such as lung or mediastinal ranges.
  • Window lower / upper bounds and the numeric bound inputs define the exact displayed intensity interval.
  • Histogram uses the selected window bounds as reference lines and is meant to show how quantization changes the intensity distribution, rather than to faithfully plot the post-windowed display mapping.
  • Visualization arrows can be clicked to choose which pair of panels should be compared.
  • Metrics → Compare is synchronized with the arrow graph and updates all downstream plots.

Design Notes

See docs/design_choices.md.