比特图像分层原理
图像是由像素组成的,例如对于一张1024×1024的灰度图像,其像素点个数为1024×1024个。灰度图像在计算机中的本质是数的矩阵,数字大小代表其像素点的灰度值,故刚刚的灰度图像在计算机中便是一个1024×1024矩阵。
像素值是由比特位组成的整数。例如256级灰度图像是现有运用最广泛的灰度图像格式,其像素值是由8比特(一字节)组成。比方说,一个像素点的灰度值为8,则其存储数据为00001000.
比特图像分层便是将灰度图像的像素位数进行分别读取,将一幅灰度图像分开为八幅比特图像。8比特图像由8个1比特平面组成,其中平面1包含图像中所有像素的最低有效比特,平面8包含图像中所有像素的最高有效比特。例如,对于灰度值为8的像素,其在平面4中为1(即255),在其他平面中都为0。
MATLAB实现
image = imread('XXXXXXX.jpg'); %得到图像
image = rgb2gray(image); %若图像是彩色,先要转化为灰度图像
image1=image;
[m,k,s]=size(image1); %获取图像大小
subplot(3,3,1)
imshow(image);
for n=1:8
for i=1:m
for j=1:k
a=bitget(image(i,j),n); %提取这个位的值
if(a==1) %判断是否在该比特层中
image1(i,j)=255;
else
image1(i,j)=0;
end
end
end
subplot(3,3,n+1) %循环显示
imshow(image1)
image1=image;
end
分层结果
比特图像复原
从上面的结果可以看出,比特平面对于的比特位数越高,其和原图像的相似度越高,这给我们一个启发:即利用少量比特层进行原图像还原。我们知道比特平面由原图像拆分得到,故我们进行还原的方法为累加。
累加公式为:
例如,若对于一个像素,其平面7为255(即为1),平面8为255(即为1),我们用平面7、8进行累加,得到像素值为.
MATLAB实现
image = imread('XXXXX.jpg');
image = rgb2gray(image);
q=5; %选择需要开始累加的比特层,此处为5,即累加5,6,7,8平面
image1=image;
[m,k,s]=size(image1);
subplot(1,2,1)
imshow(image);
for n=1:8
for i=1:m
for j=1:k
a=bitget(image(i,j),n);
if(a==1)
image1(i,j)=1;
else
image1(i,j)=0;
end
end
end
if(n==q) %遍历到5平面时,保存该平面
image2=image1*2^(n-1);
end
if(n>q)
for i=1:m
for j=1:k
image2(i,j)=image2(i,j)+image1(i,j)*2^(n-1); %进行比特平面累加
end
end
end
实现结果
将q分别设为7(右上),6(左下),5(右下),可以得到三组图像,我们与原图(左上)放在一起对比:
结论
可以使用MATLAB对指定灰度图像进行比特分层,并利用部分比特图像叠加的方法还原原图像,这或许给图像压缩提供了新的思路。