matlab练习程序(二值图像内外边界跟踪)
- 格式:doc
- 大小:19.50 KB
- 文档页数:4
matlab边缘轮廓坐标在MATLAB中,可以使用edge函数来检测图像的边缘,并使用findContours函数来找到边缘的轮廓。
以下是一个简单的示例,说明如何找到二值图像的边缘轮廓:matlab复制代码% 读取图像I = imread('image.png');% 转换为灰度图像I = rgb2gray(I);% 使用Canny边缘检测BW = edge(I,'Canny');% 查找轮廓[B,L] = bwboundaries(BW,'noholes');% 显示原始图像和边缘检测结果figure;subplot(1,2,1); imshow(I); title('原始图像');subplot(1,2,2); imshow(BW); title('边缘检测结果');% 显示轮廓figure;for k = 1:length(B)boundary = B{k};plot(boundary(:,2), boundary(:,1), 'r', 'LineWidth', 2);endtitle('边缘轮廓');在这个示例中,bwboundaries函数返回一个边界矩阵B 和一个标记矩阵L。
边界矩阵B是一个结构数组,每个元素B{i}是一个表示第i个边界的点的矩阵。
标记矩阵L是一个逻辑矩阵,与输入图像具有相同的尺寸,其中L(i,j)为1表示点(i,j)属于某个边界,为0表示不属于任何边界。
在这个示例中,我们只对没有洞的边界感兴趣,因此使用了'noholes'选项。
matlab区域⽣长算法⽣成⼆值图像边界区域function ret=growseed()%=====区域⽣长算法========%input :⼆值图像数据%output:边界点⼆值图像数据global I;global M;global N;global Y;global T;global newy;global newx;%==边界点x,y坐标%获取多张图⽚的⼆值数据tempI=draw(); %tempI 36*45*numbertotalcount=length(tempI(1,1,:));wide=length(tempI(:,1,1));%36high=length(tempI(1,:,1));%45result=zeros(wide,high,count);for k=1:countI=tempI(:,:,k);% figure,imshow(I),title('原始图像')I=double(I);[M,N]=size(I);[seedx,seedy]=searchseed(I);Y=zeros(M,N); %作⼀个全零与原图像等⼤的图像矩阵Y,作为输出图像矩阵T=zeros(M,N);%标记点。
newx=0;newy=0;calseed(seedx,seedy);figure,imshow(Y);% if k>1&&k<count% result(:,:,k)=Y;% figure,imshow(Y);% else% result(:,:,k)=T;% % imshow(T);% % figure,imshow(T);% endendret=result;endfunction calseed(seedx,seedy)global M;global N;global Y;global I;global newx;global newy;global T;for i = -1 : 1for j = -1 : 1newseedx = seedx + i;newseedy = seedy+ j;%⽣长准则:判断⽣长点8邻域内像素的各⾃灰度值是否与⽣长点所在像素灰度值相等if newseedx> 0 && newseedx <= M && newseedy > 0 && newseedy <= N &&T(newseedx,newseedy)==0&&I(newseedx,newseedy)==1 T(newseedx,newseedy)=1;if isequal(newseedx,newseedy)==1calseed(newseedx,newseedy);elseY(newx,newy)=1;%set边界点值为1endendendendendfunction ret=isequal(x,y)%====判断点的领域是否相等%===输⼊1个点的x,y坐标%==返回1 相等global I;global newx;global newy;global M;global N;ret=1;tag=0;for i = -1 : 1if tag==0for j = -1 : 1if x+i> 0 && x+i <= M && y+j > 0 && y+j <= Nif I( x+i,y+j)==0ret=0;tag=1;newx=x+i;newy=y+j;endendendendendendfunction [x,y]=searchseed(I)%=========寻找种⼦点===== %Input:⼀张⼆值数据的图⽚%Output:返回种⼦点的x,y坐标%======求数据为1的质⼼==== [M,N]=size(I);corx=0;cory=0;count=0;for i=1:Mfor j=1:Nif I(i,j)==1corx=corx+i;cory=cory+j;count=count+1;endendendx=round(corx/count);y=round(cory/count);end处理结果。
bwboundaries函数是MATLAB中的一个专门用于跟踪二值图像中对象的外边界以及这些对象内部孔洞的边界的函数。
特别的,这个函数还可以跟踪父对象完全包围的子对象的外边界和孔洞边界。
在具体应用中,bwboundaries函数返回由边界像素位置组成的元胞数组B。
此外,值得注意的是,MATLAB中的bwlabel和bwboundaries两个函数都可以用来标记二维二进制图像中的连通分量。
其中,bwlabel函数的作用是标记二维二进制图像中的连通分量,而bwboundaries函数则更进一步,除了标记连通分量之外,还能跟踪并标记出对象的外边界以及内部孔洞的边界。
bwboundaries函数在图像处理中有着广泛的应用,例如车牌字符识别、手写字体识别、血管分析等。
同时,MATLAB官方也提供了一些示例程序来帮助用户学习和理解这个函数的使用方式。
matlab练习程序(⼆值图像连通区域标记法,两步法) 我⼏乎完全就是照着上的算法实现的,不过是⽤Matlab⽽已。
使⽤了两步法进⾏标记,⼀步法我还没怎么看。
两步法中第⼆步是⽐较⿇烦的,其中⽤到了不相交集合的⼀些理论,尤其是不相交集合森林,我这⾥的find_set函数就是参考《算法导论》311页的算法写的。
如果⽤c++写,也许需要⾃⼰构造数据结构。
好吧,下⾯是我理解的算法过程: 1.⾸先要确定是标记8邻域连通还是4邻域连通,如果是8邻域连通,就⽤的模板,如果是4邻域连通,就⽤的模板。
我这⾥⽤了是8连通。
2.⽤模板变量图像,类似卷积,不过不计算,只⽐较。
⽐较当前像素和邻域4个或2个像素,如果都不相等,那么标记号加⼀,并且把这个标记号赋值给另⼀个标记空间中相同位置的像素,因为不能破坏当前图像的像素。
如果有⼀个相等,那么就把这4个或2个像素中⾮背景像素中的最⼩值赋给另⼀个标记空间相同位置的像素,并且把这4个或2个像素同有相同当前位置像素值的集合取并集(ps:这个真的好难解释--!!)。
遍历完会得到标记图像和有标记号那么多个的标记集合。
3.遍历标记图像,按标记图像的像素值索引标记集合,找到标记集合中代表当前集合最⼩的值赋值给原图像当前位置的像素(ps:这⾥最好看《算法导论》或)。
还是看代码吧,运⾏⼀下更好: main.mclear all;close all;clc;img=imread('liantong.bmp');imgn=img>128;s=uint8(1-imgn);%{s=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0; %这个矩阵是维基百科中的矩阵0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0;0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0;0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0;0 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0;0 0 1 1 0 0 0 0 0 1 1 0 0 0 1 1 0;0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];%}imshow(mat2gray(s));[m n]=size(s);tmp=zeros(m,n);label=1; %第⼀遍遍历时标记的标签数量for i=2:mfor j=2:n-1up_left=s(i-1,j-1); %原图像当前像素周围四个像素up=s(i-1,j);up_right=s(i-1,j+1);left=s(i,j-1);cur=s(i,j);if cur==1if cur~=up_left && cur~=up &&cur~=up_right &&cur~=left %当前和四周的都不⼀样,加新标签tmp(i,j)=label;link{label}=[];label=label+1;elset=sort([tmp(i,j-1) tmp(i-1,j-1) tmp(i-1,j) tmp(i-1,j+1)]); %标签图像当前像素周围四个像素并排序for k=1:4 %寻找周围四个像素⾮零的最⼩值赋值给标签图像if t(k)~=0tmp(i,j)=t(k);for w=k:4link{t(w)}=union(t(k:4),link{t(w)}); %设置不相交集合endbreak;endendendendendendfor i=1:mfor j=1:nif s(i,j) ~=0s(i,j)=find_set(link,tmp(i,j));endendendfigure,imshow(mat2gray(s)) find_set.mfunction re=find_set(p,i) %不相交集合寻找代表当前集合的最⼩值,详见《算法导论》第21章if min(p{i}) ~= ii=find_set(p,min(p{i}));endre=i;end下⾯是运⾏的结果:原图结果图效果还不错吧。
二值化图像轮廓跟踪计算质心周长面积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;```请注意,上述代码仅适用于处理单个物体的轮廓。
摘要视频图像处理技术广泛用于工业、安全、医疗、管理等领域。
运动目标的检测和跟踪是图像处理技术在视频序列图像处理方面的一个重要应用,在航天、交通、机器人视觉、视频监控、公共场所客流数据监测等场合发挥着重要作用。
本文介绍了一种基于MATLAB的简易的从视频播放的帧图像中找出目标图像,并进行视频跟踪的实现方法。
通过对图像进行阈值处理(图像分割),再对分割后的图像求取形心,以对目标图像进行定位,并最后找到各幅帧图像的目标位置的方法,从而实现对100帧视频图像的实时跟踪。
关键词:目标检测;阈值处理;视频序列目标跟踪;形心估计ABSTRACTVideo image processing technology is widely used in industrial, security, health care, management and other fields. Motion target detection and tracking is image processing technology in video sequence is an important application in image processing, in the aerospace, transportation, robot vision, video surveillance, public traffic data monitoring plays an important role.This paper introduces a simple MATLAB to find the target image from the video image frame based, and realization method of video tracking.Through the threshold of image processing (image segmentation), then the after image segmentation to obtain the centroid, to locate the target image, and finally found the method of each frame image of the target position, so as to rea lize the real-time tracking of the 100 frame of video images.Key words: target detection; threshold; video object tracking; centroid estimation目录第1章引言 (1)1.1 选题背景 (1)1.2 课题研究目的及意义 (2)1.3 课题研究思路 (3)第2章数字图像处理简介 (4)2.1 图像数字化过程 (4)2.2 数字图像处理的基本内容 (6)2.2.1 基本概念 (6)2.2.2 数字图像处理的主要内容 (6)2.3 数字图像处理的特点和应用 (8)2.3.1 数字图像处理的特点 (8)2.3.2 数字图像处理的应用 (8)2.4 数字图像类型 (9)2.5 主要图像文件格式 (11)第3章MATLAB仿真软件的简介 (13)3.1 MATLAB的历史背景 (13)3.2 MATLAB简介 (14)3.3 MATLAB的特点 (15)3.4 MATLAB在数字图像中的应用 (16)第4章图形用户界面 (18)4.1 图形用户界面简介 (18)4.2 MATLAB 常用图像操作 (18)4.3 GUI的创建 (20)4.4 GUI的应用 (22)4.4.1 脚本与函数 (22)4.4.2 递归函数调用 (23)4.4.3 调试GUI M文件 (23)第5章基于MATLAB的图像跟踪算法 (24)5.1 100帧视频图像的读取 (24)5.2 图像的阈值处理(图像分割) (24)5.2.1 阈值的确定 (25)5.2.2 图像的阈值分割 (26)5.3 形心(距心)的求取 (28)5.4 设置跟踪波门 (29)第6章总结与展望 (34)6.1 总结 (34)6.2 展望 (34)参考文献 (36)致谢 ................................................................................................................. 错误!未定义书签。
Matlab实现图像边缘检测为了在⼀幅图像 f 的(x,y)位置寻找边缘的强度和⽅向,所选择的⼯具就是梯度,梯度使⽤向量来表⽰:该向量指出了图像 f 在位置(x,y)处的最⼤变化率的⽅向,梯度向量的⼤⼩表⽰为:它是梯度向量⽅向变化率的值。
梯度向量的⽅向表⽰为:梯度算⼦roberts算⼦:sobel算⼦:prewitt算⼦:Matlab实现function output = my_edge(input_img,method)if size(input_img,3)==3input_img=rgb2gray(input_img);endinput_img=im2double(input_img);sobel_x=[-1,-2,-1;0,0,0;1,2,1];sobel_y=[-1,0,1;-2,0,2;-1,0,1];prewitt_x=[-1,-1,-1;0,0,0;1,1,1];prewitt_y=[-1,0,1;-1,0,1;-1,0,1];psf=fspecial('gaussian',[5,5],1);input_img=imfilter(input_img,psf);%⾼斯低通滤波,平滑图像,但可能会使图像丢失细节input_img=medfilt2(input_img); %中值滤波消除孤⽴点[m,n]=size(input_img);output=zeros(m,n);if nargin==2if strcmp(method,'sobel')for i=2:m-1for j=2:n-1local_img=input_img(i-1:i+1, j-1:j+1);%近似边缘检测,加快速度 %output(i,j)=abs(sum(sum(sobel_x.*local_img)))+abs(sum(sum(sobel_x.*local_img)));output(i,j)=sqrt(sum(sum(sobel_x.*local_img))^2+sum(sum(sobel_y.*local_img))^2);endendelseif strcmp(method,'prewitt')for i=2:m-1for j=2:n-1local_img=input_img(i-1:i+1, j-1:j+1);output(i,j)=sqrt(sum(sum(prewitt_x.*local_img))^2+sum(sum(prewitt_y.*local_img))^2);endendelseerrordlg('maybe you should input sobel or prewitt');endelse %如果不输⼊算⼦的名称,默认使⽤roberts算⼦进⾏边缘检测for i=1:m-1for j=1:n-1output(i,j)=abs(input_img(i,j)-input_img(i+1,j+1))+ ...abs(input_img(i+1,j)-input_img(i,j+1));endendendoutput=imadjust(output);%使边缘图像更明显thresh=graythresh(output);%确定⼆值化阈值output=bwmorph(im2bw(output,thresh),'thin',inf);%强化细节end代码效果:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
matlab边缘检测步骤-回复Matlab边缘检测步骤边缘检测是计算机视觉和图像处理中常用的技术之一,它可以识别图像中不同区域之间的边界和轮廓。
边缘检测对于图像分割、物体识别和目标跟踪等应用非常重要。
Matlab作为一种强大的计算软件和编程语言,提供了一系列用于边缘检测的函数和工具。
在本文中,我们将逐步介绍Matlab 中进行边缘检测的步骤。
步骤一:读取图像首先,我们需要读取待处理的图像。
在Matlab中,可以使用imread函数来读取图像,并将其存储在一个变量中。
例如,下面的代码可以读取名为"image.jpg"的图像:image = imread('image.jpg');步骤二:灰度化在进行边缘检测之前,通常需要将彩色图像转换为灰度图像。
灰度图像只包含亮度信息,而不包含颜色信息,这样可以简化边缘检测的计算。
在Matlab中,可以使用rgb2gray函数将彩色图像转换为灰度图像。
下面的代码可以将前面读取的彩色图像转换为灰度图像:grayImage = rgb2gray(image);步骤三:滤波在进行边缘检测之前,通常需要对图像进行滤波,以平滑图像并去除噪声。
在Matlab中,有许多滤波器可以使用,例如高斯滤波器和中值滤波器。
可以使用imfilter函数来应用这些滤波器。
下面的代码可以将前一步得到的灰度图像应用高斯滤波器来平滑图像:filteredImage = imfilter(grayImage, fspecial('gaussian'));步骤四:计算梯度接下来,我们需要计算图像中每个像素的梯度。
梯度表示图像中像素灰度变化的方向和强度。
在Matlab中,可以使用gradient函数来计算梯度。
下面的代码可以计算前一步得到的滤波后图像的梯度:[gradX, gradY] = gradient(filteredImage);这里,gradX和gradY分别表示沿x和y轴方向的梯度。
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 %是否沿着像素块搜寻一圈了。