This tutorial explains in brief the compression of an image
using bit plane slicing technique. This is a lossy compression technique. In
other words, part of the data is lost in
the compression process compared to the original image.

Check out the post on
bit plane slicing to understand better.

Let’s explain with a simple example how encoding and
decoding is carried out in Bit plane compression. In this example, the Most Significant Bit(MSB) alone is considered and encoded. For better quality image retrieval, combination of various bit planes such as [8 7] ,[[8 7 6], [8 7 6 5] ..etc can be encoded and decoded. The numbers 8,7,6 , 5 ,..etc represent bit positions.

**Compression:**

**Step 1:**Consider a matrix A of size 3 x 5

**Step 2:**Obtain the binary equivalent of the values in the matrix A. TheMATLAB function ‘dec2bin’ can be used for conversion

**Step 3:**Extract the Most Significant Bit(MSB) for each value in the matrix from the binary representation. The MATLAB function ‘bitget’ can be used for the same.

**Step 4:**Rearrange the above MSB values such that each row contains 8 columns or 8 bits.

In the above example, we have 3x5=15 values but we need 8 columns in
each row. It can be achieved by padding
the matrix with zeros in the end in order to form a matrix which has 8 columns
in each row.

**Step 5:**Convert the binary representation in each row to a decimal number and store it.

Use ‘bin2dec’ MATLAB function to convert binary values to
decimal values.

In our example, decimal equivalent of [1 0 0 0 1 0 0 0] =
136 and [1 0 1 0 1 0 1 0] = 170

**MATLAB CODE:**

clear all

clc

A = [180 4 80 33 201; 120 27 11
160 28; 224 1 133 67 144];

A = uint8(A);

%Encoding

%Check whether zeros has to
be appended to the matrix

rem = mod(numel(A),8);

if rem~=0

rem = 8-rem;

end

%Extract the MSB

bit8 = bitget(A,8);

b8 = bit8';

b8 = b8(:);

b8 = [b8;zeros(rem,1)];

%Reshape the matrix as such
each row contains 8 columns

mat8 = reshape(b8,8,[])';

str8 = num2str(mat8);

str8 = str8(:,1:3:end);

%Convert the binary to
decimal

compressedbit8 =
uint8(bin2dec(str8));

Verify the compressed data and original data size for
comparison of size used for storage.

**MATLAB CODE:**

whos A compressedbit8

**Decompression:**

For Decoding an image/matrix, the compressed / encoded data
has to be provided as the input along with size of the original image/matrix
and the vector containing the position
of the bits used for encoding in order.

**Step 1:**Convert the decimal value of the compressed data into binary format.

**Step 2:**Remove the extra zeros appended to the matrix, if needed.

**Step 3:**Reshape the matrix to size of the original matrix A using the MATLAB function ‘reshape’.

**Step 4:**Preallocate a matrix of same size of original matrix A and replace the MSB(Most Significant Bit) of each value in the matrix with the bit we decompressed in the previous step.

Use the MATLAB function ‘bitset’

**Step 5:**Display the final data.

**MATLAB CODE:**

%Decoding

%Convert Decimal to Binary

decompressedbit8 =
dec2bin(compressedbit8,8);

%Reshape the matrix to the
size of original matrix size

%And remove extra zeros
appended to the matrix

dbit8 = decompressedbit8';

dbit8 = dbit8(:);

dbit8 = dbit8(1:end-rem);

dbit8 =
reshape(dbit8,size(A,2),size(A,1))';

%Preallocate a matrix

Image = zeros([size(A,1)
size(A,2)]);

slice8 = zeros([size(A,1) size(A,2)]);

%Set the MSB with the
binary values obtained from decompressed matrix

ind_bit8 = find(dbit8=='1');

slice8(ind_bit8) = 1;

Image = bitset(Image,8,slice8);

Image = uint8(Image);

%Display data

display(Image);

The above method can be extended for images by extracting
combination of bits.

Example: The 7 and the 8 th bit can be extracted and stored
or 2,4,6 and 8 bit can also be extracted.

**COMPRESSION:**

**MATLAB CODE:**

%ENCODING

clear all

clc

%INPUT IMAGE

A = imread('cameraman.tif');

%Encoding

bitnums = [6;7;8]; %BIT
PLANES

%CHECK IF PADDING WITH
ZEROS IS NEEDED OR NOT

rem = mod(numel(A),8);

if(rem~=0)

rem = 8-rem;

end

%EXTRACT EACH BIT AND STORE
IT IN THE MATRIX

forinc =1:length(bitnums)

Ind = bitnums(inc);

%EXTRACT THE 'n'th BIT

bitval = bitget(A,Ind);

%PAD WITH ZEROS AND RESHAPE
THE MATRIX

bval = bitval';

bval = bval(:);

bval = [bval;zeros(rem,1)];

matv = reshape(bval,8,[])';

strv = num2str(matv);

strv = strv(:,1:3:end);

%CONVERT BINARY TO DECIMAL

compressedbitv(:,inc) =
uint8(bin2dec(strv));

end

%STORE THE COMPRESSED DATA
IN A FILE

%OPTIONAL

fp = fopen('compressed_data678.data','wb');

fwrite(fp,compressedbitv','uint8');

fclose(fp);

**EXPLANATION:**

In the given example, 6,7 and 8 bit planes are extracted and compressed.

The compressed data can be stored in a file, if needed.

Original
Image size = 64 KB

Compressed Image
size = 24 KB

**NOTE:**bitnums = [6;7;8]; Modify this line to compress combination of bits.

Some examples: bitnums=[8] or bitnums=[2;4;6;8] or
bitnums=[5;6;7;8]

**DECOMPRESSION:**

%DECOMPRESSION

clear all

clc

%INPUT FROM THE USER

M = 256; %SIZE OF
THE ORIGINAL IMAGE

N = 256; %SIZE OF
THE ORIGINAL IMAGE

bitnums = [6;7;8]; %BIT
PLANES USED

rem = mod(M*N,8);

if(rem~=0)

rem = 8-rem;

end

%READ THE COMPRESSED DATA

fp = fopen('compressed_data678.data','rb');

compressedbitv =
fread(fp,[length(bitnums),Inf],'uint8')';

fclose(fp);

%PREALLOCATE THE MATRIX

Image = zeros([M N]);

forinc = 1:length(bitnums)

Ind = bitnums(inc);

%CONVERT DECIMAL TO BINARY

decompressedbitv =
dec2bin(compressedbitv(:,inc),8);

%REMOVE EXTRA ZEROS AND
RESHAPE THE MATRIX

dbitv = decompressedbitv';

dbitv = dbitv(:);

dbitv = dbitv(1:end-rem);

dbitv = reshape(dbitv,N,M)';

%SET THE 'n'th BIT

slicev = zeros([M N]);

ind_bitv = find(dbitv == '1');

slicev(ind_bitv) = 1;

Image = bitset(Image,Ind,slicev);

end

%DISPLAY THE IMAGE

Image = uint8(Image);

figure,imagesc(Image);colormap(gray);

Bit Plane 8 |

Bit Planes 7,8 |

Bit Planes 2,4,6 and 8 |

**EXPLANATION:**

The bit planes 6, 7 and 8 are extracted and the image is
formed using those bits.

**NOTE:**

For decoding the following lines should be modified during
each run.

%INPUT FROM THE USER

M = 256; %SIZE OF
THE ORIGINAL IMAGE

N = 256; %SIZE OF
THE ORIGINAL IMAGE

bitnums = [6;7;8]; %BIT
PLANES USED

The size of the original image should be given as an input.
Update M and N with the number of rows and columns of the original image.

The vector ‘bitnums’ should be exactly same as the one in
the encoding procedure.

Whenever, ‘bitnums’ is modified during encoding then it
should be modified during decoding process as well.

## 0 comments:

## Enjoyed Reading? Share Your Views