24小时热门版块排行榜    

CyRhmU.jpeg
查看: 948  |  回复: 20
当前主题已经存档。
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

tc1788

铁虫 (小有名气)

[交流] 【求助】类似于“二值图像的标识“的问题

我有一三维图,想统计特定的点(1或2或3)的相邻情况,如果相邻有多少个相邻。相邻意味着坐标点之间距离有一个定值(通过xyz x‘y’z’计算)。我现在有一个Excell表 里面有点的坐标 xyz 及点的类型。例如下面的123代表类型 二维排列是这样。可以说两个3相邻,5个2相邻,5个1中 3个1邻为一组,2个1邻为一组。我想统计我的立体图中有几组由2组成的小组,几组由3组成的一组等等。
1 1 1 2
2 3 2 2
3 2 1 1
我没接触过图像,专业术语也不懂。请大家给予提示帮助(我只看过这和二值图像的标识别类似,但标识没介绍具体内容 我不知道怎么实现这个统计)。有没有这方面的代码。
先谢谢大家的帮助
例如 矩阵里面是m*4的内容,前三个是xyz第四列是类型。是一个三维立体图形,如何统计呢 只需要统计各个类型在三维中是如何连通的。
例如
x y z m
0 0 1 2
0 0 2 3
0 0 3 4
0 0 4 3
0 0 5 3
0 0 6 3
0 0 7 2
0 0 8 1

[ Last edited by tc1788 on 2009-11-12 at 20:47 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

string121

金虫 (小有名气)


tc1788(金币+1,VIP+0):谢谢!!! 12-7 18:56
引用回帖:
Originally posted by string121 at 2009-11-28 12:59:

你要熟悉图像的二值运算这个是不难的.
两种方式可处理:
1. 修改处于边缘连通分量的记数及标记. 用imfill(BW,'holes')就可以间接实现.
2. 直接修改找连通区域的算法bwlabel. 找本讲形态学处理的书看懂找连通 ...

抽空写了下code, 有些地方写的不好,但能解决你的问题:

clc;clear;
row=9;col=9;dep=1;%维数
x=1:row; %x坐标值,正整数,不是的话转化(平移,伸缩)一下。
y=1:col; %y坐标值
z=1:dep; %z坐标值
Sample=reshape(round(1+2*rand(row*col*dep,1)),[row,col,dep]);%产生
%1-3之间的随机整数。
S(x,y,z)=Sample(x,y,z)%生成S.

if size(S,3)==1
    padvec=[1 1];
else
    padvec=[1 1 1];
end

for i=min(min(min(S))):max(max(max(S)))
  BW=S==i;   %生成二值图。
  [L1,num1]=bwlabeln(BW,26); %找连通区域。
  %以下用于处理周期边值下边界连通区域的合并。
  L2=padarray(L1,padvec,0);
  L3=padarray(L1,padvec,'circular'); %周期延拓一个像素。
  BW1=padarray(BW,padvec,'circular');
  L4=bwlabeln(BW1,26);
  BW2=padarray(BW,padvec,0);
  ind1=find(BW1-BW2==1); % 找到可能需要合并的连通区域的位置。
  for j=1:length(ind1)
     a=ind1(j);
     ind2=find(L4==L4(a));
     if length(ind2)~=1
         b=unique(L3(ind2));
         for k=1:length(b)
             c=b(k);
             L2(L2==c)=b(1);
         end
     end  
  end

  num=0;
  for j=1:max(max(max(L2)));
     area=length(find(L2==j));
     if area~=0
        num=num+1;
        L_num(num)=area; %计算个数。
     end
  end
  %输出显示
  fprintf(['值为 ' num2str(i) ' 的连通区域共有%d个,分布个数为\n'],num);
  for k=1:num
    fprintf(['连通分量' num2str(k) ': %d个\n'],L_num(k));
  end
  fprintf('\n');
end

你要处理的3D数据量很大的话中间那几段for改用mex文件.
16楼2009-11-28 15:51:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 21 个回答

string121

金虫 (小有名气)


tc1788(金币+1,VIP+0):您能说的详细些吗 这些数据在excell表里 我是不是要把它变成图像 还是看数据就你能做 我想要数数个数怎么计数 11-11 14:01
找同一标记相邻情况:
就是几何性质中的连通分量. 用matlab几个find与bwlabeln就可以实现.
不同标记的相邻可以通过处理转化为前一种情况.
2楼2009-11-11 13:28:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tc1788

铁虫 (小有名气)

引用回帖:
Originally posted by string121 at 2009-11-11 13:28:
找同一标记相邻情况:
就是几何性质中的连通分量. 用matlab几个find与bwlabeln就可以实现.
不同标记的相邻可以通过处理转化为前一种情况.

您能说的详细些吗 这些数据在excell表里 我是不是要把它变成图像 还是看数据就你能做 我想要数数个数怎么计数
3楼2009-11-11 13:38:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

string121

金虫 (小有名气)

★ ★ ★ ★ ★ ★
tc1788(金币+2,VIP+0):先谢谢你了 我去试试 11-12 10:03
tc1788(金币+1,VIP+0):谢谢,我试过了 可能我的问题没有描述明白 我想重新描述一下 您看看您的程序是不是可以针对它使用 11-12 19:57
bslt(金币+3,VIP+0):感谢热心回复,欢迎常来! 11-14 10:12
图像只是数据的一种表现形式,有数据就行.
e.g. Matlab处理:
1. 用函数xlsread将excel表格中的数据读进matlab,构成一个3D矩阵S. S的三个维分别代表x,y,z. S的元素是1,2,3之类的. 如果你的数据x,y,z不是正整数得做点坐标转化.
2. 比喻检测3的连通性.
ind=find(S==3);
BW=repmat(false,size(S));
BW(ind)=true;
[L,num]=bwlabeln(BW,26);%按你的要求应该是26l连通. num:连通分量个数.
for j=1:num
L_num(j)=length(find(L==j));
end

上述结果num表示连在一起的3有num组. 第j组有L_num(j)个3.
我没有具体数据,不知道对不对. 试试就知道了.
4楼2009-11-11 17:27:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复(可上传附件)
信息提示
请填处理意见