Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JPEG Codec - Image Encoder/Decoder

A complete JPEG encoding and decoding implementation in Python with a user-friendly GUI for image compression and quality assessment.

Features

  • JPEG encoding and decoding from scratch
  • Adjustable compression quality (1-100)
  • Quality metrics: PSNR, SSIM, MSE, MAE
  • GUI with Tkinter
  • Performance tracking (time, memory, compression ratio)

Installation

Requirements

  • Python 3.7+
  • OpenCV (cv2)
  • NumPy
  • Matplotlib
  • scikit-image
  • Numba

Setup

pip install opencv-python numpy matplotlib scikit-image numba

Usage

Running the GUI Application

python main.py

This launches the Tkinter GUI with the following controls:

  1. JPEG Encode File: Select an image file (BMP, JPEG, PNG) and save as compressed JPEG
  2. JPEG Decode File: Select a JPEG file and decompress to standard format
  3. Quality Slider: Adjust compression quality (1-100)
    • Low values (1-30): High compression, lower quality
    • Medium values (40-70): Balanced compression and quality
    • High values (80-100): Better quality, larger file size

Programmatic Usage

Encoding Example

from jpeg_encoder import JPEGEncoder
import cv2

# Initialize encoder with quality setting
encoder = JPEGEncoder(quality=80)

# Load and prepare image
image = encoder.load_image('input.jpg')
prepared = encoder.prepare_image(image)

# Convert to YCrCb color space
ycrcb = cv2.cvtColor(prepared, cv2.COLOR_BGR2YCrCb)

# Encode and save
encoder.encode(ycrcb, 'output.jpg')

Decoding Example

from jpeg_decoder import JPEGDecoder
import cv2

# Initialize decoder
decoder = JPEGDecoder()

# Decode JPEG file
decoded_image = decoder.decode('input.jpg', 'output.jpeg')

Quality Assessment

from main import ImageQualityAssessor
import cv2
import numpy as np

assessor = ImageQualityAssessor()

original = cv2.imread('original.jpg').astype(np.float32) / 255.0
compressed = cv2.imread('compressed.jpg').astype(np.float32) / 255.0

metrics = assessor.assess_quality(original, compressed)
print(f"PSNR: {metrics['PSNR']:.4f}")
print(f"SSIM: {metrics['SSIM']:.4f}")

Technical Details

JPEG Encoding

Color conversion → Block splitting → DCT → Quantization → Zigzag scan → Huffman encoding → File output

JPEG Decoding

Header parsing → Huffman decoding → Inverse quantization → IDCT → Color conversion → Image output

Quality Parameter

The quality slider (1-100) scales quantization tables. Higher values preserve more detail but increase file size.

Performance Metrics

The application tracks compression ratio, processing time, memory usage, and quality metrics (PSNR, SSIM, MSE, MAE). All data is automatically saved to performance_metrics.csv.

License

This project is provided as-is for educational and research purposes.

About

MSc dissertation: from-scratch JPEG codec implementing ITU-T T.81 — DCT, quantization, Huffman coding, zig-zag ordering, LZW compression. Validated against libjpeg.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages