基于交叉点的树遍历二值图像边界跟踪算法
- 格式:pdf
- 大小:592.03 KB
- 文档页数:4
内边界跟踪和外边界跟踪是图像处理中常用的算法,它们在物体识别、图像分析、目标跟踪等方面具有重要的应用价值。
本文将从算法原理、应用领域和优缺点等方面对内边界跟踪和外边界跟踪进行简要介绍,以期为读者提供全面的了解。
一、内边界跟踪算法内边界跟踪算法是一种用于提取目标内部边界的图像处理算法。
其主要原理是从目标的内部开始,沿着边缘像素依次跟踪,直至回到起点。
常用的内边界跟踪算法包括基于链码的跟踪算法和基于边缘检测的跟踪算法。
1.1 基于链码的内边界跟踪算法基于链码的内边界跟踪算法是一种以目标内部边界像素为起点,按照像素相邻关系依次跟踪的算法。
其核心思想是用一系列数字码来表示像素之间的连续关系,从而构建目标的内部边界路径。
常见的链码编码方式包括4连通链码和8连通链码,分别适用于4邻域和8邻域的像素跟踪。
链码编码具有简洁高效的特点,适用于快速提取目标内部边界。
1.2 基于边缘检测的内边界跟踪算法基于边缘检测的内边界跟踪算法是一种在边缘检测的基础上进行跟踪的算法。
其主要步骤包括对目标进行边缘检测,然后从边缘像素出发进行跟踪,最终得到目标的内部边界路径。
常用的边缘检测算法包括Sobel算子、Canny算子等,它们能够有效提取目标的边缘信息,为内边界跟踪提供了可靠的输入数据。
二、外边界跟踪算法外边界跟踪算法是一种以目标外部边界为起点,沿着边缘像素逐步跟踪的图像处理算法。
其主要原理是从目标的外部开始,按照像素相邻关系逐步跟踪,直至回到起点。
常用的外边界跟踪算法包括基于边缘填充的跟踪算法和基于边缘内外关系的跟踪算法。
2.1 基于边缘填充的外边界跟踪算法基于边缘填充的外边界跟踪算法是一种在目标外部进行像素填充,然后从填充后的边缘像素开始进行跟踪的算法。
其核心思想是通过填充操作将目标的外部边界转化为内部边界,从而利用内边界跟踪算法进行处理。
这种方法能够简化外边界跟踪的流程,提高跟踪的准确性和稳定性。
2.2 基于边缘内外关系的外边界跟踪算法基于边缘内外关系的外边界跟踪算法是一种根据目标边缘像素的内外关系进行跟踪的算法。
二值化图像轮廓跟踪计算质心周长面积matlab在MATLAB中进行二值图像轮廓跟踪计算质心、周长和面积,可以使用以下步骤:1. 读取二值图像```matlabbinaryImage = imread('binary_image.png');```2. 使用bwboundaries函数获取轮廓```matlabboundaries = bwboundaries(binaryImage);```3. 计算每个轮廓的质心、周长和面积```matlabcentroids = {};perimeters = [];areas = [];for k = 1:length(boundaries)boundary = boundaries{k};% 计算质心坐标centroid = mean(boundary);centroids{k} = centroid;% 计算周长perimeter = sum(sqrt(sum(diff(boundary).^2, 2)));perimeters(k) = perimeter;% 计算面积area = polyarea(boundary(:, 2), boundary(:, 1));areas(k) = area;end```4. 可选:绘制轮廓和质心```matlabfigure;imshow(binaryImage);hold on;for k = 1:length(boundaries)boundary = boundaries{k};% 绘制轮廓plot(boundary(:, 2), boundary(:, 1), 'r', 'LineWidth', 2);% 绘制质心centroid = centroids{k};plot(centroid(2), centroid(1), 'bo', 'MarkerSize', 10, 'LineWidth', 2);endhold off;```请注意,上述代码仅适用于处理单个物体的轮廓。
主要基于两种思路:a)不依赖于先验知识,直接从图像序列中检测到运动目标,并进行目标识别,最终跟踪感兴趣的运动目标;b)依赖于目标的先验知识,首先为运动目标建模,然后在图像序列中实时找到相匹配的运动目标。
一.运动目标检测对于不依赖先验知识的目标跟踪来讲,运动检测是实现跟踪的第一步。
运动检测即为从序列图像中将变化区域从背景图像中提取出来。
运动目标检测的算法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测〔一〕静态背景1.背景差2.帧差3.GMM4.光流背景减算法可以对背景的光照变化、噪声干扰以及周期性运动等进行建模,在各种不同情况下它都可以准确地检测出运动目标。
因此对于固定摄像头的情形,目前大多数的跟踪算法中都采用背景减算法来进行目标检测。
背景减算法的局限性在于它需要一个静态的固定摄像头。
〔二〕运动场通常情况下,摄像机的运动形式可以分为两种:a)摄像机的支架固定,但摄像机可以偏转、俯仰以及缩放; b)将摄像机装在某个移动的载体上。
由于以上两种情况下的背景及前景图像都在做全局运动,要准确检测运动目标的首要任务是进行图像的全局运动估计与补偿。
考虑到图像帧上各点的全局运动矢量虽不尽相同(摄像机做平移运动除外),但它们均是在同一摄像机模型下的运动,因而应遵循相同的运动模型,可以用同一模型参数来表示。
全局运动的估计问题就被归结为全局运动模型参数的估计问题,通常使用块匹配法或光流估计法来进行运动参数的估计。
块匹配基于块的运动估算和补偿可算是最通用的算法。
可以将图像分割成不同的图像块,假定同一图像小块上的运动矢量是相同的,通过像素域搜索得到最正确的运动矢量估算。
块匹配法主要有如下三个关键技术:a)匹配法则,如最大相关、最小误差等b)搜索方法,如三步搜索法、交叉搜索法等。
c) 块大小确实定,如分级、自适应等。
光流法光流估计的方法都是基于以下假设:图像灰度分布的变化完全是目标或者场景的运动引起的,也就是说,目标与场景的灰度不随时间变化。
matlab练习程序(二值图像内外边界跟踪)目标内边界的像素全都在目标里面,目标外边界的像素全都不在目标上,是包围着目标的。
二值图像内外边界的计算都是有两种方法的,所以一共是4种算法,不过实际用到跟踪的只有一个而已。
首先是内边界跟踪:第一种方法不是跟踪方法。
步骤是先对原图像腐蚀,然后用原图像减去腐蚀后的图像就得到边界了。
第二种方法是跟踪方法。
步骤如下:1.遍历图像。
2.标记第一个遇见像素块的前景像素(i,j)。
3.对这个像素周围八邻域逆时针搜索,如果搜索到周围有前景像素,那么更新坐标(i,j)为(i',j'),并标记。
4.不断执行第3步直到再次遇见此像素块第一次标记的像素。
5.继续执行第1步。
然后是外边界跟踪:第一种方法和求内边界第一种方法类似。
先对原图像进行膨胀,然后用膨胀后的图像减去原图像即可。
第二种也不算跟踪方法,只是标记算法而已。
就是将图像中前景像素周围的非前景像素标记一下就行了。
效果如下:原图:内边界:外边界:matlab程序如下:内边界:clear all;close all;clc;img=imread('rice.png');img=img>128;imshow(img);[m n]=size(img);imgn=zeros(m,n); %边界标记图像ed=[-1 -1;0 -1;1 -1;10;11;01;-11;-10]; %从左上角像素,逆时针搜索for i=2:m-1for j=2:n-1if img(i,j)==1 && imgn(i,j)==0 %当前是没标记的白色像素if sum(sum(img(i-1:i+1,j-1:j+1)))~=9 %块内部的白像素不标记ii=i; %像素块内部搜寻使用的坐标jj=j;imgn(i,j)=2; %本像素块第一个标记的边界,第一个边界像素为2while imgn(ii,jj)~=2 %是否沿着像素块搜寻一圈了。
cv2.findcontours 内部算法原理cv2.findContours()是cv2中的一个函数,可以用来寻找图像中的轮廓。
它是基于二值图像或灰度图像的,在初学阶段我们可以将它的作用理解为在处理图片时,寻找物体的边界轮廓。
但是在实际应用时,cv2.findContours()的功能远远不止于寻找轮廓,它可以用于物体检测与识别,面部识别,数字识别等多种用途。
那么今天我们来探讨一下cv2.findContours()的内部算法原理。
cv2.findContours()的原理可以简单概括为在一个二值图像中找到所有物体的轮廓。
这个过程主要由两个基本步骤组成:1. 二值图像阈值化:我们首先需要将原始图像转换成二值图像,这可以通过多种方式实现,如Adaptive Thresholding,Otsu's Method等等。
阈值化的目的是方法一:去除图像中多余的信息,方法二:突出图像中感兴趣的物体信息。
这两种方法在图像处理时非常常用。
2. 寻找所有轮廓:接下来,我们需要找到二值图像中物体的轮廓。
在这个过程中,算法会从图像上会搜索与它相邻的像素并记录下每一个连通区域。
这些连通区域被称为轮廓。
我们将重点讨论第二步:寻找所有轮廓的过程。
步骤一:找到边界点找到边界点大概可以分为以下几个步骤:1. 遍历图像中每一个像素,如果它的值为255的话,就说明它是前景像素,我们将其保存到一个List中。
2. 接下来,我们需要找到边界点。
一个轮廓是由很多边界点组成的,一个像素如果它的上下或左右的像素一个为前景,一个为背景,那么我们就将它保存为边界点。
3. 最后我们得到了一系列的边界点,我们将它们保存在一个Vector中。
步骤二:根据边界点找到连通区域在步骤一中,我们得到的是一些离散的边界点的位置,现在我们需要将这些点组成一个连通的轮廓区域。
通常,我们将这些点按照一个特定的顺序排列,使得它们组成的多边形区域封闭。
我们从点集中选择一个起点,然后按照顺序依次寻找下一个点并将这些点依次连接起来。