一、位平面切片

1、概述

         位平面切片是在图像处理中使用的众所周知的技术。在图像压缩中使用位平面切片。位平面切片是将图像转换为多级二值图像。

        然后使用不同的算法压缩这些二进制图像。使用这种技术,可以从灰度图像中分离出有效位,这对于以非常低的时间复杂度处理这些数据很有用。

2、什么是位平面切片?

 数字图像中每个像素的灰度级在计算机中存储为一个或多个字节。

        对于 8 位图像,0 编码为 00000000,255 编码为 11111111。0 到 255 之间的任何数字都编码为一个字节。

        最左侧的位称为最高有效位 (MSB),因为该位的更改会显着改变字节编码的值。

        最右边的位称为最低有效位 (LSB),因为该位的变化不会太大改变编码的灰度值。

3、位平面切片的主要作用

        将灰度图像转换为二值图像。

        用更少的比特表示图像并将图像对应到更小的尺寸

        通过聚焦增强图像。

4、示例

(1)简述

 如下图这样一张图片 

        被选中的黄色区域的像素值的二进制数据如下

         于是可以定义,平面1包含图像中所有像素的最低位。

         平面 8 包含图像中所有像素的最高位。

(2)matlab读取并显示

使用matlab读取图片,并使用bitget函数得到每个切片。

A=imread('coins.png');
 
B=bitget(A,1);
figure,
subplot(2,2,1);imshow(logical(B));title('Bit plane 1');
 
B=bitget(A,2);
subplot(2,2,2);imshow(logical(B));title('Bit plane 2');
 
B=bitget(A,3);
subplot(2,2,3);imshow(logical(B));title('Bit plane 3');
 
 
B=bitget(A,4);
subplot(2,2,4);imshow(logical(B));title('Bit plane 4');

显示结果如下,只显示了前四个切片。

         得到了这些切片,我们就可以使用它们组合或者处理重新生成图像。以达到压缩或聚焦等目的。

二、位平面压缩

1、概述

        这是一种有损压缩技术。换句话说,与原始图像相比,压缩过程中会丢失部分数据。

2、压缩流程说明

1)存在这样一个矩阵

 (2)dec2bin转二进制

 (3)从二进制表示中提取矩阵中每个值的最高有效位 (MSB)。MATLAB 函数 'bitget'。

 (4)重新排列上述 MSB 值,使每行包含 8 列或 8 位。可以通过在最后用零填充矩阵来实现,以形成每行有 8 列的矩阵。

 (5)将每行中的二进制表示转换为十进制数并存储。使用 'bin2dec' MATLAB 函数将二进制值转换为十进制值。

 3、解压流程说明

(1)将压缩数据的十进制值转换为二进制格式。如果需要,删除附加到矩阵的额外零。

 (2)使用 MATLAB 函数“reshape”将矩阵重塑为原始矩阵 A 的大小。

 (3)预分配一个与原始矩阵A相同大小的矩阵,并将矩阵中每个值的MSB(Most Significant Bit)替换为我们在上一步解压缩的位。使用 MATLAB 函数 'bitset'

 (4)由此我们的到了这个位片的原始数据

4、矩阵示例

(1)压缩矩阵

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));

(2)解压数据

%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);

5、图像示例

(1)抽取678位

%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);

(2)读取并还原为图片

%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);

(3)示例图片

7、8切片

 

2468切片