图像分裂合并的matlab实现.docx
- 文档编号:1309057
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:4
- 大小:11.34KB
图像分裂合并的matlab实现.docx
《图像分裂合并的matlab实现.docx》由会员分享,可在线阅读,更多相关《图像分裂合并的matlab实现.docx(4页珍藏版)》请在冰点文库上搜索。
图像分裂合并的matlab实现
包含四段程序
CODE1:
clear;
I=imread('xingshi32.bmp');
if(isgray(I)==0)
disp('请输入灰度图像,本程序用来处理128*128的灰度图像!
');
else
if(size(I)~=[128,128])
disp('图像的大小不合程序要求!
');
else
H.color=[111]; %设置白的画布
figure(H);imshow(I);
title('原图像');
zeroImage=repmat(uint8(0),[128128]);
figure(H); %为分裂合并后显示的图设置画布
meansImageHandle=imshow(zeroImage);
title('块均值图像');
%%%%%设置分裂后图像的大小由于本图采用了128像素的图
blockSize=[128643216842];
%%设置一个S稀疏矩阵用于四叉树分解后存诸数据
S=uint8(128);
S(128,128)=0;
threshold=input('请输入分裂的阈值(0--1):
');%阈值
threshold=round(255*threshold);
M=128;dim=128;
tic
%%%%%%%%%%%%%%%%%分裂主程序%%%%%%%%%%%
while(dim>1)
[M,N]=size(I);
Sind=find(S==dim);
numBlocks=length(Sind);
if(numBlocks==0)
%已完成
break;
end
rows=(0:
dim-1)';
cols=0:
M:
(dim-1)*M;
rows=rows(:
ones(1,dim));
cols=cols(ones(dim,1),:
);
ind=rows+cols;
ind=ind(:
);
tmp=repmat(Sind',length(ind),1);
ind=ind(:
ones(1,numBlocks));
ind=ind+tmp;
blockValues=I(ind);
blockValues=reshape(blockValues,[dimdimnumBlocks]);
if(isempty(Sind))
%已完成
break;
end
[i,j]=find(S);
set(meansImageHandle,'CData',ComputeMeans(I,S));
maxValues=max(max(blockValues,[],1),[],2);
minValues=min(min(blockValues,[],1),[],2);
doSplit=(double(maxValues)-double(minValues))>threshold;
dim=dim/2;
Sind=Sind(doSplit);
Sind=[Sind;Sind+dim;(Sind+M*dim);(Sind+(M+1)*dim)];
S(Sind)=dim;
end
[i,j]=find(S); %用来寻找四叉机分解结果中大小为S的块的位置
set(meansImageHandle,'CData',ComputeMeans(I,S));%显示分解结果块均值图像
Numberofbloks=length(i); %计算块数
%sizev=size(v);
end
end
toc
CODE2:
functionmeans=ComputeMeans(I,S)
%用来计算给定图像和稀疏矩阵的块均值
% I:
为给定的图像
% S:
为稀疏矩阵
means=I;
fordim=[1286432168421];
values=getblk(I,S,dim);
if(~isempty(values))
%%%%%以下的句子是将小块的平均值来代替原图像中相应的块处的像素%%%%
if(min(min(values))>=60)
means=setblk(means,S,dim,0); %用于合并时的阈值
else
%means=setblk(means,S,dim,sum(sum(values,1),2)./dim^2+std2(values));
%means=setblk(means,S,dim,sum(sum(values,1),2)./dim^2);
%means=setblk(means,S,dim,mean2(values));
means=setblk(means,S,dim,max(max(values,1),2));
end
end
end
CODE3:
function[val,r,c]=getblk(A,S,dim)
%I:
为待处理的图像
%S:
为四叉树分解后返回的稀疏矩阵包含四叉树结构
%Val是dim*dim*k数组,包含图像I的四叉树分解中的每个dim*dim块
%k是四叉树分解的dim*dim块的数量
%如果没有指定大小的块那么返回一个空矩阵
[M,N]=size(A);
Sind=find(S==dim);
numBlocks=length(Sind);
if(numBlocks==0)%没有找到任何模块
val=zeros(dim,dim,0); %返回空矩阵
r=zeros(0,1);
c=zeros(0,1);
return;
end
%为dim*dom的块计算索引%%%%%%%%%%%%%%%%%
rows=(0:
dim-1)';
cols=0:
M:
(dim-1)*M;
rows=rows(:
ones(1,dim));
cols=cols(ones(dim,1),:
);
ind=rows+cols;
ind=ind(:
);
%计算索引矩阵
tmp=repmat(Sind',length(ind),1);
ind=ind(:
ones(1,numBlocks));
ind=ind+tmp;
val=A(ind);
val=reshape(val,[dimdimnumBlocks]);
CODE4:
functionB=setblk(A,S,dim,val)
%I为待处理的图像
%S:
为四叉树分解后的稀疏矩阵包含四叉树结构
%Val:
是dim*dim*k数组
%K:
是四叉树分解的dim*dim大小块的个数
%setblk:
用val中相应的dim*dim块的值取代图像A的四叉树分解中的每个
%dim*dim 块
[M,N]=size(A);
blocks=find(S==dim)';
numBlocks=length(blocks);
if(~isequal([size(val,1)size(val,2)size(val,3)],[dimdimnumBlocks]))
if(prod(size(val))==numBlocks)
val=repmat(val(:
)',[dim^21]);
end
end
val=val(:
);
%为每一个块算出一个索引
rows=(0:
dim-1)';
cols=0:
M:
(dim-1)*M;
rows=rows(:
ones(1,dim));
cols=cols(ones(dim,1),:
);
ind=rows+cols;
ind=ind(:
);
%依照索引进行替换%%%%%
blocks=blocks(ones(length(ind),1),:
);
ind=ind(:
ones(1,numBlocks));
ind=ind+blocks;
B=A;
B(ind)=val;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 分裂 合并 matlab 实现