一、位平面切片
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);