Matlab中关于函数bwlabel(I_bw,8)和函数bwboundaries(I_bw,'noholes')问题 高手进来帮忙看看吧 谢谢了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab中关于函数bwlabel(I_bw,8)和函数bwboundaries(I_bw,'noholes')问题 高手进来帮忙看看吧 谢谢了相关的知识,希望对你有一定的参考价值。

我用[L,num] = bwlabel(I_bw,8);函数求出连通区域num数 又用 B = bwboundaries(I_bw,'noholes')函数提取了连通区域的边界,可num数不等于size(B)的大小 num数为169, size(B)为135 请问 这是为什么 怎么解决 拜谢了
那B中存放的应该是每一个连通区域的边界值? size(B)之后求出的是1区域+2区域边界的长度对么?我不太明白 ,请教!

BW =
1 1 1 0 0 0 0 0
1 1 1 0 1 1 0 0
1 1 1 0 1 1 0 0
1 1 1 0 0 0 1 0
1 1 1 0 0 0 1 0
1 1 1 0 0 0 1 0
1 1 1 0 0 1 1 0
1 1 1 0 0 0 0 0
>> [L,num] = bwlabel(BW,8)
L =
1 1 1 0 0 0 0 0
1 1 1 0 2 2 0 0
1 1 1 0 2 2 0 0
1 1 1 0 0 0 2 0
1 1 1 0 0 0 2 0
1 1 1 0 0 0 2 0
1 1 1 0 0 2 2 0
1 1 1 0 0 0 0 0%%%对连通区域进行标记
num =
2 %%连通区域数目
>> B = bwboundaries(BW,'noholes')
B =
[19x2 double]
[14x2 double]%%%%B返回的是连通区域中边界的像素数,你的size(B),怎么会是135?
你把你的图像传上来,我看看!
参考技术A 如果B是一个矩阵的话,size返回的是B的行列的个数。

matlab中关于S-fun的调用以及子系统的封装

近日学习matlab建模方面的东西,mark一个网站:http://wtclab.net/txfz/jkmulu.html,邵玉斌老师的教案。

本篇记录一个包含S函数的子系统的建立和封装,用S函数产生任意正弦波。

matlab版本:R2017b

 

步骤如下:

①首先建立主系统模型。在命令行窗口输入simulink,在弹出的窗口中新建Blank Model,接着点击simulink工具栏的Library Browser,从中选取模块搭建主系统模型,如下图。

技术分享图片

接着,双击Subsystem搭建子系统内部模型,如下图。

技术分享图片

②系统模型搭建好之后,新建M文件编写S函数,示例代码如下。(注意:函数名需与M文件名一致。)

技术分享图片
function [sys,x0,str,ts] =example1Sfun(t,x,u,flag,Amp,Freq,Phase) 
% 正弦波信号源
switch flag 
    case 0       % flag=0 初始化 
       [sys,x0,str,ts]=mdlInitializeSizes; 
    case 3       % flag=3 计算输出 
       sys=mdlOutputs(t,Amp,Freq,Phase); 
    case {1, 2, 4, 9 }    % 其他作不处理的flag 
       sys=[];            % 无用的flag时返回sys为空矩阵
otherwise % 异常处理 
       error([Unhandled flag = ,num2str(flag)]); 
end 
% 主函数结束 
% 子函数实现(1)初始化函数----------------------------------
function [sys,x0,str,ts] = mdlInitializeSizes  % 
sizes = simsizes;           % 获取SIMULINK仿真变量结构
sizes.NumContStates  = 0;   % 连续系统的状态数为0
sizes.NumDiscStates  = 0;   % 离散系统的状态数为0
sizes.NumOutputs     = 1;   % 输出信号数目是1 
sizes.NumInputs      = 0;   % 输入信号数目是0
sizes.DirFeedthrough = 0;   % 该系统不是直通的 
sizes.NumSampleTimes = 1;   % 这里必须为1 
sys = simsizes(sizes); 
str = [];           % 通常为空矩阵 
x0  = [];           % 初始状态矩阵x0 (零状态情况) 
ts  = [0 0];        % 表示连续取样时间的仿真
% 初始化函数结束 

% 子函数实现(2)系统输出方程函数-----------------------------
function sys = mdlOutputs(t,Amp,Freq,Phase) 
sys = Amp*sin(2*pi*Freq*t+Phase);% 这里写入系统的输出方程矩阵形式即可
% 修改这个函数可以得到任意的波形输出
% 系统输出方程函数结束
View Code

之后要使S-fun模块调用编写好的S函数,需要设置模块的参数。进入子系统,双击S-Function模块,把S函数M文件的名称填入S-Function name,再填写模块的参数,如幅值(Amp)等...

技术分享图片

③封装子系统。右击子系统模块,选择Mask-->Create Mask,进入封装编辑界面。如下图,在左侧导航栏点击Edit创建模块参数,之后设置好参数的名称、标题、初始值等。

技术分享图片

技术分享图片

点击左下角的Preview可以预览参数设置对话框。

技术分享图片

④仿真观察结果。

 

以上是关于Matlab中关于函数bwlabel(I_bw,8)和函数bwboundaries(I_bw,'noholes')问题 高手进来帮忙看看吧 谢谢了的主要内容,如果未能解决你的问题,请参考以下文章

matlab函数_连通区域

matlab 中关于fread函数的用法

MATLAB中关于surf函数的使用

MATLAB中关于solve函数的用法

matlab 中关于 varargin 参数

Matlab中关于sprintf的问题