图像压缩编码``
%初始化
clear all;
clc;%读入彩色图片,并转化为灰度图片
Pic_TMP = imread('PK.bmp');
Pic_TMP = rgb2gray(Pic_TMP);%统计图片的尺寸信息
Row = size(Pic_TMP, 1);
Col = size(Pic_TMP, 2);
%选取8阶灰度,其他所有灰度均归并到此8阶灰度上Gray_Level = [16 48 80 112 144 176 208 240];
%初始化计数变量,用于统计灰度级数量压缩后各灰度被使用的次数
Gray_PixelCount(1:8) = 0;
%将Pic_TMP各像素灰度级别调整到Gray_Level上
%调节灰度的同时统计各灰度被使用次数
%灰度压缩后的灰度矩阵赋给变量
Pic_8LvlPic_8Lvl(1:Row, 1:Col) = uint8(0);
for m = 1:Row
for n = 1:Col
tmp = floor(double(Pic_TMP(m,n))/32) + 1; Pic_8Lvl(m,n) = Gray_Level(tmp); Gray_PixelCount(tmp) = Gray_PixelCount(tmp) + 1;
end
end
%统计8种灰度各自被使用到的概率
p = Gray_PixelCount/(Row * Col);
%哈夫曼编码
p=sort(p,'descend');%降序排列
H=sum(-p.*log2(p));%求得信息熵
n=length(p);%离散信源长度
q=p;
m=zeros(n-1,n);
for i=1:n-1%对第一行进行编码
[q,l]=sort(q);
m(i,:)=[l(1:n-i+1),zeros(1,i-1)];
q=[q(1)+q(2),q(3:n),1];
end
for i=1:n-1
c(i,:)=blanks(n*n);
end
c(n-1,n)='1';
c(n-1,2*n)='0';
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1)));
c(n-i,n)='1';%在支路的第一个元素最后补1
c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
c(n-i,2*n)='0';%在支路的第一个元素最后补0
for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));%分配码字
end
end
for i=1:n
h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n); %进行编码
ll(i)=length(find(abs(h(i,:))~=32));%计算每一个哈夫曼编码的长度
end
%提取8*8d的图片
a= Pic_8Lvl(24:31,9:16);%提取灰度图片中的一个8*8的部分图像
A=a';%行列转置
%z字形重排
y_img_index=1;
for dim_sum=2:1:32 if(mod(dim_sum,2)==0)
for i=1:1:8
if dim_sum-i<=8 && dim_sum-i>0
imgtemp(y_img_index) = A(i,dim_sum-i);
y_img_index=y_img_index+1;
end
end
else
for i=1:1:8
if dim_sum-i<=8 && dim_sum-i>0
imgtemp(y_img_index) = A(dim_sum-i,i); y_img_index=y_img_index+1;
end
end
end
end
%子图z字形重排的编码I2=im2double(imgtemp);
rna=cell(size(I2));
a2=size(I2);
L1=length(rna);
for i=1:length(rna)
if imgtemp(i)==16
rna{1,i}='1';
elseif imgtemp(i)==48
rna{1,i}='01';
elseif imgtemp(i)==80
rna{1,i}='001';
elseif I2(i)==112
rna{1,i}='0001';
elseif I2(i)==144
rna{1,i}='00000';
elseif I2(i)==176 rna{1,i}='000010';
elseif I2(i)==208 rna{1,i}='0000110';
elseif I2(i)==240 rna{1,i}='0000111';
end
end
%显示原图subplot(2,2,1);imshow(Pic_TMP);title('灰度图'); subplot(2,2,2);bar(Gray_Level, p);title('灰度压缩后归一化灰度直方图');
subplot(2,2,3);imshow(A);title('8*8的子图');
disp('8阶灰度值')
disp(Gray_Level);
disp('信源概率')
disp(p);
disp('编码序列')
disp(h);
disp('z字形重新排列')
disp(imgtemp);
disp('z字形重新排列对应的编码')
disp(rna);
cs=strjoin(rna);
disp('子图z字形重新排列的编码序列')
disp(cs);