A deblocking JPEG decoder
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
doc/img
.gitignore
BUILD
CONTRIBUTING.md Add boilerplate CONTRIBUTING.md Feb 21, 2018
LICENSE Initial commit Feb 21, 2018
README.md
WORKSPACE
color_transform.h
compare.py Initial commit Feb 21, 2018
dct_double.cc Initial commit Feb 21, 2018
dct_double.h
decode.cc
gamma_correct.cc Initial commit Feb 21, 2018
gamma_correct.h Initial commit Feb 21, 2018
idct.cc
idct.h Initial commit Feb 21, 2018
idct.py
jpeg_data.cc
jpeg_data.h
jpeg_data_decoder.cc
jpeg_data_decoder.h
jpeg_data_reader.cc
jpeg_data_reader.h
jpeg_error.h
jpeg_huffman_decode.cc
jpeg_huffman_decode.h
lodepng.BUILD
output_image.cc
output_image.h Initial commit Feb 21, 2018
preprocess_downsample.cc
preprocess_downsample.h
quantize.cc
quantize.h

README.md

Knusperli

The goal of Knusperli is to reduce blocking artifacts in decoded JPEG images, by interpreting quantized DCT coefficients in the image data as an interval, rather than a fixed value, and choosing the value from that interval that minimizes discontinuities at block boundaries.

Left: a traditional JPEG decoder (Imagemagick 6.9.7-4). Right: Knusperli.

Lena JPEG, zoomed Lena Knusperli, zoomed

Lena JPEG Lena Knusperli

Building

Knusperli builds with Bazel:

CC=gcc bazel build :knusperli
bazel-bin/knusperli input.jpg output.png

Details

A JPEG encoder quantizes DCT coefficients by rounding coefficients to the nearest multiple of the elements of the quantization matrix. For every coefficient, there is an interval of values that would round to the same multiple. A traditional decoder uses the center of this interval to reconstruct the image. Knusperli instead chooses the value in the interval that reduces discontinuities at block boundaries. The coefficients that Knusperli uses, would have rounded to the same values that are stored in the JPEG image.

Disclaimer

This is not an officially supported Google product.