24小时热门版块排行榜    

CyRhmU.jpeg
查看: 952  |  回复: 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):您能说的详细些吗 这些数据在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的回帖

string121

金虫 (小有名气)

你给的数据其实是1D的. 前面不是给你代码了吗?
Matlab code,e.g:
clc;clear;
row=9;col=9;dep=9;%维数
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.
for i=min(S():max(S()
BW=S==i;   %生成二值图。
[L,num]=bwlabeln(BW,26);%检测连通分量。按你的要求应该是26连通.
%num:连通分量个数.
for j=1:num
L_num(j)=length(find(L==j)); %计算个数。
end
%输入显示
fprintf(['值为 ' num2str(i) ' 的连通区域共有%d个,分布个数为\n'],num);
for k=1:num
    fprintf(['连通分量' num2str(k) ': %d个\n'],L_num(k));
end
fprintf('\n');
end


将dep设为1,看看2D下是不是你要的.
5楼2009-11-14 11:30:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

string121

金虫 (小有名气)

是 : )
6楼2009-11-14 11:32:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tc1788

铁虫 (小有名气)

引用回帖:
Originally posted by string121 at 2009-11-14 11:30:
你给的数据其实是1D的. 前面不是给你代码了吗?
Matlab code,e.g:
clc;clear;
row=9;col=9;dep=9;%维数
x=1:row; %x坐标值,正整数,不是的话转化(平移,伸缩)一下。
y=1:col; %y坐标值
z=1:dep; %z坐标值
S ...

您好 我试了一下有点问题 您给看看
S=[0        0        0        1
1        0        0        1
2        0        0        0
0        1        0        1
1        1        0        0
2        1        0        1
0        2        0        0
1        2        0        1
2        2        0        1
];
clc;clear;
row=9;col=9;dep=9;%维数
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.
for i=min(S():max(S()
BW=S==i;   %生成二值图。
[L,num]=bwlabeln(BW,26);%检测连通分量。按你的要求应该是26连通.
%num:连通分量个数.
for j=1:num
L_num(j)=length(find(L==j)); %计算个数。
end
%输入显示
fprintf(['值为 ' num2str(i) ' 的连通区域共有%d个,分布个数为\n'],num);
for k=1:num
    fprintf(['连通分量' num2str(k) ': %d个\n'],L_num(k));
end
fprintf('\n');
end>>
??? for i=min(S():max(S()
                  |
Error: Unbalanced or unexpected parenthesis or bracket.
我是超级菜鸟了 谢谢您给予指点啊

[ Last edited by tc1788 on 2009-11-17 at 14:05 ]
7楼2009-11-17 13:54:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

string121

金虫 (小有名气)

就笑脸的地方是冒号括号: ).
下面的可以直接粘贴到命令窗口了.
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.
for i=min(min(min(S))):max(max(max(S)))
BW=S==i;   %生成二值图。
[L,num]=bwlabeln(BW,26);%检测连通分量。按你的要求应该是26连通.
%num:连通分量个数.
for j=1:num
L_num(j)=length(find(L==j)); %计算个数。
end
%输出显示
fprintf(['值为 ' num2str(i) ' 的连通区域共有%d个,分布个数为\n'],num);
for k=1:num
    fprintf(['连通分量' num2str(k) ': %d个\n'],L_num(k));
end
fprintf('\n');
end
8楼2009-11-17 19:12:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

string121

金虫 (小有名气)

引用回帖:
Originally posted by tc1788 at 2009-11-17 13:54:

您好 我试了一下有点问题 您给看看
S=[0        0        0        1
1        0        0        1
2        0        0        0
0        1        0        1
1        1        0        0
2        1        0        1
0        2        0        0
1        2        0        1
2        2        0        1
];
clc;clear;
row=9;col=9;dep=9;%维数
x=1:row; %x坐标值,正整数,不是的 ...

放错地方了. 你注意看我开始的.
9楼2009-11-17 19:26:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

liliang9425

铜虫 (小有名气)

我做的都是二维的图像
10楼2009-11-17 20:05:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 tc1788 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见