连通域的几何特征-程序

连通域的几何特征-程序
连通域的几何特征-程序

附录二

RGB = imread('F:/01054.png'); % 读入一幅彩色图像

figure,imshow(RGB); % 显示彩色图像

I = rgb2gray(RGB); % 转换为灰度图像

threshold = graythresh(I); %求阈值

bw 1= im2bw(I,threshold); %使用阈值变换法将灰度图转换成二值图像figure,imshow(bw1) %显示转化后的二值图像

Bw1 = bwareaopen(bw1,30); %删除二值图像bw中面积小于30的对象

se = strel('disk',2); %构造结构模板

bw 1= imclose(bw1,se); %闭运算,填补轮廓线

Bw1 = imfill(bw1,'holes'); %填充图像区域和“空洞”

figure,imshow(bw1)

bw=uint8(bw1) %数据类型转换

ed=edge(bw); % 边缘化

figure,imshow(ed) %ed为获得的边缘图像

L = bwlabel(bw); %贴标签

L1 = bwlabel(ed);

Ar=zeros(1,max(L(:))); %取L中所有元素,赋0值

perimeter=zeros(1,max(L1(:)));

metric=zeros(1,max(L1(:)));

Pwl=zeros(1,max(L1(:)));

Pr=zeros(1,max(L1(:)));

for i=1:max(L(:))

Ar(i)=sum(bw(L==i)); %面积

perimeter(i)=sum(ed(L==i)); %周长

metric(i) = 4*pi*Ar(i)/perimeter(i)^2; %圆形度

[y,x]=find(L==i); %找出L中等于i的点的坐标

x0=min(x(:));

x1=max(x(:));

y0=min(y(:));

y1=max(y(:));

hold on %新画图像之后不想覆盖原图像就要加上hold on rectangle('Position',[x0,y0,x1-x0,y1-y0],'edgeColor','g','LineWidth',1)

if x1-x0>=y1-y0

Pwl(i)=(x1-x0)/(y1-y0); %长宽比

else

Pwl(i)=(y1-y0)/(x1-x0); %长宽比

end

Pr(i)=Ar(i)/((y1-y0)*(x1-x0)); %矩形度

end

Ar

perimeter

metric

Pwl

Pr

二值图像连通域标记算法与代码

二值图像连通域标记算法与代码 这里列举二值图像连通域标记算法包括直接扫描标记算法和二值图像连通域标记快速算法 一、直接扫描标记算法把连续区域作同一个标记,常见的四邻域标记算法和八邻域标记算法。 1、四邻域标记算法: 1)判断此点四邻域中的最左,最上有没有点,如果都没有点,则表示一个新的区域的开始。 2)如果此点四邻域中的最左有点,最上没有点,则标记此点为最左点的值;如果此点四邻域中的最左没有点,最上有点,则标记此点为最上点的值。 3)如果此点四邻域中的最左有点,最上都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 2、八邻域标记算法: 1)判断此点八邻域中的最左,左上,最上,上右点的情况。如果都没有点,则表示一个新的区域的开始。 2)如果此点八邻域中的最左有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 3)如果此点八邻域中的左上有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 4)否则按照最左,左上,最上,上右的顺序,标记此点为四个中的一个。代码实现: #include #include #include //连通区域属性结构 typedef struct tagMarkRegion { std::list MarkPointList;//点列表 RECT rect; }MarkRegion; //定义MarkMap 结构,用来存放等价对 typedef struct tagEqualMark { int MarkValue1; //标记值 int MarkValue2; //标记值 } EqualMark; //定义MarkMapping 结构,用来存放标记映射关系 typedef struct tagMarkMapping

(整理)MATLAB 标注连通域.

matlab 标注连通域 clear; clc; f=imread('c:\1.jpg'); gray_level=graythresh(f); f=im2bw(f,gray_level); [l,n]=bwlabel(f,8) imshow(f) hold on for k=1:n [r,c]=find(l==k); rbar=mean(r); cbar=mean(c); plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10); plot(cbar,rbar,'Marker','*','MarkerEdgecolor','w'); end 主要概念: 1. 2.4连接 8连接 0 1 0 1 p 1 ===> 4连接,p为当前像素点。 0 1 0 1 1 1 1 p 1 ====》8连接,p为当前像素点。 1 1 1 3.bwlabel()函数 语法: [ L, num]=bwlabel(f,conn) 其中f是一副二值图像,conn用来指定期望的连接(不是4就是8),默认为8,输出L称为标记矩阵,参数num给出所找到连接分量的总数。 4.find()函数 该函数非常有用,会返回指定条件的索引值,在标记矩阵中的作用是返回对应对象的索引。 I = FIND(X) returns the linear indices corresponding to the nonzero entries of the array X. X may be a logical expression. Use IND2SUB(SIZE(X),I) to calculate multiple subscripts from the linear indices I. find(bwlabel(bw)==2)表示的意思是连通域2中的数值所在向量的位置。

二值图像连通域标记算法与代码 收藏

二值图像连通域标记算法与代码收藏 10:19:42二值图像连通域标记算法与代码 这里列举二值图像连通域标记算法包括直接扫描标记算法和二值图像连通域标记快速算法 一、直接扫描标记算法把连续区域作同一个标记,常见的四邻域标记算法和八邻域标记算法。 1、四邻域标记算法: 1)判断此点四邻域中的最左,最上有没有点,如果都没有点,则表示一个新的区域的开始。 2)如果此点四邻域中的最左有点,最上没有点,则标记此点为最左点的值;如果此点四邻域中的最左没有点,最上有点,则标记此点为最上点的值。 3)如果此点四邻域中的最左有点,最上都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 2、八邻域标记算法: 1)判断此点八邻域中的最左,左上,最上,上右点的情况。如果都没有点,则表示一个新的区域的开始。 2)如果此点八邻域中的最左有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 3)如果此点八邻域中的左上有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 4)否则按照最左,左上,最上,上右的顺序,标记此点为四个中的一个。 代码实现: #include #include #include //连通区域属性结构 typedef struct tagMarkRegion

{ std::list MarkPointList;//点列表 RECT rect; }MarkRegion; //定义MarkMap 结构,用来存放等价对 typedef struct tagEqualMark { int MarkValue1; //标记值 int MarkValue2; //标记值 } EqualMark; //定义MarkMapping 结构,用来存放标记映射关系typedef struct tagMarkMapping { int nOriginalMark; //第一次扫描的标记 int nMappingMark; //等价整理之后对应标记 } MarkMapping; /* 功能说明:八连通标记 参数说明:I,表示图像数据指针 ImageWidth,表示图像宽 ImageHeight,表示图像高

计算连通域的面积

计算连通域的面积 matlab函数_连通区域 1、 matlab函数bwareaopen——删除小面积对象 格式:BW2 = bwareaopen(BW,P,conn) 作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。 算法: (1)Determine the connected components. L = bwlabeln(BW, conn); (2)Compute the area of each component. S = regionprops(L, 'Area'); (3)Remove small objects. bw2 = ismember(L, find([S.Area] >= P)); 2、matlab函数bwarea——计算对象面积 格式:total = bwarea(BW) 作用:估计二值图像中对象的面积。 注:该面积和二值图像中对象的像素数目不一定相等。 3、matlab函数imclearborder——边界对象抑制 格式:IM2 = imclearborder(IM,conn) 作用:抑制和图像边界相连的亮对象。若IM是二值图,imclearborder将删除和图像边界相连的对象。默认情况conn=8。 注:For grayscale images, imclearborder tends to reduce the overall intensity level in addition to suppressing border structures. 算法: (1)Mask image is the input image. (2)Marker image is zero everywhere except along the border, where it equals the mask image. 4、matlab函数bwboundaries——获取对象轮廓 格式:B = bwboundaries(BW,conn)(基本格式) 作用:获取二值图中对象的轮廓,和OpenCV中cvFindContours函数功能类似。B是一个P ×1的cell数组,P为对象个数,每个cell 是Q×2的矩阵,对应于对象轮廓像素的坐标。 5、matlab函数imregionalmin——获取极小值区域 格式:BW = imregionalmin(I,conn) 作用:寻找图像I的极小值区域(regional maxima),默认情况conn=8。 Regional minima are connected components of pixels with a constant intensity value, and whose external boundary pixels all have a higher value. 6、matlab函数bwulterode——距离变换的极大值 格式:BW2 = bwulterode(BW,method,conn) 作用:终极腐蚀。寻找二值图像BW的距离变换图的区域极大值(regional maxima)。用于距离变换的距离默认为euclidean,连通性为8邻域。

二值图像连通域标记快速算法实现

二值图像连通域标记快速算法实现 算法描述 首先,在进行标记算法以前,利用硬件开辟独立的图像标记缓存和连通关系数组,接着在视频流的采集传输过程中,以流水线的方式按照视频传输顺序对图像进行逐行像素扫描,然后对每个像素的邻域分别按照逆时针方向和水平方向进行连通性检测和等价标记关系合并,检测出的结果对标记等价数组和标记缓存进行更新,在一帧图像采集传输结束后,得到图像的初步标记结果以及初步标记之间的连通关系,最后,根据标号对连通关系数组从小到大的传递过程进行标号的归并,利用归并后的连通关系数组对图像标记缓存中的标号进行替换,替换后的图像为最终标记结果,并且连通域按照扫描顺序被赋予唯一的连续自然数。 图 1 标记算法流程 本文快速二值图像连通域标记算法分为三个环节: 1.图像初步标记:为每个像素赋予临时标记,并且将临时标记的等价关系记录在等价表中 2.整理等价表:这一环节分为两个步骤: (1)将具有等价关系的临时标记全部等价为其中的最小值; (2)对连通区域以自然数顺序重新编号,得到临时标记与最终标记之间的等价关系。 3.图像代换:对图像进行逐像素代换,将临时标记代换为最终标记.经过3个环节处理后,算法输出标记后的图像,图像中连通域按照由上到下,由左至右出现的顺序被标以连续的自然数。 1 图像初始标记 标记算法符号约定:算法在逆时钟方向检测连通域时用w1,w2表示连续两行的图像数据,在紧接着的顺时钟方向连通域检测时用k0,k表示连续两行经过

逆时钟方向标记后的图像数据。其在工作窗口的位置在图2、3中分别说明;对初始逆时针方向临时标记用Z表示。Z初始标记值为1。 二值图像连通域标记算法采用8连通判断准则,通过缩小标记范围剔除了图像的边界效应。为了简化标记处理过程,使标记处理在硬件对一帧图像传输操作时间内结束,标记处理利用中间数据缓存分为连续的两种类型,其中类型1用于直接图像序列传输,硬件发起图像序列传输时,类型1采用逆时钟顺序连通域检测,对2×3工作窗口中的二值像素进行初始标记。类型2对经过类型1初始标记过的图像数据再进行水平方向的连通域检测和归并,然后把标记结果存入图像存储区。 图像初始标记类型1: 步骤1读取像素w1(2)、w1(1)、w1(0)、w0(2)、w0(1),以及相应的二值像素值。 步骤2读取像素w0(1),按照逆时针方向依次与w1(0)、w1(1)、w1(2)、w0(2)比较,若w0(1)= w1(0),则k0(1)=k(2);若w0(1)= w1(1),则k0(1)=k(1);若w0(1)= w1(2),则k0(1)=k(0);若w0(1)= w0(2),则k0(1)=k0(0);否则(即w0(1)≠(w1(2)、w1(1)、w1(0)、w0(2)),k0(1)= Z;Z ++。 步骤3写入等价关系表,以Z为地址将Z写入等价关系数组。 图 2 逆时钟方向初始标记的工作窗 图像初始标记类型2: 步骤1判断经过逆时针方向标记后,如果w0(1)= w0(2)= 1,而标记灰度k0(1)≠k0(0),则进行下一步骤。 步骤2 假设k0(1)> k0(0),判断lab(k0(1))=k0(1)或者lab(k0(1))=k0(0),则lab(k0(1))=k0(0),否则对标记数组进行追踪置换。跳转至步骤3。 步骤3 假设k0(1)< k0(0),判断lab(k0(0))=k0(0)或者lab(k0(0))=k0(1),则lab(k0(0))=k0(1),否则对标记数组进行追踪置换。 追踪置换方法:步骤2的追踪置换令t= lab(k0(0));若lab(t)≠t,则

基于连通域算法的区域测量

第8卷 第9期 2008年5月1671-1819(2008)9-2492-03  科 学 技 术 与 工 程 S c i e n c e T e c h n o l o g ya n d E n g i n e e r i n g  V o l .8 N o .9 M a y 2008 2008 S c i .T e c h .E n g n g . 基于连通域算法的区域测量 李仪芳 刘景琳 (广东技术师范学院电子与信息学院,广州510665) 摘 要 基于数字图像处理的原理,提出用八连通域算法对有多个连通区域的二值图像进行面积测量。通过逐行逐列地扫描图像,按照一定的规则标记连通区域,得到对象的个数,同时统计每个区域所含的像素,通过标尺转换可以得出区域的面积。结果表明,该算法能有效地提取八连通区域,可用于计算显微图像颗粒物的面积和粒径。关键词 区域标记 像素测量 八连通域算法中图法分类号 T P 391.77; 文献标识码 A 2008年1月21日收到 广东省第二批产业技术研究研发计划 项目(2007B 010200041)资助 第一作者简介:李仪芳(1983—),女,广东三水人,广东技术师范学院助教,硕士,研究方向:图像处理和光电技术。E -m a i l :a n g e l i -n a 2008@y a h o o .c o m .c n 二值图像中连通域的提取是图像处理和分析中的一个重要处理过程,可以用于显微图像的对象识别和测量,红外图像的目标定位等领域。灰度图像经过阈值分割后常包括多个连通的区域,需要将连通区域搜索标记出来以便测量。但常见算法是关于四连通区域的研究,其中文献[1,2]中描述或采用的是区域标号法,但文献[1]中描述的算法在实现时并不能达到预定的结果。而且区域生长法计算复杂度过高;像素标记法和行程标记法必须全部扫描完图像才能得到连通域,随着图像幅度和连通域个数的增加,计算复杂度增长。现提出用八连通域算法 [3] ,它不仅能在对图像一次扫描中标记连 通域即计算对象的个数,而且可实现边扫描边提取像素,即累计每个连通域所含像素的个数。 1 区域标记 算法实现逐行逐列扫描,对图像内每个连通的黑色区域进行标记操作,求得对象的数目。图1为6×12图像点阵,图中有三个连通区域,即三个对 象,分别用1,2,3标号。设前景点灰度取1,背景点取值为0。在算法中,定义了多个数组N (i ),其中i 代表连通区域的标号,∑N (i )表示区域内部包含的像素个数。如第1个区域,∑N (1)=7;对第2个区域,∑N (2)=6。下面以标记区域1为例,说明标记的具体算法。 图1 八连通域算法说明图 ① 初始化N (i )=0,i =0。② 从左到右,从上到下逐行扫描图像;如果没有遇到“1”,则继续扫描。若遇到“1”,如(1,1),则依次判断该像素点的

相关主题
相关文档
最新文档