Professional Documents
Culture Documents
Digital Image
Processing Basics
Image Compression
using Huffman Coding
Basics of Augmented
Reality
Monolithic vs
Microservices
architecture
CamelCase Pattern
Matching
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 1/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Computer Vision -
Introduction
Difference Between
Architectural Style,
Architectural Patterns
and Design Patterns
What is E-paper
Technology in
Amazon’s Kindle?
MATLAB - Ideal
Lowpass Filter in Image
Processing
We 3
Tr0ll use cookies to ensure
Walkthrough of you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Got It !
Cookie Policy & Privacy Policy
Check the Flag or CTF
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 2/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Problem
MongoDB - Update
Multiple Documents
Using MongoShell
Introduction to the
Probabilistic Data
Structure
Difference between
JDBC and Hibernate in
Java
MongoDB CRUD
operations
Comparison Between
Mamdani and Sugeno
Fuzzy Inference System
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 3/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
MATLAB - Ideal
Highpass Filter in
Image Processing
Raspberry-Pi a
computer for Geeks
Differences between
Cloud Servers and
Dedicated Servers
Virtual Reality -
Introduction
Dropbox - An
Introduction
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 4/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
EXCLU SIVE
TECH FOR
ALL YOUR
NEEDS
ONLY ON DELL.CO.IN
Dell PCs starting at
₹ 26,990*
Shop Now
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 5/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
The rst step of Huffman coding technique is to reduce the input image to a ordered histogram, where the probability of occurrence of a
certain pixel intensity value is as
prob_pixel = numpix/totalnum
where numpix is the number of occurrence of a pixel with a certain intensity value and totalnum is the total number of pixels in the input
Image.
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 6/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
This image
We use contains
cookies to ensure 46
you distinct pixel
have the best intensity
browsing values,
experience hence
on our weBy
website. will have
using 46 unique
our site, Huffman
you acknowledge thatcode words.
you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 7/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
It is evident that, not all pixel intensity values may be present in the image and hence will not have non-zero probability of occurrence.
From here on, the pixel intensity values in the input Image will be addressed as leaf nodes.
In this example, we will assign ‘0’ to the left child node and ‘1’ to the right one.
int i, j;
char filename[] = "Input_Image.bmp";
int data = 0, offset, bpp = 0, width, height;
long bmpsize = 0, bmpdataoff = 0;
int** image;
int temp = 0;
fread(&width, 4, 1, image_file);
fread(&height, 4, 1, image_file);
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
// Number of bits per pixel
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 9/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
fseek(image_file, 2, SEEK_CUR);
fread(&bpp, 2, 1, image_file);
// int image[height][width]
// can also be done
// Number of bytes in the
// Image pixel array
int numbytes = (bmpsize - bmpdataoff) / 3;
// the Image is a
// 24-bit BMP Image
temp = temp & 0x0000FF;
image[i][j] = temp;
}
}
}
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 10/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Find the number of pixel intensity values having non-zero probability of occurrence
Since, the values of pixel intensities range from 0 to 255, and not all pixel intensity values may be present in the image (as evident from the
histogram and also the image matrix) and hence will not have non-zero probability of occurrence. Also another purpose this step serves, is
that the number of pixel intensity values having non-zero probability values will give us the number of leaf nodes in the Image.
// Finding number of
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
// non-zero occurrences Got It !
Cookie Policy & Privacy Policy
int nodes = 0;
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 11/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Gallager [1] noted that every Huffman tree is efficient, but in fact it is easy to see more
generally that every optimal tree is efficient
Hence,
1/p = 64
For K = 9,
F(K+2) = F(11) = 55
F(K+3) = F(12) = 89
Therefore,
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 12/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Step 2
De ne a struct which will contain the pixel intensity values(pix), their corresponding probabilities(freq), the pointer to the left(*left) and
right(*right) child nodes and also the string array for the Huffman code word(code).
These structs is de ned inside main(), so as to use the maximum length of code(maxcodelen) to declare the code array eld of the struct
pixfreq
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 13/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
char code[maxcodelen];
};
Step 3
De ne another Struct which will contain the pixel intensity values(pix), their corresponding probabilities(freq) and an additional eld, which
will be used for storing the position of new generated nodes(arrloc).
Step 4
Declaring an array of structs. Each element of the array corresponds to a node in the Huffman Tree.
// Declaring structs
struct pixfreq* pix_freq;
struct huffcode* huffcodes;
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 14/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Initially, the struct array pix_freq, as well as the struct array huffcodes will only contain the information of all the leaf nodes in the Huffman
Tree.
The struct array pix_freq will be used to store all the nodes of the Huffman Tree and the array huffcodes will be used as the updated (and
sorted) tree.
Remember that, only huffcodes will be sorted in each iteration, and not pix_freq
The new nodes created by combining two nodes of lowest frequency, in each iteration, will be appended to the end of the pix_freq array, and
also to huffcodes array.
But the array huffcodes will be sorted again according to the probability of occurrence, after the new node is added to it.
The position of the new node in the array pix_freq will be stored in the arrloc eld of the struct huffcode.
The arrloc eld will be used when assigning the pointer to the left and right child of a new node.
Step 4 continued…
Now, if there are N number of leaf nodes, the total number of nodes in the whole Huffman Tree will be equal to 2N-1
And after two nodes are combined and replaced by the new parent node, the number of nodes decreases by 1 at each iteration. Hence, it is
su cient to have a length of nodes for the array huffcodes, which will be used as the updated and sorted Huffman nodes.
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 15/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Step 5
Initialize the two arrays pix_freq and huffcodes with information of the leaf nodes.
j = 0;
int totpix = height * width;
float tempprob;
for (i = 0; i < 256; i++)
{
if (hist[i] != 0)
{
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 16/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Step 6
Sorting the huffcodes array according to the probability of occurrence of the pixel intensity values
Note that, it is necessary to sort the huffcodes array, but not the pix_freq array, since we are already storing the location of the pixel values in
the arrloc eld of the huffcodes array.
}
}
Step 7
Building the Huffman Tree
We start by combining the two nodes with lowest probabilities of occurrence and then replacing the two nodes by the new node. This
process continues until we have a root node. The rst parent node formed will be stored at index nodes in the array pix_freq and the
subsequent parent nodes obtained will be stored at higher values of index.
float sumprob;
int sumpix;
int n = 0, k = 0;
int nextnode = nodes;
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 18/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Initially
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 20/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
As you can see, after rst iteration, the new node has been appended to the pix_freq array, and it’s index is 46. And in the huffcode the new
node has been added at its new position after sorting, and the arrloc points to the index of the new node in the pix_freq array. Also, notice
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 21/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
that, all array elements after the new node (at index 11) in huffcodes array has been shifted by 1 and the array element with pixel value 188
gets excluded in the updated array.
Now, in the next(2nd) iteration 170 and 174 will be combined, since 175 and 188 has already been combined.
Index of the lowest two nodes in terms of the variable nodes and n is
left_child_index=(nodes-n-2)
and
right_child_index=(nodes-n-1)
left_child_index=46-1-2=43
right_child_index=46-1-1=44
Hence, even if 175 remains the last element of the updated array, it will get excluded.
Another thing to notice in this code, is that, if in any subsequent iteration, the new node formed in the rst iteration is the child of another new
node, then the pointer to the new node obtained in the rst iteration, can be accessed using the arrloc stored in huffcodes array, as is done in
this line of code
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 22/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Step 8
Backtrack from the root to the leaf nodes to assign code words
Starting from the root, we assign ‘0’ to the left child node and ‘1’ to the right child node.
Now, since we were appending the newly formed nodes to the array pix_freq, hence it is expected that the root will be the last element of the
array at index totalnodes-1.
Hence, we start from the last index and iterate over the array, assigning code words to the left and right child nodes, till we reach the rst
parent node formed at index nodes. We don’t iterate over the leaf nodes since those nodes has NULL pointers as their left and right child.
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 23/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
if (pix_freq[i].right != NULL) {
strconcat(pix_freq[i].right->code, pix_freq[i].code, right);
}
}
Final Step
Encode the Image
The function codelen calculates the length of codewords OR, the number of bits required to represent the pixel.
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 25/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Encoded Image :
0111010101000110011101101010001011010000000101111
00010001101000100100100100010010101011001101110111001
00000001100111101010010101100001111000110110111110010
10110001000000010110000001100001100001110011011110000
10011001101111111000100101111100010100011110000111000
01101001110101111100000111101100001110010010110101000
0111101001100101101001010111
This encoded Image is 342 bits in length, where as the total number of bits in the original image is 512 bits. (64 pixels each of 8 bits).
Image Compression
We use cookies to ensure youCode
have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 27/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
// C Code for
// Image Compression
#include <stdio.h>
#include <stdlib.h>
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 28/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
// Driver code
int main()
{
int i, j;
char filename[] = "Input_Image.bmp";
int data = 0, offset, bpp = 0, width, height;
long bmpsize = 0, bmpdataoff = 0;
int** image;
int temp = 0;
fread(&width, 4, 1, image_file);
fread(&height, 4, 1, image_file);
fread(&bpp, 2, 1, image_file);
// int image[height][width]
// can also be done
// Number of bytes in
// the Image pixel array
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
int numbytes = (bmpsize - bmpdataoff) / 3; Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 30/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
// the Image is a
// 24-bit BMP Image
temp = temp & 0x0000FF;
image[i][j] = temp;
}
}
}
// Finding number of
// non-zero occurrences
int nodes = 0;
for (i = 0; i < 256; i++)
if (hist[i] != 0)
nodes += 1;
// Defining Structures
// huffcode
struct huffcode
{
int pix, arrloc;
float freq;
};
// Declaring structs
struct pixfreq* pix_freq;
struct huffcode* huffcodes;
int totalnodes = 2 * nodes - 1;
pix_freq = (struct pixfreq*)malloc(sizeof(struct pixfreq) * totalnodes);
huffcodes = (struct huffcode*)malloc(sizeof(struct huffcode) * nodes);
// Initializing
j = 0;
int totpix = height * width;
float tempprob;
for (i = 0; i < 256; i++)
{
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Got It !
if (hist[i] != 0)
Cookie Policy & Privacy Policy
{
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 32/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
// probability of occurrence
tempprob = (float)hist[i] / (float)totpix;
pix_freq[j].freq = tempprob;
huffcodes[j].freq = tempprob;
}
}
}
huffcodes[k].pix = sumpix;
huffcodes[k].freq = sumprob;
huffcodes[k].arrloc = nextnode;
}
else if (k > i)
}
n += 1;
nextnode += 1;
}
pix_val = image[i][j];
for (l = 0; l < nodes; l++)
if (pix_val == pix_freq[l].pix)
fprintf(imagehuff, "%s", pix_freq[l].code);
}
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 36/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 37/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Huffman Tree :
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 38/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 39/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Recommended Posts:
Canonical Huffman Coding
Huffman Coding | Greedy Algo-3
E cient Huffman Coding for Sorted Input | Greedy Algo-4
Image compression using K-means clustering
Project Idea | (Model based Image Compression of Medical Images)
Image Processing in Java | Set 3 (Colored image to greyscale image conversion)
Image Processing in Java | Set 4 (Colored image to Negative image conversion)
Image Processing in Java | Set 6 (Colored image to Sepia image conversion)
Practice Questions on Huffman Encoding
Compression of GIF images
Image Processing in Java | Set 5 (Colored to Red Green Blue Image Conversion)
Image Edge Detection Operators in Digital Image Processing
MATLAB | Converting a Grayscale Image to Binary Image using Thresholding
Image Processing in Java | Set 7 (Creating a random pixel image)
Image Processing in Java | Set 8 (Creating mirror image)
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our
Got It !
Getting started with Scikit-image: image processing in Policy
Cookie Python & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 40/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
SiladittyaManna
Check out this Author's contributed articles.
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to
contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you nd anything incorrect by clicking on the "Improve Article" button below.
Improved By : nidhi_biet
5
4.6
To-do Done
Based on 6 vote(s)
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 41/42
7/30/2020 Image Compression using Huffman Coding - GeeksforGeeks
Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.
Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.
Load Comments
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Got It !
Cookie Policy & Privacy Policy
https://www.geeksforgeeks.org/image-compression-using-huffman-coding/ 42/42