MATLAB 二值图像内外边界跟踪

   2023-02-09 学习力0
核心提示:目标内边界的像素全都在目标里面,目标外边界的像素全都不在目标上,是包围着目标的。二值图像内外边界的计算都是有两种方法的,所以一共是4种算法,不过实际用到跟踪的只有一个而已。 首先是内边界跟踪:第一种方法不是跟踪方法。步骤是先对原图像腐蚀,然

目标内边界的像素全都在目标里面,目标外边界的像素全都不在目标上,是包围着目标的。

二值图像内外边界的计算都是有两种方法的,所以一共是4种算法,不过实际用到跟踪的只有一个而已。

 

首先是内边界跟踪:

第一种方法不是跟踪方法。步骤是先对原图像腐蚀,然后用原图像减去腐蚀后的图像就得到边界了。

第二种方法是跟踪方法。步骤如下:

1.遍历图像。

2.标记第一个遇见像素块的前景像素(i,j)。

3.对这个像素周围八邻域逆时针搜索,如果搜索到周围有前景像素,那么更新坐标(i,j)为(i',j'),并标记。

4.不断执行第3步直到再次遇见此像素块第一次标记的像素。

5.继续执行第1步。

 

然后是外边界跟踪:

第一种方法和求内边界第一种方法类似。先对原图像进行膨胀,然后用膨胀后的图像减去原图像即可。

第二种也不算跟踪方法,只是标记算法而已。就是将图像中前景像素周围的非前景像素标记一下就行了。

 

效果如下:

原图:

MATLAB 二值图像内外边界跟踪

内边界:

MATLAB 二值图像内外边界跟踪

外边界:

MATLAB 二值图像内外边界跟踪

matlab程序如下:

内边界:

 1 clear all;
 2 close all;
 3 clc;
 4 
 5 img=imread('rice.png');
 6 img=img>128;
 7 imshow(img);
 8 [m n]=size(img);
 9 
10 imgn=zeros(m,n);        %边界标记图像
11 ed=[-1 -1;0 -1;1 -1;1 0;1 1;0 1;-1 1;-1 0]; %从左上角像素,逆时针搜索
12 for i=2:m-1
13     for j=2:n-1
14         if img(i,j)==1 && imgn(i,j)==0      %当前是没标记的白色像素
15             if sum(sum(img(i-1:i+1,j-1:j+1)))~=9    %块内部的白像素不标记
16                 ii=i;         %像素块内部搜寻使用的坐标
17                 jj=j;
18                 imgn(i,j)=2;    %本像素块第一个标记的边界,第一个边界像素为2
19                 
20                 while imgn(ii,jj)~=2    %是否沿着像素块搜寻一圈了。
21                     for k=1:8           %逆时针八邻域搜索
22                         tmpi=ii+ed(k,1);        %八邻域临时坐标
23                         tmpj=jj+ed(k,2);
24                         if img(tmpi,tmpj)==1 && imgn(tmpi,tmpj)~=2  %搜索到新边界,并且没有搜索一圈
25                             ii=tmpi;        %更新内部搜寻坐标,继续搜索
26                             jj=tmpj;
27                             imgn(ii,jj)=1;  %边界标记图像该像素标记,普通边界为1
28                             break;
29                         end
30                     end
31                 end
32                 
33             end
34         end
35     end
36 end
37 
38 figure;
39 imgn=imgn>=1;
40 imshow(imgn,[]);
41 
42 %不过要是真取二值图像内边界,通常是原图减去其腐蚀图就行了
43 se = strel('square',3); 
44 imgn=img-imerode(img,se);    
45 figure;
46 imshow(imgn)

外边界:

 1 clear all;
 2 close all;
 3 clc;
 4 
 5 img=imread('rice.png');
 6 img=img>128;
 7 imshow(img);
 8 [m n]=size(img);
 9 
10 imgn=zeros(m,n);        %边界标记图像
11 ed=[-1 -1;0 -1;1 -1;1 0;1 1;0 1;-1 1;-1 0]; %从左上角像素判断
12 for i=2:m-1
13     for j=2:n-1
14         if img(i,j)==1      %如果当前像素是前景像素
15             
16             for k=1:8
17                 ii=i+ed(k,1);
18                 jj=j+ed(k,2);
19                 if img(ii,jj)==0    %当前像素周围如果是背景,边界标记图像相应像素标记
20                     imgn(ii,jj)=1;
21                 end
22             end
23             
24         end
25     end
26 end
27     
28 figure;
29 imshow(imgn,[]);
30 
31 %不过要是真取二值图像外边界,通常是原图膨胀图减去原图就行了
32 se = strel('square',3); 
33 imgn=imdilate(img,se)-img;    
34 figure;
35 imshow(imgn)

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • 如何将极坐标数据转换为笛卡尔坐标系并绘制[MATLAB]
    如何将极坐标数据转换为笛卡尔坐标系并绘制[MAT
    你想做的事考虑根据与原点的距离 $r$ 和 $xy$ 平面上的角度 $heta$ 绘制数据 $P(r, heta)$。例如,雷达获取的信号包含有关目标范围 $r$ 和方位角 $heta$ 的信息。就是下图。在本文中,$heta$ 是从 $x$ 轴测量的角度。显示示例考虑创建依赖于 $r, heta$ 的虚拟
    03-16
  • 【MATLAB与机械设计】一维优化进退法确定初始区间
    【MATLAB与机械设计】一维优化进退法确定初始区
    在讨论一维搜索时,首先保证搜索区间函数具有单峰性,也就是在区间[a,b]中函数是凸函数,对于求极小值问题,函数值具有高—低—高的特性,在区间[a,b]上有唯一的最小值。1,方法的建立2.进退法确定搜索区间的程序框图3,根据上述的程序框图,编写的MATLAB程序
    03-08
  • 用于微型四轮驱动的 6T 小齿轮原型和使用 MATLAB 的 FEM 结构分析
    用于微型四轮驱动的 6T 小齿轮原型和使用 MATLA
    介绍我使用迷你 4WD 套件使用 Raspberry Pi 制作机器人汽车。定制零件丰富且方便,因为它们在附近的商店很容易买到。但是,由于Mini 4WD的速度非常快,因此在低速时很难控制速度。因此,我使用 3D 打印机制作了自己的 6T 小齿轮,并尝试改变齿轮比。 成型小齿
    03-08
  • ROS与Matlab系列:一个简单的运动控制 基于matl
    转自:http://blog.exbot.net/archives/2594Matlab拥有强大的数据处理、可视化绘图能力以及众多成熟的算法函数,非常适合算法开发;在控制系统设计中,Simulink也是普遍使用的设计和仿真工具。而ROS系统,则是一种新的标准化机器人系统软件框架。通过ROS,你
    02-10
  • matlab 遍历结构体struc的成员
    MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。表4.3.1 结构数组的操作函数函数名             功能描述 deal                 把输入处
    02-09
  • 02-09
  • schroeder reverb matlab实现
    schroeder reverb matlab实现
    原理参考:Natural sounding artificial reverberation combFilter.m:function output = combFilter(delay, gain, input)fs = 48000;delaySample = int32(delayTime * fs / 1000);B = [1 zeros(1, delaySample - 1)];A=[1 zeros(1, delaySample - 2) -gain];
    02-09
  • C/C++中调用matlab引擎计算 matlab转c
    原帖地址:http://blog.sina.com.cn/s/blog_6adcb3530101cvot.html一,在linux环境使用matlab引擎必须先进行一些必要的配置1,matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh。**2,matlab引擎依赖的动态库文件目录必须在系统当前的
    02-09
  • MATLAB 图像放大/缩小,双线性插值
    MATLAB 图像放大/缩小,双线性插值
    半年前写过matlab最邻近插值的图像缩放,没怎么考虑边界问题。更早之前用Opencv写过双线性插值图像放大,不过写的比较混乱。所以这里用matlab重新再清楚的写一遍。 1 close all; 2 clear all; 3 clc; 45 m=1.8;%放大或缩小的高度 6 n=2.3;%放大或缩小的宽度 7
    02-09
点击排行