图像分裂合并的matlab实现
包含四段程序clear;
I=imread('xingshi32.bmp');
if(isgray(I)==0)
disp('请输入灰度图像,本程序用来处理128 *128的灰度图像!');
else
if (size(I)~=)
disp('图像的大小不合程序要求!');
else
H.color=;%设置白的画布
figure(H);imshow(I);
title('原图像');
zeroImage=repmat(uint8(0),);
figure(H); %为分裂合并后显示的图设置画布
meansImageHandle=imshow(zeroImage);
title('块均值图像');
%%%%%设置分裂后图像的大小由于本图采用了128像素的图
blockSize=;
%%设置一个S稀疏矩阵用于四叉树分解后存诸数据
S=uint8(128);
S(128,128)=0;
threshold=input('请输入分裂的阈值(0--1):');%阈值
threshold=round(255*threshold);
M=128;dim=128;
tic
%%%%%%%%%%%%%%%%% 分裂主程序%%%%%%%%%%%
while (dim>1)
= 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, );
if(isempty(Sind))
%已完成
break;
end
=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=;
S(Sind)=dim;
end
=find(S);% 用来寻找四叉机分解结果中大小为S的块的位置
set(meansImageHandle,'CData',ComputeMeans(I,S)); % 显示分解结果块均值图像
Numberofbloks=length(i);%计算块数
%sizev=size(v);
end
end
toc function means = ComputeMeans(I, S)
% 用来计算给定图像和稀疏矩阵的块均值
%I: 为给定的图像
%S: 为稀疏矩阵
means = I;
for dim = ;
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 function = getblk(A,S,dim)
% I:为待处理的图像
% S:为四叉树分解后返回的稀疏矩阵包含四叉树结构
% Val是dim * dim*k数组, 包含图像I的四叉树分解中的每个 dim *dim 块
% k是四叉树分解的dim *dim块的数量
% 如果没有指定大小的块那么返回一个空矩阵
= 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, ); function B = setblk(A,S,dim,val)
% I 为待处理的图像
% S:为四叉树分解后的稀疏矩阵包含四叉树结构
% Val:是dim * dim *k数组
% K :是四叉树分解的dim * dim 大小块的个数
% setblk : 用val中相应的dim * dim块的值取代图像 A 的四叉树分解中的每个
% dim *dim块
= size(A);
blocks = find(S == dim)';
numBlocks = length(blocks);
if (~isequal(, ))
if (prod(size(val)) == numBlocks)
val = repmat(val(:)',);
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; 事例图片
请教happy
看到你的程序,颇有启发,能否请教一个问题,我也在用这个方法进行图像的分割,分裂后,对于相同或相近属性区域的合并,不知在哪儿下手。你的好像是对每个区域求平均灰度值,但如果我的逻辑谓词改为:if 两个邻接区域的灰度平均值之差小于閾值则两区域给定相同的标记,那么在matlab里如何实现呢。 祈祷你快快回复阿。 谢谢分享! 您好,我运行了下这个程序,到set(meansImageHandle,'CData',ComputeMeans(I,S)); 就运行不通了,说ComputeMeans不能识别。求指教谢谢 回复 8 # chenjuan_li 的帖子Ref: 常见的程序出错问题整理 http://forum.vibunion.com/thread-46001-1-1.html
3F->Undefined function or variable "a"
From http://forum.vibunion.com/home-space-uid-63979-do-blog-id-18250.html
页:
[1]