求迭代分形的MATLAB程序

求迭代分形的MATLAB程序,第1张

function

cycle6(px,py,r,n)

%px,py和r分别首肢昌饥迹是大圆圆心坐标和半径,n是迭代次数

%例子者扒:

%cycle6(0,0,1,4)axis

equal

t=linspace(-pi,pi)

plot(r*cos(t)+px,r*sin(t)+py)

theta=pi/3*(0:5)

newr=r/3

newpx=px+2*newr*cos(theta)

newpy=py+2*newr*sin(theta)

if

n>1

for

i=1:6

hold

oncycle6(newpx(i),newpy(i),newr,n-1)

end

end

分形编码的基本思路是:先采用一种合适的初级压缩方法对图像进行压缩,得到一组压缩编码,然后解码这组编码,得到一幅解压缩图像.对解码图像与原始图像求差值,得到一差值图像,然后对该差值图像进行适当的编码.对差值图像的编码与如旅简初级编码共同构成对原始图像的编码.这种方法需要选择合适的初级编码镇袭方法与差值编码方法,使得这两者相结合,可以得到一种综合性能较好的编码方法。

其定义如图。

%%%%%%%%%%%%%%

clear

tic

%Image1=imread('pic\cameraman.tif')

xianshi

number=input(' input the number:')

Image1=suoxiao('pic\cameraman.tif',number)

[imagem imagen]=size(Image1)

Sr=4Sd=8

Rnum=(imagem/Sr)*(imagen/Sr)

Dnum=(imagem/Sd)*(imagen/Sd)

Image2=zeros(Dnum,Sr,Sr)

Image2=blkproc(Image1,[Sd/Sr,Sd/Sr],'mean(mean(x))')

%压缩image1为原来1/2

% there are no  eight tranformation for simpleness

RBlocks=zeros(Rnum,Sr,Sr)

DBlocks=zeros(Dnum,Sd,Sd)

DBlocksReduce=zeros(Dnum*8,Sr,Sr)

%%取R块,K记标号----------------------------------

for i=1:imagem/Sr

for j=1:imagen/Sr

k=(i-1)*imagen/Sr+j

RBlocks(k,:,:)=Image1((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr)

end

end

%取R块,K记标号----------------------------------

for i=1:imagem/Sd

for j=1:imagen/Sd

k=(i-1)*imagen/Sd+j

m=Srn=Sr

DBlocksReduce(k,:,:)=Image2((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr)

DBlocksReduce(k+Dnum,:,:)=DBlocksReduce(k,m:-1:1,:)              % 行上下翻转===(x轴对称)

DBlocksReduce(k+2*Dnum,:,:)=DBlocksReduce(k,:,n:-1:1)              % 列左右翻转 ==== y轴对称

DBlocksReduce(k+3*Dnum,:,:)=DBlocksReduce(k,m:-1:1,n:-1:1)         % 先行翻,再列翻  旋转180度

DBlocksReduce(k+4*Dnum,:,:)=reshape(DBlocksReduce(k,:,:),Sr,Sr)'                       % 关于y=-x对称

A=reshape( DBlocksReduce(k+3*Dnum,:,:),Sr,Sr)'

DBlocksReduce(k+5*Dnum,:,:)=A(:,n:-1:1)     % 关于y=x对称

DBlocksReduce(k+6*Dnum,:,:)=imrotate(reshape(DBlocksReduce(k,:,:),Sr,Sr),90)           % 逆时针旋转90度

DBlocksReduce(k+7*Dnum,:,:)=imrotate(reshape(DBlocksReduce(k,:,:),Sr,Sr),270)          % 逆时针旋转270度

DBlocks(k,:,:)=Image1((i-1)*Sd+1:i*Sd,(j-1)*Sd+1:j*Sd)

end

end

RandDbest=zeros(Rnum,1)+256^3

RandDbests=zeros(Rnum,1)

RandDbesto=zeros(Rnum,1)

RandDbestj=zeros(Rnum,1)

for 渣裤i=1:Rnum

x=reshape(RBlocks(i,:,:),Sr*Sr,1)

meanx=mean(x)

for j=1:Dnum*8

y=reshape(DBlocksReduce(j,:,:),Sr*Sr,1)

meany=mean(y)

s=(x-meanx)'*(y-meany)/((y-meany)'*(y-meany))%计算s

o=(meanx-s*meany)%计算o

c=(x-s*y-o)'*(x-s*y-o)%距离

if (RandDbest(i)>c)&(abs(s)<1)

RandDbest(i)=c

RandDbests(i)=s

RandDbesto(i)=o

RandDbestj(i)=j%可以找到对应变换和D块

end

end

end

%iteration limit

toc

tic

m=8%解码迭代次数

e=mean(mean(Image1))

Image3=e*ones(imagem,imagen)%解码初始图象

for L=1:m

Image4=blkproc(Image3,[Sd/Sr,Sd/Sr],'mean(mean(x))')

for i=1:imagem/Sr

for j=1:imagen/Sr

m=Srn=Sr

k=(i-1)*imagen/Sr+j

l=RandDbestj(k)

k1=mod(l-1,Dnum)+1%第几个D

l1=(l-k1)/Dnum+1%变换号

%R对应D在Image4的起始点

j1=mod(k1-1,imagen/Sd)+1

i1=(k1-j1)/(imagen/Sd)+1

%变换------------------------------------------------------------------------

DBlocksReduce(k1,:,:)=Image4((i1-1)*Sr+1:i1*Sr,(j1-1)*Sr+1:j1*Sr)

switch l1-1

case 0

DBlocksReduce(l,:,:)=Image4((i1-1)*Sr+1:i1*Sr,(j1-1)*Sr+1:j1*Sr)

case 1

DBlocksReduce(l,:,:)=DBlocksReduce(k1,m:-1:1,:)

case 2

DBlocksReduce(l,:,:)=DBlocksReduce(k1,:,n:-1:1)

case 3

DBlocksReduce(l,:,:)=DBlocksReduce(k1,m:-1:1,n:-1:1)

case 4

DBlocksReduce(l,:,:)=reshape(DBlocksReduce(k1,:,:),Sr,Sr)'

case 5

DBlocksReduce(k1+3*Dnum,:,:)=DBlocksReduce(k1,m:-1:1,n:-1:1)

A=reshape( DBlocksReduce(k1+3*Dnum,:,:),Sr,Sr)'

DBlocksReduce(l,:,:)=A(:,n:-1:1)

case 6

DBlocksReduce(l,:,:)=imrotate(reshape(DBlocksReduce(k1,:,:),Sr,Sr),90)

case 7

DBlocksReduce(l,:,:)=imrotate(reshape(DBlocksReduce(k1,:,:),Sr,Sr),270)

end

%变换结束--------------------------------------------------------------------

RBlocks(k,:,:)=RandDbests(k)*DBlocksReduce(l,:,:)+RandDbesto(k)

%生成R---------------------------

Image3((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr)=reshape(RBlocks(k,:,:),Sr,Sr)%更新迭代图象

end

end

wucha=double(Image1)-Image3%误差图

Ps1(L)=20*log10(255/(sqrt(mean(mean(wucha.^2)))))

PSNR=psnr(wucha)

figure

imshow(uint8(Image3))

end

toc

figure

wucha=uint8(wucha)

imshow(wucha)

figure

imshow(uint8(Image1)),title('原图')

save('sa.mat')

zhifangtu(wucha)%%%%分形主函数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%

子函数:1:

function b=suoxiao(filename,bili)

a=imread(filename)

a=double(a)

[m,n]=size(a)

i=1

while i=m/bili

j=1

while j=n/bili

k=mean(mean(a(bili*(i-1)+1:bili*(i-1)+bili,bili*(j-1)+1:bili*(j-1)+bili)))

b(i,j)=k

j=j+1

end

i=i+1

end

%b=uint8(b)

size(b)

%imshow(b)

子函数2:

%clc

function zhifangtu(a)

J=a

%计算灰度图象的直方图数据,a为如象数组

L=256 %灰度级

Ps = zeros(L,1) %统计直方图结果数据

nk=zeros(L,1)

[row,col]=size(a)

n=row*col %总像素个数

for i = 1:row

for j = 1:col

num = double(a(i,j))+1 %获取像素点灰度级

nk(num) = nk(num)+1 %统计nk

end

end

%计算直方图概率估计

for i=1:L

Ps(i)=nk(i)/n

end

figure

subplot(3,1,1)imshow(J),title('误差图')

subplot(3,1,2),plot(nk),title('直方图(nk)')

subplot(3,1,3),plot(Ps),title('直方图(Ps)')

子函数3:

function PSNR=psnr(a)

[m,n]=size(a)

a=uint8(a)

a=double(a)

imagesize=m*n

MSE=sum(dot(a,a))/ imagesize

PSNR=10*log10(255^2/MSE)

%%%%%%%%%%%%%%%%%%%%%%

说明:

1、因为本程序时间长,FX中先选择图片的大小

2、编码与解码

3、做误差图和只方图

4:画出每次迭代的解码图象

假设你的二值图像变量为“bw”,则数值为“1”的像素个数(设羡正变量“numVal_1”)是: numVal_1 = sum(sum(bw))连用两次sum是将图像中数值的行和列分别加在一起,就可求出告胡像素为1的总数。 要求数值为“0”的像素兄友悔数(设变量“numVal_0”)可以这样: numVa.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8255075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存