function B=findBoundary(BW,conn,dir)
% 函数:findBoundary
% 功能:从二值图像中找到所有物体的边界
% 输入:
% BW:二值图像,1 表示目标物体,0 表示背景
% conn:连通性,8 表示 8 连通,4 表示 4 连通
% dir:边界方向,'cw' 表示顺时针,'ccw' 表示逆时针
% 输出:
% B:一个 cell 数组,每个元素包含一个目标物体的边界点坐标
if nargin<3
dir='cw';
end
if nargin<2
conn=8;
end
L=bwlabel(BW,conn);
% 用连通性分析将目标物体分成若干个连通域,并用不同的标签表示
% 获取目标物体的数量
numObjects=max(L(:));
if numObjects>0
B={zeros(0,2)};
B=repmat(B,numObjects,1);
else
B={};%只有背景
end
Lp=padarray(L,[1 1],0,'both');
% 用 0 扩展标签矩阵,以便在边界跟踪过程中不用担心越界
M=size(Lp,1);
if conn==8
offsets=[-1,M-1,M,M+1,1,-M+1,-M,-M-1];
else
offsets=[-1,M,1,-M];
end
%next_search_direction_lut是一个查找表。给定像素的方向
%k到像素k+1,检查
%像素k+1的邻域?
if conn==8
next_search_direction_lut=[8 8 2 2 4 4 6 6];
else
next_search_direction_lut=[4 1 2 3];
end
if conn==8
next_direction_lut=[2 3 4 5 6 7 8 1];
else
next_direction_lut=[2 3 4 1];
end
%用于标记起始像素和边界像素的值。
START=-1;
BOUNDARY=-2;
%初始化用于记录边界像素的暂存空间,以及
%遵循边界。
scratch=zeros(100,1);
%查找边界的候选起始位置。
[rr,cc]=find((Lp(2:end-1,:)>0)&(Lp(1:end-2,:)==0));
rr=rr+1;
for k=1:length(rr)
r=rr(k);
c=cc(k);%得到边界点的位置【r c】
if (Lp(r,c)>0)&(Lp(r-1,c)==0)&isempty(B{Lp(r,c)})
%我们找到了下一个边界的起点。计算它的线性
%偏移量,记录它是哪个边界,标记它,并初始化
%计数器的边界像素数。
idx=(c-1)*size(Lp,1)+r;
which=Lp(idx);
scratch(1)=idx;
Lp(idx)=START;
numpixels=1;
currentpixel=idx;
initial_departure_direction=[];
done=0;
next_search_direction=2;
while ~done
%查找下一个边界像素
direction=next_search_direction;
found_next_pixel=0;
for k=1:length(offsets)
neighbor=currentpixel+offsets(direction);
if Lp(neighbor)~=0
%找到下一个边界像素
if (Lp(currentpixel)==START)&...
isempty(initial_departure_direction)
%我们正在从头开始
%像素。
initial_departure_direction=direction;
elseif (Lp(currentpixel)==START)&...
(initial_departure_direction==direction)
%我们正要重新走我们的路。
%这意味着我们完了。
done=1;
found_next_pixel=1;
break;
end
%沿着边界迈出下一步
next_search_direction=...
next_search_direction_lut(direction);
found_next_pixel=1;
numpixels=numpixels+1;
if numpixels>size(scratch,1)
% 划线区间的两倍
scratch(2*size(scratch,1))=0;
end
scratch(numpixels)=neighbor;
if Lp(neighbor)~=START
Lp(neighbor)=BOUNDARY;
end
currentpixel=neighbor;
break;
end
direction=next_direction_lut(direction);
end
if ~found_next_pixel
%如果没有下一个邻居,则对象必须只有一个
%单个像素。
numpixels=2;
scratch(2)=scratch(1);
done=1;
end
end
%将线性索引转换为row_column坐标并保存在
%输出单元阵列。
[row,col]=ind2sub(size(Lp),scratch(1:numpixels));
B{which}=[row-1,col-1];
end
end
if strcmp(dir,'ccw')
for k=1:length(B)
B{k}=B{k}(end:-1:1,:);
end
end
fpga和matlab
- 粉丝: 18w+
- 资源: 2644
最新资源
- 三相逆变器并网,双PI控制
- 双 Richards 方程双渗模型 在裂隙发育完全的边坡,可以使用等效法将裂隙平均到基质中,使用两个里查兹方程来方便描述裂隙的渗流情况和 基质的渗流情况,并考虑裂隙与基质的水交 从数值模拟的结果可
- 该模型在旋转坐标系下采样旋转高频注入的方法进行低速时的无传感器器控制,对静止坐标系下的电流进行同轴系高通滤波器提取负序分量,继而采用外差法进项误差提取,误差代入位置观测器得到PMSM的转子角度
- Matlab基于阈值分割的车牌定位识别 车牌识别主要包括以下三个主要步骤:车牌区域定位、车牌字符分割、车牌字符识别 通过对采集的车牌图像进行灰度变、边缘检测、腐蚀及平滑等过程来进行车牌图像预处理
- 三相PWM整流器simulink仿真模型,采用滑模控制(基于改进变指数趋近率),SVPWM调制策略,可以实现很好的整流直流侧电压超调量仅10V,交流侧谐波含量低于百分之5,且具有很强的鲁棒性
- 法兰克FANUC加工中心三点圆分中宏程序,在工厂使用多年,验证了宏程序的可靠性,此宏程序可以提高对刀速度,提高工作效率
- C#开发的串口通信程序,可适用RS232,485 1,自动检测COM 2,自动发送,自动清空 全部源码开放,适合初学者,也可以截取源码做项目开发 本源程序有需要一定编程能力
- Matlab数字图像处理 压缩包包含.m和.fig文件以及文档,具体实现标准参照以下要求: 第一部分:编写一个基于GUI的图像处理程序 软件,功能按钮和界面布局自己设定,遵循美观大方、方便操作的原则
- 遗传算法代码 旅行商问题(TSP)优化 Matlab代码可用于路径规划,物流配送,路径优化 源码+注释 数据可以修改 多少个坐标都行 帮忙改数据就是另外的价钱旺柴 代码一经出概不 望理解
- 微电网两阶段鲁棒优化程序 基于matlab+yalmip+cplex实现 代码完美地复现了中国电机工程学报的文献《微电网两阶段鲁棒优化经济调度方法-刘一欣》 代码基于matlab+yalmip+cp
- 内容:挖掘源荷两侧低碳资源并分析其低碳性,荷侧调用不同响应速度的价格型、激励型需求响应资源克服多时间尺度下碳捕集电厂综合灵活运行方式的局限,通过源荷资源协调优化,从而提高系统的低碳性能 文献:#计及
- 基于改进多目标粒子群的微电网优化调度模型 提出了一种经济与环保相协调的微电网优化调度模型,针对光伏电池、风机、微型燃气轮机、柴油发电机以及蓄电池组成的微电网系统的优化问题进行研究,在满足系统约束条件下
- 《信号检测与估值理论》Matlab仿真,包括: 高斯-牛顿迭代法对正弦信号参数进行估计、 对阻尼指数信号参数进行估计; 使用Kalman卡尔曼滤波器实现对时变信道估计、飞行器轨迹跟踪; DC电平检测器
- 基于PID的四旋翼无人机轨迹跟踪控制-仿真程序 火 基于MATLAB中Simulink的S-Function模块编写,注释详细,参考资料齐全 2D已有案例: 1 8字形轨迹跟踪
- 51单片机智能加湿器控制系统proteus仿真(仿真+源码+原理图) 仿真图proteus 7.8 protues 8.9 程序编译器:keil 4 keil 5 主要功能: 本设计由STC89C52
- MATLAB手势识别(静态手势识别,视频图像识别)带完整课程设计报告,AD电路图
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈