图像处理之边界跟踪
2017-11-10 21:00
316 查看
matlab函数:B=bwboundaries(img);
使用栈实现代码:
close all;clear all;
img = imread('G:/bound.jpg');
img = rgb2gray(img);
img = im2bw(img);
img=im2bw(img);
B=bwboundaries(img);%库函数结果
[m,n]=size(img);
k=1;
flag=0;
for i=1:m %找到第一个不为0元素位置
for j=1:n
if img(i,j)>0
stack(k,1)=i;
stack(k,2)=j;
starti=i; %标记第一个点
startj=j;
dir=7;
k=k+1;
flag=1; %表示已经找到了第一个元素
break;
end
end
if flag==1
break;
end
end
while 1
if mod(dir,2)==0
dir=mod(dir+7,8); %偶数处理方式
else
dir=mod(dir+6,8); %奇数的处理方式
end
i=stack(k-1,1);
j=stack(k-1,2);
while 1
flag=1;
switch dir
case 0
if j+1<n+1&&img(i,j+1)>0%右方
stack(k,1)=i;
stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 1
if i-1>0&&j+1<n+1&&img(i-1,j+1)>0%右上方
stack(k,1)=i-1;stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 2
if i-1>0&&img(i-1,j)>0%上方
stack(k,1)=i-1;stack(k,2)=j;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 3
if i-1>0&&j-1>0&&img(i-1,j-1)>0%左上方
stack(k,1)=i-1;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 4
if j-1>0&&img(i,j-1)>0%左方
stack(k,1)=i;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 5
if i+1<m+1&&j-1>0&&img(i+1,j-1)>0%左下方
stack(k,1)=i+1;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 6
if i+1<m+1&&img(i+1,j)>0%下方
stack(k,1)=i+1;stack(k,2)=j;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 7
if i+1<m+1&&j+1<n+1&&img(i+1,j+1)>0%右下方
stack(k,1)=i+1;stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
otherwise
end
if flag==0%找到下一个点退出当前循环
break;
end
end
if k-1>2&&stack(k-2,1)==starti&&stack(k-2,2)==startj&&stack(k-1,1)==stack(2,1)&&stack(k-1,2)==stack(2,2)%退出循环条件
break;
end
end
stack(k-1,:)=[];
figure;
subplot(1,2,1);
imshow(img);
subplot(1,2,2);
imshow(img);
hold on;
for i=1:length(stack)
hold on; plot(stack(:,2),stack(:,1),'r');
end
使用递归实现:
使用栈实现代码:
close all;clear all;
img = imread('G:/bound.jpg');
img = rgb2gray(img);
img = im2bw(img);
img=im2bw(img);
B=bwboundaries(img);%库函数结果
[m,n]=size(img);
k=1;
flag=0;
for i=1:m %找到第一个不为0元素位置
for j=1:n
if img(i,j)>0
stack(k,1)=i;
stack(k,2)=j;
starti=i; %标记第一个点
startj=j;
dir=7;
k=k+1;
flag=1; %表示已经找到了第一个元素
break;
end
end
if flag==1
break;
end
end
while 1
if mod(dir,2)==0
dir=mod(dir+7,8); %偶数处理方式
else
dir=mod(dir+6,8); %奇数的处理方式
end
i=stack(k-1,1);
j=stack(k-1,2);
while 1
flag=1;
switch dir
case 0
if j+1<n+1&&img(i,j+1)>0%右方
stack(k,1)=i;
stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 1
if i-1>0&&j+1<n+1&&img(i-1,j+1)>0%右上方
stack(k,1)=i-1;stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 2
if i-1>0&&img(i-1,j)>0%上方
stack(k,1)=i-1;stack(k,2)=j;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 3
if i-1>0&&j-1>0&&img(i-1,j-1)>0%左上方
stack(k,1)=i-1;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 4
if j-1>0&&img(i,j-1)>0%左方
stack(k,1)=i;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 5
if i+1<m+1&&j-1>0&&img(i+1,j-1)>0%左下方
stack(k,1)=i+1;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 6
if i+1<m+1&&img(i+1,j)>0%下方
stack(k,1)=i+1;stack(k,2)=j;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 7
if i+1<m+1&&j+1<n+1&&img(i+1,j+1)>0%右下方
stack(k,1)=i+1;stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
otherwise
end
if flag==0%找到下一个点退出当前循环
break;
end
end
if k-1>2&&stack(k-2,1)==starti&&stack(k-2,2)==startj&&stack(k-1,1)==stack(2,1)&&stack(k-1,2)==stack(2,2)%退出循环条件
break;
end
end
stack(k-1,:)=[];
figure;
subplot(1,2,1);
imshow(img);
subplot(1,2,2);
imshow(img);
hold on;
for i=1:length(stack)
hold on; plot(stack(:,2),stack(:,1),'r');
end
使用递归实现:
相关文章推荐
- 图像处理基础知识系列之一:边界跟踪之内边界跟踪算法解释
- matlab图像处理之二值图像内外边界跟踪
- 图像处理基本算法 链码 边界跟踪
- 图像处理基本算法 链码 边界跟踪
- 图像处理基本算法 链码 边界跟踪
- 图像处理基本算法 链码 边界跟踪
- 图像处理基本算法 链码 边界跟踪
- Canvas---Canvas图像处理、图片查看器实现思路整理、拖动边界控制
- 数字图像处理编成入门笔记——第7章 边沿检测与提取,轮廓跟踪
- MATLAB GUI实现常见图像处理算法与视频跟踪算法
- 图像处理之其他杂项(一)之MeanShift的目标跟踪算法opencv c++代码 VS2015+opencv3.2
- matlab练习程序(图像滤波时的边界处理)
- OpenCV之imgproc 模块. 图像处理(2)实现自己的线性滤波器 给图像添加边界 Sobel 导数 Laplace 算子 Canny 边缘检测
- 图像处理(五):八邻域边缘跟踪与区域生长算法
- 图像处理之目标跟踪(二)之MOSSE滤波简单梳理
- 图像预处理——边界跟踪、图像分割
- Python-OpenCV 处理图像:图像中边界和轮廓检测
- 彩色图像流、深度数据和骨骼点跟踪的集合处理
- 初学图像处理--跟踪视频中的特征点(光流法)
- matlab练习程序(图像滤波时的边界处理2)