声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4907|回复: 17

[综合讨论] 如何在MATLAB中求多尺度结构元素问题

[复制链接]
发表于 2008-4-5 16:54 | 显示全部楼层 |阅读模式

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

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

x
我在学数学形态学,其中有一个多尺度形态学的。其理论是:大尺度的结构元素由小尺度的结构多次膨胀得到。
但我在用imdilate对小尺度的结构元素做膨胀时,总是出错。不知道为什么。
如下:
se=strel([0,1,0;1,0,1;0,1,0]);
se1=imdilate(se,se);


这样的话就是出错,那就是不对了。请问谁知道该怎么得到大尺度的结构元素啊?谢谢!

[ 本帖最后由 eight 于 2008-4-7 16:01 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-4-5 18:11 | 显示全部楼层

回复 楼主 的帖子

什么错误
有错误提示吗
 楼主| 发表于 2008-4-5 19:48 | 显示全部楼层
出现了下面的错误。但我还是不知道怎么实现。头大了!!
??? Error using ==> images\private\checkinput>check_classes
Function IMDILATE expected its first input argument, IM,
to be one of these types:

  logical, uint8, int8, uint16, int16, uint32, int32, single, double

Instead its type was strel.

Error in ==> images\private\checkinput at 35
check_classes(A, classes, function_name, variable_name, argument_position);

Error in ==> images\private\morphop>CheckInputImage at 254
checkinput(A, {'numeric' 'logical'}, {'real' 'nonsparse'}, ...

Error in ==> images\private\morphop>ParseInputs at 102
A = CheckInputImage(A, func_name);

Error in ==> images\private\morphop at 14
[A,se,pre_pad,...

Error in ==> imdilate at 121
B = morphop(A,se,'dilate',mfilename,varargin{:});
 楼主| 发表于 2008-4-5 21:36 | 显示全部楼层
问题已解决。
发表于 2008-4-6 08:25 | 显示全部楼层
可以说说怎么解决的么?

我正在研究数学形态学呢。:handshake
 楼主| 发表于 2008-4-6 12:57 | 显示全部楼层
因为strel函数的第一个参数必须是浮点型或者是整型,而我的se不是啊,所以在做膨胀的时候可以根据形态学的性质,运用结合律,先用结构元素去膨胀图像1,得到图像2,在下一个尺度下,用结构元素去膨胀2,再得到3。
可是看别人的论文上说是多尺度结构元素是用基本结构元素自我膨胀得到,但问题是IMDILATE函数的第一个参数不能是STREL结构的啊,我还是想不出来怎么解决这个问题。哪位大侠帮帮忙,怎么得到多尺度的结构元素啊?谢谢啦!qq:182544257。

[ 本帖最后由 francisfang 于 2008-4-6 16:31 编辑 ]
发表于 2008-4-7 16:01 | 显示全部楼层
原帖由 francisfang 于 2008-4-6 12:57 发表
因为strel函数的第一个参数必须是浮点型或者是整型,而我的se不是啊,所以在做膨胀的时候可以根据形态学的性质,运用结合律,先用结构元素去膨胀图像1,得到图像2,在下一个尺度下,用结构元素去膨胀2,再得到3。
可 ...
试试强制类型转换
 楼主| 发表于 2008-4-8 08:37 | 显示全部楼层
不能啊,没有办法转换。唉!急!!!:@Q
发表于 2008-4-8 10:29 | 显示全部楼层
原帖由 francisfang 于 2008-4-8 08:37 发表
不能啊,没有办法转换。唉!急!!!:@Q


:'(  哥们儿,我也急了好久了,跟你一样的问题,一直没法解决,叫天天不应叫地地不灵
 楼主| 发表于 2008-4-8 20:36 | 显示全部楼层
是啊。论文上都是那么说的,但具体怎么实现就不知道了。
 楼主| 发表于 2008-4-10 15:46 | 显示全部楼层
版主,帮帮忙啊,我找了很久了,可还是找不到答案,:'( 。谢谢了!!
发表于 2008-4-22 15:38 | 显示全部楼层
see=[0,1,0;1,0,1;0,1,0];
se=strel(see);
se1=imdilate(see,se);

这样呢?
 楼主| 发表于 2008-4-24 10:13 | 显示全部楼层
这样也不行,膨胀几次就不变化了,因为你的see是固定大小的。
发表于 2008-5-19 14:24 | 显示全部楼层
:'( :'( :'( :'( :'( :'( :'( :'( :'( :'( :'( :'( :'( :'( :'( :'( 还没有解决呀
发表于 2008-5-20 11:13 | 显示全部楼层

回复 13楼 的帖子

我觉得可能是这样的:根据数学形态学的理论,图像A被结构元素B膨胀后,图像A的size应该是会变大的,但是imdilate这个命令可能剪切掉了膨胀的边缘,并没有使图像A变大。对于多结构元素来说,显然实现不了大尺度的结构元素。我想有两种途径:
1.不要用matlab自带的膨胀命令,根据膨胀运算规则自己编写
2.如果一定要用imdilate的话,比如你想以[0 1 0; 1 0 1; 0 1 0]为单位结构元素(此时尺度为1)求取尺度为5以内的多尺度结构元素时,可以这样:
scale = 5;                                    % the largest scale of the struct element
nhood = [0 1 0; 1 0 1; 0 1 0];      % the size of the unit struct element
size_unit = size(nhood,1);
size_largest = size_unit + (scale-1)*(size_unit-1); % the size of the largest struct element
bm = zeros(size_largest);           % image
bm(5,6) = 1; bm(7,6) = 1;bm(6,5) = 1; bm(6,7) = 1;
se1 = strel(nhood);                     % unit struct element
se2 = imdilate(bm,se1);
se3 = imdilate(se2,se1);
se4 = imdilate(se3,se1);
se5 = imdilate(se4,se1);
尺度为2、3、4、5的结构元素虽然从大小上来看都是为11的方阵,但是因为其中元素为“1”的个数不同,是可以起到多尺度元素的作用的
话比较啰嗦,代码也不精炼,不知道我表达清楚了没有?

[ 本帖最后由 mulan 于 2008-5-20 11:14 编辑 ]

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-17 15:58 , Processed in 0.061833 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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