logo资料库

分形图像压缩源代码.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
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
分享到:
收藏