clear;
outfp = fopen('自己分形图像压缩.txt','w');
[DATA,map]=imread('gou.bmp','bmp');%读入彩色图像
DATA=double(DATA);
size1=size(DATA);
tu=DATA(1:size1(1),1:size1(2),1);%取出彩色三维数据其中的第一维,即为灰度图像
xx=size1(2);%图像横轴像素列数
yy=size1(1);%图像纵轴像素行数
nrx=xx/8;%将原始图像划分成 8*8 的像素矩阵
nry=yy/8;%将原始图像划分成 8*8 的像素矩阵
ndx=xx/16;%将定义域划分成 16*16 的像素矩阵
ndy=yy/16;%将定义域划分成 16*16 的像素矩阵
DD=zeros(ndy,ndx,8,64);%用于存在定义域压缩后 8*8 矩阵的 8 中对应的变换形式
cund1=zeros(16,16);%用于存放 16*16 的定义域像素块
cund2=zeros(8,8);%用于存放有 16*16 的定义域像素块压缩后形成的 8*8 像素块
cund3=zeros(1,64);
cund33=zeros(1,64);
cund4=zeros(8,8);
RRR=zeros(nry,nrx,6);
% s,o,D(y),D(x),U
cunr=zeros(1,64);
for i=1:ndy
for j=1:ndx
%
for k=1:16
%取定义域图像(原始图像)中 16*16 的像素矩阵
cund1=tu(1+16*(i-1):16+16*(i-1),1+16*(j-1):16+16*(j-1));
for l=1:8
for m=1:8
块转换成 8*8 的块
%求定义域像素每临近四个像素点的平均值,借以将 16*16 的定义域
cund2(l,m)=(cund1(1+2*(l-1),1+2*(m-1))+cund1(2+2*(l-1),2+2*(m-1))+cund1(2+2*(l-1),1+2*(m-1)
)+cund1(1+2*(l-1),2+2*(m-1)))/4;
end;
end;
end;
%
%对 cund2 做 0 度旋转
DD(i,j,1,1:64)=reshape(cund2,[1,64]);%将 cund2 按列重新排列成一行
cund4=fliplr(cund2);%将 cund2 矩阵左右翻转,相当于矩阵水平中线反射
DD(i,j,2,1:64)=reshape(cund4,[1,64]);
cund4=flipud(cund2);%将 cund2 矩阵上下翻转,相当于矩阵垂直中线反射
DD(i,j,3,1:64)=reshape(cund4,[1,64]);
cund4=flipud(fliplr(cund2));%将矩阵左右翻转后上下翻转,相当于 180 度旋转
DD(i,j,4,1:64)=reshape(cund4,[1,64]);
cund4=rot90(flipud(cund2));%矩阵相对 135 度反射
DD(i,j,5,1:64)=reshape(cund4,[1,64]);
cund4=rot90(cund2);%矩阵 90 度旋转
DD(i,j,6,1:64)=reshape(cund4,[1,64]);
cund4=rot90(rot90(rot90(cund2)));%矩阵 270 度旋转
DD(i,j,7,1:64)=reshape(cund4,[1,64]);
cund4=cund2';%矩阵相对 45 度反射
DD(i,j,8,1:64)=reshape(cund4,[1,64]);
DD(i,j,1,1:8,1:8)=cund2;
DD(i,j,2,1:8,1:8)=fliplr(cund2);
DD(i,j,3,1:8,1:8)=flipud(cund2);
DD(i,j,4,1:8,1:8)=flipud(fliplr(cund2));
DD(i,j,5,1:8,1:8)=Rot90(flipud(cund2));
DD(i,j,6,1:8,1:8)=Rot90(cund2);
DD(i,j,7,1:8,1:8)=Rot90(Rot90(Rot90(cund2)));
DD(i,j,8,1:8,1:8)=cund2';
%
%
%
%
%
%
%
%
end;
end;
for i=1:nry%这两个循环(i 和 j)保证了对于每个值域块都找到了相应的定义域块,并且求出
了该定义域块
for j=1:nrx%得一系列变换过程
%将值域块 8*8 的像素值重新排列成一列,放到 cunr
cunr=reshape(tu(1+8*(i-1):8+8*(i-1),1+8*(j-1):8+8*(j-1)),[1,64]);
sumalpha=sum(cunr);
sumalpha2=norm(cunr)^2;%cunr 中各个数值的平方(即向量 2 范数的平方),相当
is ri(值域块的值)
%cunr
于求值域块矩阵每个元素的平方再求和
dx=1;%这几个变量就是分形编码的数据量,他们的初值可以随意定。记录 l 的值
dy=1;%记录 k 的值
ut=1;%记录 m 的值
minH=10^20;%记录最小的均方根误差 R 值
minot=0;%参数 minot 记录下与当前值域块能够最佳匹配的定义域块下变换所需的
亮度调节
minst=0;%参数 minst 记录下与当前值域块能够最佳匹配的定义域块下变换所需的
对比度调节
for k=1:ndy%参数 k 与 l 记录下与当前值域块能够最佳匹配的定义域块的序号
for l=1:ndx%
for m=1:8%参数 m 记录下与当前值域块能够最佳匹配的定义域块得 8 种基
本变形的序号
cund3(1:64)=DD(k,l,m,1:64);
sumbeta=sum(cund3); % cund3 is di(定义域块的值)
sumbeta2=norm(cund3)^2;%求出向量的 2 范数,相当于定义域块矩阵
的每个元素的平方再求和
即是对比度调节系数 s
alphabeta=cunr*cund3';%相当于。。。
if (64*sumbeta2-sumbeta^2)~=0
st=(64*alphabeta-sumalpha*sumbeta)/(64*sumbeta2-sumbeta^2);%st
elseif (64*alphabeta-sumalpha*sumbeta)==0||st > 1 || st < -1
st=0;
else
st=10^20;
end;
ot=(sumalpha-st*sumbeta)/64;%ot 即使亮度调节系数
H=(sumalpha2+st*(st*sumbeta2-2*alphabeta+2*ot*sumbeta)+ot*(64*ot-2*sumalpha))/64;% 在
当前 s 与 o 的条件下的 R
%
H=norm(cund33*minst+ot-cunr)^2
if H
for iter=1:10
for i=1:nry
for j=1:nrx
st=RRR(i,j,1);
ot=RRR(i,j,2);
dy=RRR(i,j,3);
dx=RRR(i,j,4);
ut=RRR(i,j,5);
cund1=huifu(1+16*(dy-1):16+16*(dy-1),1+16*(dx-1):16+16*(dx-1));
for l=1:8
for m=1:8
cund2(l,m)=(cund1(1+2*(l-1),1+2*(m-1))+cund1(2+2*(l-1),2+2*(m-1))+cund1(2+2*(l-1),1+2*(m-1)
)+cund1(1+2*(l-1),2+2*(m-1)))/4;
end;
end;
switch ut
case 1
cund4=cund2;
case 2
cund4=fliplr(cund2);
case 3
cund4=flipud(cund2);
case 4
cund4=flipud(fliplr(cund2));
case 5
cund4=rot90(flipud(cund2));
case 6
cund4=rot90(cund2);
case 7
cund4=rot90(rot90(rot90(cund2)));
case 8
cund4=cund2';
end;
huifu(1+8*(i-1):8+8*(i-1),1+8*(j-1):8+8*(j-1))=st*cund4+ot;
end;
end;
end;
% mse=0;
% for i=1:nrx
%求峰值信噪比 psnr
for j=1:nry
end
a=(DATA(i,j)-huifu(i,j))^2;
mse=mse+a;
%
%
%
%
% end
% mse=mse/(256*256);
% psnr=10*log10((255*255)/mse);
% fprintf(outfp,'\n psnr 的值为:%6.3f\n', psnr);
Igray = mat2gray(DATA);
huifu = mat2gray(huifu);
subplot(1,2,1),imshow(Igray);
subplot(1,2,2),imshow(huifu);
fclose(outfp);
此程序的结果分析:
本次试验选用的灰度图像,尺寸大小是
pixel
分形压缩后解压的图像,压缩后需要记录的数据大小为
(double)
数据压缩比为
=11:1