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
![avatar](https://profile-avatar.csdnimg.cn/6534a49295004b5796c3956cb3f87481_ccsss22.jpg!1)
![avatar-vip](https://csdnimg.cn/release/downloadcmsfe/public/img/user-vip.1c89f3c5.png)
fpga和matlab
- 粉丝: 18w+
- 资源: 2655
最新资源
- 【JCR一区级】秃鹰算法BES-Transformer-GRU负荷数据回归预测【含Matlab源码 6347期】.zip
- 【独家首发】开普勒算法KOA优化Transformer-BiLSTM负荷数据回归预测【含Matlab源码 6560期】.zip
- 【JCR一区级】雾凇算法RIME-Transformer-GRU负荷数据回归预测【含Matlab源码 6348期】.zip
- 【JCR1区】雪融算法SAO-CNN-SVM故障诊断分类预测【含Matlab源码 5823期】.zip
- 【JCR1区】蚁狮算法ALO-CNN-SVM故障诊断分类预测【含Matlab源码 5825期】.zip
- 【JCR一区级】鹈鹕算法POA-Transformer-GRU负荷数据回归预测【含Matlab源码 6345期】.zip
- 【JCR一区级】金豺算法GJO-Transformer-GRU负荷数据回归预测【含Matlab源码 6326期】.zip
- 【JCR一区级】天鹰算法AO-Transformer-GRU负荷数据回归预测【含Matlab源码 6346期】.zip
- 【LSTM时序预测】鲸鱼算法优化卷积长短期记忆神经网络WOA-CNN-LSTM股价序列预测【含Matlab源码 3008期】.zip
- 【独家首发】粒子群算法PSO优化Transformer-LSTM负荷数据回归预测【含Matlab源码 6388期】.zip
- 【JCR1区】遗传算法GA-CNN-SVM故障诊断分类预测【含Matlab源码 5824期】.zip
- 【JCR1区】飞蛾扑火算法MFO-CNN-SVM故障诊断分类预测【含Matlab源码 5784期】.zip
- 【JCR1区】引力搜索算法GSA-CNN-SVM故障诊断分类预测【含Matlab源码 5826期】.zip
- 【JCR一区级】金枪鱼算法TSO-Transformer-GRU负荷数据回归预测【含Matlab源码 6327期】.zip
- 【JCR一区级】鲸鱼算法WOA-Transformer-GRU负荷数据回归预测【含Matlab源码 6328期】.zip
- 【JCR一区级】淘金算法GRO-Transformer-GRU负荷数据回归预测【含Matlab源码 6344期】.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)