The discrete cosine transform (DCT) represents an image as a
sum of sinusoids of varying magnitudes and frequencies. The
dct2 function computes the two-dimensional
discrete cosine transform (DCT) of an image. The DCT has the property
that, for a typical image, most of the visually significant information
about the image is concentrated in just a few coefficients of the
DCT. For this reason, the DCT is often used in image compression applications.
For example, the DCT is at the heart of the international standard
lossy image compression algorithm known as JPEG. (The name comes from
the working group that developed the standard: the Joint Photographic
The two-dimensional DCT of an M-by-N matrix
defined as follows.
The values Bpq are
called the DCT coefficients of
(Note that matrix indices in MATLAB® always start at 1 rather
than 0; therefore, the MATLAB matrix elements
to the mathematical quantities A00 and B00,
The DCT is an invertible transform, and its inverse is given by
The inverse DCT equation can be interpreted as meaning that
any M-by-N matrix
A can be written as a sum of MN functions
of the form
These functions are called the basis functions of the DCT. The DCT coefficients Bpq, then, can be regarded as the weights applied to each basis function. For 8-by-8 matrices, the 64 basis functions are illustrated by this image.
The 64 Basis Functions of an 8-by-8 Matrix
Horizontal frequencies increase from left to right, and vertical frequencies increase from top to bottom. The constant-valued basis function at the upper left is often called the DC basis function, and the corresponding DCT coefficient B00 is often called the DC coefficient.
There are two ways to compute the DCT using Image Processing Toolbox™ software.
The first method is to use the
an FFT-based algorithm for speedy computation with large inputs. The
second method is to use the DCT transform matrix,
which is returned by the function
might be more efficient for small square inputs, such as 8-by-8 or
16-by-16. The M-by-M transform matrix
T is given
For an M-by-M matrix
an M-by-M matrix whose columns contain the one-dimensional DCT of
the columns of
A. The two-dimensional DCT of
be computed as
a real orthonormal matrix, its inverse is the same as its transpose.
Therefore, the inverse two-dimensional DCT of
In the JPEG image compression algorithm, the input image is divided into 8-by-8 or 16-by-16 blocks, and the two-dimensional DCT is computed for each block. The DCT coefficients are then quantized, coded, and transmitted. The JPEG receiver (or JPEG file reader) decodes the quantized DCT coefficients, computes the inverse two-dimensional DCT of each block, and then puts the blocks back together into a single image. For typical images, many of the DCT coefficients have values close to zero; these coefficients can be discarded without seriously affecting the quality of the reconstructed image.
The example code below computes the two-dimensional DCT of 8-by-8 blocks in the input image, discards (sets to zero) all but 10 of the 64 DCT coefficients in each block, and then reconstructs the image using the two-dimensional inverse DCT of each block. The transform matrix computation method is used.
I = imread('cameraman.tif'); I = im2double(I); T = dctmtx(8); dct = @(block_struct) T * block_struct.data * T'; B = blockproc(I,[8 8],dct); mask = [1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; B2 = blockproc(B,[8 8],@(block_struct) mask .* block_struct.data); invdct = @(block_struct) T' * block_struct.data * T; I2 = blockproc(B2,[8 8],invdct); imshow(I), figure, imshow(I2)
Although there is some loss of quality in the reconstructed image, it is clearly recognizable, even though almost 85% of the DCT coefficients were discarded.