声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6750|回复: 8

[共享资源] 图像分裂合并的matlab实现

[复制链接]
发表于 2006-11-27 11:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
包含四段程序

  1. clear;
  2. I=imread('xingshi32.bmp');

  3. if(isgray(I)==0)
  4.     disp('请输入灰度图像,本程序用来处理128 *128的灰度图像!');
  5. else
  6.   if (size(I)~=[128,128])
  7.       disp('图像的大小不合程序要求!');
  8.   else
  9. H.color=[1 1 1];  %设置白的画布
  10. figure(H);imshow(I);
  11. title('原图像');  
  12. zeroImage=repmat(uint8(0),[128 128]);
  13. figure(H);        %为分裂合并后显示的图设置画布
  14. meansImageHandle=imshow(zeroImage);
  15. title('块均值图像');
  16. %%%%%设置分裂后图像的大小由于本图采用了128像素的图
  17. blockSize=[128 64 32 16 8 4 2];
  18. %%设置一个S稀疏矩阵用于四叉树分解后存诸数据
  19. S=uint8(128);
  20. S(128,128)=0;  
  21. threshold=input('请输入分裂的阈值(0--1):');%阈值
  22. threshold=round(255*threshold);
  23. M=128;dim=128;
  24. tic
  25. %%%%%%%%%%%%%%%%% 分裂主程序%%%%%%%%%%%
  26. while (dim>1)
  27.     [M,N] = size(I);

  28.     Sind = find(S == dim);
  29.     numBlocks = length(Sind);
  30. if (numBlocks == 0)
  31.     %已完成
  32.     break;
  33. end
  34.   rows = (0:dim-1)';
  35.   cols = 0:M:(dim-1)*M;
  36.   rows = rows(:,ones(1,dim));
  37.   cols = cols(ones(dim,1),:);
  38.   ind = rows + cols;
  39.   ind = ind(:);


  40. tmp = repmat(Sind', length(ind), 1);
  41. ind = ind(:, ones(1,numBlocks));
  42. ind = ind + tmp;

  43. blockValues= I(ind);
  44. blockValues = reshape(blockValues, [dim dim numBlocks]);

  45.     if(isempty(Sind))
  46.         %已完成
  47.         break;
  48.     end
  49.     [i,j]=find(S);
  50.     set(meansImageHandle,'CData',ComputeMeans(I,S));
  51.     maxValues=max(max(blockValues,[],1),[],2);
  52.     minValues=min(min(blockValues,[],1),[],2);
  53.     doSplit=(double(maxValues)-double(minValues))>threshold;
  54.     dim=dim/2;
  55.     Sind=Sind(doSplit);
  56.     Sind=[Sind;Sind+dim;(Sind+M*dim);(Sind+(M+1)*dim)];
  57.     S(Sind)=dim;
  58. end
  59. [i,j]=find(S);  % 用来寻找四叉机分解结果中大小为S的块的位置
  60. set(meansImageHandle,'CData',ComputeMeans(I,S));   % 显示分解结果块均值图像
  61. Numberofbloks=length(i);  %计算块数
  62. %sizev=size(v);
  63. end
  64. end
  65. toc
复制代码
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-11-27 11:17 | 显示全部楼层
  1. function means = ComputeMeans(I, S)
  2. % 用来计算给定图像和稀疏矩阵的块均值
  3. %  I: 为给定的图像
  4. %  S: 为稀疏矩阵
  5.   means = I;
  6.   for dim = [128 64 32 16 8 4 2 1];
  7.     values = getblk(I, S, dim);
  8.   
  9.     if (~isempty(values))
  10.        %%%%%以下的句子是将小块的平均值来代替原图像中相应的块处的像素%%%%
  11.        if (min(min(values))>=60)  
  12.            means = setblk(means, S, dim, 0);  %用于合并时的阈值
  13.        else   
  14.           %means = setblk(means, S, dim, sum(sum(values,1),2) ./ dim^2+std2(values));
  15.        %means = setblk(means, S, dim, sum(sum(values,1),2) ./ dim^2);
  16.         %means = setblk(means, S, dim, mean2(values));
  17.          means = setblk(means, S, dim, max(max(values,1),2));
  18.       
  19.     end
  20.   end
  21. end
复制代码
 楼主| 发表于 2006-11-27 11:17 | 显示全部楼层
  1. function [val,r,c] = getblk(A,S,dim)
  2. % I:为待处理的图像
  3. % S:为四叉树分解后返回的稀疏矩阵包含四叉树结构
  4. % Val是dim * dim*k数组, 包含图像I的四叉树分解中的每个 dim *dim 块
  5. % k是四叉树分解的dim *dim块的数量
  6. % 如果没有指定大小的块那么返回一个空矩阵
  7. [M,N] = size(A);

  8. Sind = find(S == dim);
  9. numBlocks = length(Sind);
  10. if (numBlocks == 0)   % 没有找到任何模块
  11.     val = zeros(dim,dim,0);  % 返回空矩阵
  12.     r = zeros(0,1);
  13.     c = zeros(0,1);
  14.     return;
  15. end

  16. % 为dim *dom的块计算索引%%%%%%%%%%%%%%%%%
  17. rows = (0:dim-1)';
  18. cols = 0:M:(dim-1)*M;
  19. rows = rows(:,ones(1,dim));
  20. cols = cols(ones(dim,1),:);
  21. ind = rows + cols;
  22. ind = ind(:);

  23. % 计算索引矩阵
  24. tmp = repmat(Sind', length(ind), 1);
  25. ind = ind(:, ones(1,numBlocks));
  26. ind = ind + tmp;

  27. val = A(ind);

  28. val = reshape(val, [dim dim numBlocks]);
复制代码
 楼主| 发表于 2006-11-27 11:18 | 显示全部楼层
  1. function B = setblk(A,S,dim,val)
  2. % I 为待处理的图像
  3. % S:为四叉树分解后的稀疏矩阵包含四叉树结构
  4. % Val:是dim * dim *k数组
  5. % K :是四叉树分解的dim * dim 大小块的个数
  6. % setblk : 用val中相应的dim * dim块的值取代图像 A 的四叉树分解中的每个
  7. % dim *dim  块
  8. [M,N] = size(A);

  9. blocks = find(S == dim)';
  10. numBlocks = length(blocks);
  11. if (~isequal([size(val,1) size(val,2) size(val,3)], [dim dim numBlocks]))
  12.     if (prod(size(val)) == numBlocks)
  13.       
  14.         val = repmat(val(:)',[dim^2 1]);
  15.       
  16.     end
  17. end
  18. val = val(:);
  19. % 为每一个块算出一个索引
  20. rows = (0:dim-1)';
  21. cols = 0:M:(dim-1)*M;
  22. rows = rows(:,ones(1,dim));
  23. cols = cols(ones(dim,1),:);
  24. ind = rows + cols;
  25. ind = ind(:);

  26. % 依照索引进行替换%%%%%
  27. blocks = blocks(ones(length(ind),1),:);
  28. ind = ind(:, ones(1,numBlocks));
  29. ind = ind + blocks;

  30. B = A;
  31. B(ind) = val;
复制代码
 楼主| 发表于 2006-11-27 11:18 | 显示全部楼层
事例图片
xingshi32.bmp
发表于 2006-12-21 11:01 | 显示全部楼层

请教happy

看到你的程序,颇有启发,能否请教一个问题,我也在用这个方法进行图像的分割,分裂后,对于相同或相近属性区域的合并,不知在哪儿下手。你的好像是对每个区域求平均灰度值,但如果我的逻辑谓词改为:if 两个邻接区域的灰度平均值之差小于閾值  则两区域给定相同的标记,那么在matlab里如何实现呢。 祈祷你快快回复阿。
发表于 2009-4-8 13:57 | 显示全部楼层
谢谢分享!
发表于 2012-3-9 19:11 | 显示全部楼层
您好,我运行了下这个程序,到set(meansImageHandle,'CData',ComputeMeans(I,S));   就运行不通了,说ComputeMeans不能识别。求指教谢谢
发表于 2012-3-13 00:19 | 显示全部楼层
回复 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-s ... -blog-id-18250.html
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-23 11:15 , Processed in 0.097338 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表