基础学习笔记之连通域处理函数(DOC)

基础学习笔记之连通域处理函数(DOC)
基础学习笔记之连通域处理函数(DOC)

前言

在图像处理过程中,经常会遇到这样一部分图像,图像的整体部分如果人来看的话一眼就能看出,但是它的内部由于有各种小缺口,导致断开了,这样在计算机“眼”里就被认为是断开的,为了使图像达到适应人眼的感觉,需要将这些缺口和断开的口给连接上去,这就需要用到计算机图形学中的连通域处理技术。本文给出一个简单的连通域处理函数,当然这个函数是来自OpenCV著名教程Learning OpenCV中,只不过它的接口是基于c版本的OpenCV,而到目前为止,基于C++接口的OpenCV已经是主流,所以我将其接口改成了c++版的,但是其内部一些代码基本没有动它。

开发环境:OpenCV2.4.3+QtCreator2.5.1

实验基础

首先来看这个连通域处理函数的形式:

void ConnectedComponents(Mat &mask_process, int poly1_hull0, float perimScale, int number = 0, Rect &bounding_box = Rect(), Point

&contour_centers = Point(-1, -1));

参数mask表示的是需要进行连通域处理二值图像。

参数poly1_hull0表示轮廓边缘是否采用多边形拟合,如果该参数为1,则表示采用多边形拟合,否则采用凸包拟合。

参数perimScale是用来将那些小的轮廓去掉,那些小的轮廓时指它的周长小于(mask长+宽)/perimScale。当然你在其内部代码也可以该为面积来判断。

参数num表示实际需要处理最多的轮廓的个数(如果输入的mask有多个轮廓的话),这里的处理是指计算出这些轮廓的外接矩形和中心点。默认值为0,表示函数内部不需要处理这些外接矩形和中心点。

参数bbs表示的是处理完后对应轮廓的外接矩形,默认值为Rect(),表示不需要返回这些外接矩形。

参数centers表示处理完后对应轮廓的中心点坐标,默认值为Point(-1, -1),表示不需要返回这些中心点。

C/C++知识点总结:

如果一些函数需要默认值的话,可以直接在函数定义的时候指定,该指定并不一定是具体的某个值,也可以是空值等等。另外在函数内部实现时,有时候要注意默认值的特殊性。

实验结果

所需处理原始图像的灰度图:

其对应的mask图像:

使用多项式拟合的连通域处理后图像:

使用凸包集拟合的连通域处理后的图像:

实验代码及注释(附录有工程code下载地址):

main.cpp:

#include

#include

using namespace cv;using namespace std;

//Just some convienience macros#define CV_CVX_WHITE

CV_RGB(0xff,0xff,0xff)#define CV_CVX_BLACK

CV_RGB(0x00,0x00,0x00)

void ConnectedComponents(Mat &mask_process, int poly1_hull0, float perimScale, int number = 0,

Rect &bounding_box = Rect(), Point &contour_centers = Point(-1, -1))

{

/*下面4句代码是为了兼容原函数接口,即内部使用的是c风格,但是其

接口是c++风格的*/

IplImage *mask = &mask_process.operator IplImage();

int *num = &number;

CvRect *bbs = &bounding_box.operator CvRect();

CvPoint *centers = &contour_centers.operator CvPoint();

static CvMemStorage* mem_storage = NULL;

static CvSeq* contours = NULL;

//CLEAN UP RAW MASK

//开运算作用:平滑轮廓,去掉细节,断开缺口

cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_OPEN, 1);//对输入mask进行开操作,CVCLOSE_ITR为开操作的次数,输出为mask

图像

//闭运算作用:平滑轮廓,连接缺口

cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_CLOSE, 1);//对输入mask进行闭操作,CVCLOSE_ITR为闭操作的次数,输出为mask

图像

//FIND CONTOURS AROUND ONLY BIGGER REGIONS

if( mem_storage==NULL ) mem_storage = cvCreateMemStorage(0);

else cvClearMemStorage(mem_storage);

//CV_RETR_EXTERNAL=0是在types_c.h中定义的,

CV_CHAIN_APPROX_SIMPLE=2也是在该文件中定义的

CvContourScanner scanner =

cvStartFindContours(mask,mem_storage,sizeof(CvContour),CV

_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);

CvSeq* c;

int numCont = 0;

//该while内部只针对比较大的轮廓曲线进行替换处理

while( (c = cvFindNextContour( scanner )) != NULL ) {

double len = cvContourPerimeter( c );

double q = (mask->height + mask->width)

/perimScale; //calculate perimeter len threshold

if( len < q ) //Get rid of blob if it's perimeter

is too small {

cvSubstituteContour( scanner, NULL ); //

用NULL代替原来的那个轮廓 }

else//Smooth it's edges if it's large enough {

CvSeq* c_new;

if(poly1_hull0) //Polygonal approximation of the segmentation

c_new =

cvApproxPoly(c,sizeof(CvContour),mem_storage,CV_POLY_APPR OX_DP, 2,0);

else//Convex Hull of the segmentation

c_new =

cvConvexHull2(c,mem_storage,CV_CLOCKWISE,1);

cvSubstituteContour( scanner, c_new ); //最开始的轮廓用凸包或者多项式拟合曲线替换

numCont++;

}

}

contours = cvEndFindContours( &scanner ); //结束轮廓查找操作

// PAINT THE FOUND REGIONS BACK INTO THE IMAGE

cvZero( mask );

IplImage *maskTemp;

//CALC CENTER OF MASS AND OR BOUNDING RECTANGLES

if(*num != 0)

{

int N = *num, numFilled = 0, i=0;

CvMoments moments;

double M00, M01, M10;

maskTemp = cvCloneImage(mask);

for(i=0, c=contours; c != NULL; c =

c->h_next,i++ ) //h_next为轮廓序列中的下一个轮廓

{

if(i < N) //Only process up to *num of them {

//CV_CVX_WHITE在本程序中是白色的意思

cvDrawContours(maskTemp,c,CV_CVX_WHITE,

CV_CVX_WHITE,-1,CV_FILLED,8);

//Find the center of each contour

if(centers != &cvPoint(-1, -1))

{

cvMoments(maskTemp,&moments,1); //计算mask图像的最高达3阶的矩

M00 =

cvGetSpatialMoment(&moments,0,0); //提取x的0次和y的0次矩

M10 =

cvGetSpatialMoment(&moments,1,0); //提取x的1次和y的0次矩

M01 =

cvGetSpatialMoment(&moments,0,1); //提取x的0次和y的1次矩

centers[i].x = (int)(M10/M00); //利用矩的结果求出轮廓的中心点坐标

centers[i].y = (int)(M01/M00);

}

//Bounding rectangles around blobs

if(bbs != &CvRect())

{

bbs[i] = cvBoundingRect(c); //算出

轮廓c的外接矩形 }

cvZero(maskTemp);

numFilled++;

}

//Draw filled contours into mask

cvDrawContours(mask,c,CV_CVX_WHITE,CV_CVX_WHITE,-1,CV_FIL LED,8); //draw to central mask

} //end looping over contours

*num = numFilled;

cvReleaseImage( &maskTemp);

}

//ELSE JUST DRAW PROCESSED CONTOURS INTO THE MASK

else

{

for( c=contours; c != NULL; c = c->h_next )

{

cvDrawContours(mask,c,CV_CVX_WHITE,

CV_CVX_BLACK,-1,CV_FILLED,8);

}

}

}

int main()

{

Mat src, mask;

src = imread("test.png", 0); //以灰度图像读入

imshow("src", src);

mask = src > 0; //转换为二值图像

imshow("mask", mask);

ConnectedComponents(mask, 1, 8.0, 1, Rect(), Point(-1, -1)); //采用多边形拟合处理

imshow("out1", mask);

ConnectedComponents(mask, 0, 8.0, 1, Rect(), Point(-1, -1)); //c采用凸包进行处理

imshow("out2", mask);

waitKey(0);

return0;

}

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

二值图像连通域标记算法与代码 这里列举二值图像连通域标记算法包括直接扫描标记算法和二值图像连通域标记快速算法 一、直接扫描标记算法把连续区域作同一个标记,常见的四邻域标记算法和八邻域标记算法。 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中的数值所在向量的位置。

高一函数定义域基础练习题

函数定义域练习题 1.函数)13lg(13)(2 ++-= x x x x f 的定义域是 ( ) A .(∞-,3 1-) B .(3 1- , 3 1) C .(3 1- ,1) D .(3 1- ,∞+) 2. 函数)1lg(11 )(++-= x x x f 的定义域是 ( ) A .(-∞,-1) B .(1,+∞) C .(-1,1)∪(1,+∞) D .R 3. 若函数) 12(log 1 )(2+= x x f ,则)(x f 的定义域为 ( ) A.)0,21(- B.),21(+∞- C.),0()0,21(+∞?- D.)2,2 1 (- 4 函数y = ( ) A.( 34 ,1) B( 34 ,∞) C (1,+∞) D. ( 34 ,1)∪(1,+∞) 5. 已知()f x = 1 1 +x ,则函数(())f f x 的定义域是 ( ) A .{|1}x x ≠- B .{|2}x x ≠- C .{|12}x x x ≠-≠-且 D .{|12}x x x ≠-≠-或 6. 函数=y =R ,则k 的取值范围是 ( ) A.09k k ≥≤-或 B.1k ≥ C.91k -≤≤ D. 01k <≤ 7.函数23)(x x x f -=的定义域为 ( ) A .[0,3 2 ] B .[0,3] C .[-3,0] D .(0,3) 8.若函数()f x 的定义域为[,]a b ,且0b a >->,则函数()()()g x f x f x =--的定义域是 ( ) A .[,]a b B .[,]b a -- C .[,]b b - D .[,]a a - 9.设I =R ,已知2 ()lg(32)f x x x =-+的定义域为F ,函数()lg(1)lg(2)g x x x =-+-的定义域为G , 那么GU I C F 等于 ( ) A .(2,+∞) B .(-∞,2) C .(1,+ ∞) D .(1,2)U(2,+∞) 10.已知函数)(x f 的定义域为[0,4],求函数)()3(2 x f x f y ++=的定义域为 ( ) A .[2,1]-- B .[1,2] C .[2,1]- D .[1,2]- 11.若函数()f x 的定义域为[-2,2] ,则函数f 的定义域是 ( ) A .[-4,4] B .[-2,2] C . [0,2] D . [0,4] 12.已知函数1()lg 1x f x x +=-的定义域为A ,函数()lg(1)lg(1)g x x x =+--的定义域为B ,则下述关于 A 、 B 的关系中,不正确的为 ( ) A .A ? B B .A ∪B=B C .A∩B=B D .B ?≠A 13. 函数y =-x 2-3x +4x 的定义域为 ( ) A .[-4,1] B .[-4,0) C .(0,1] D .[-4,0)∪(0,1] 14. 若函数f (x )=(a 2-2a -3)x 2+(a -3)x +1的定义域和值域都为R ,则a 的取值范围是 ( ) A .a =-1或3 B .a =-1 C .a > 3或a <-1 D .-1 < a < 3 15. 若函数y =f (x )的定义域是[0,2],则函数 g (x )= 21 f x x ()-的定义域是 ( ) A. [0,1] B. [0,1) C. [0,1)∪(1,4] D. (0,1)

基于FPGA的二值图像连通域标记快速算法实现

基于FPGA的二值图像连通域标记快速算法实现 摘要:在图像自动目标识别和跟踪过程中,首先对图像目标进行阈值分割提取,得到的二值图像通常包含多个连通区域,系统利用图像目标的形状特性对可疑高威胁的飞行目标进行自动识别。因此,需要对各连通区域块进行分别检测判断,本文采用改进的适合FPGA实现的快速标记算法对各连通域进行检测提取。 关键词:FPGA,二值图像连通域,快速标记算法,可编程逻辑 贺明 1 引言 在图像自动目标识别和跟踪过程中,首先对图像目标进行阈值分割提取,得到的二值图像通常包含多个连通区域,系统利用图像目标的形状特性对可疑高威胁的飞行目标进行自动识别。因此,需要对各连通区域块进行分别检测判断,本文采用改进的适合FPGA实现的快速标记算法对各连通域进行检测提取。 实现二值图像连通体检测通常采用的方法有下几种[1] [2] [3]:区域生长法:首先对图像进行逐行(列)扫描,每遇到一个未标记的“1”像素点,就分配其一个未使用过的标号,然后对其领域进行检测,如有未标记过的“1”像素,则赋予相同的标号。反复进行这一操作.直到不存在应该传播标号的“1”像素。然后继续图像行(列)扫描,如检测判未标记的“1”像素则赋予其新的标号,并进行与以上相同的处理。整个图像扫描结束,算法也就终止。这种方法可准确地检测出各种类型的连通体.但处理时间也较长.因为要逐一检测每一“1”像素的邻域,且出现“1”像素的重复扫描。跟踪算法:二值图像中每个取值为“1”的像素被标记一个与其坐标相关的标号,如由n,m串构成的数。热后,扫描标记后的图像,并将每十像素的标号改为其邻域内的最小标号。反复执行这个过程,直到不需要作标记更改为止。用这种方法处理小而凸的目标时,收敛速度较慢。 本文以适合FPGA实现为目的,提出一种具有计算规则性的快速二值图像连通域标记算法。与传统的二值图像标记算法相比,该算法具有运算简单性、规则性和可扩展性的特点,适合以FPGA实现。选用在100MHz工作时钟下,处理384×288像素的红外图像能够达到400帧/秒以上的标记速度,足够满足实时目标识别系统的要求。处理速度可以满足大部分实时目标识别系统的要求。该算法同样可以软件编程方式应用于嵌入式DSP系统中。 2 算法描述 首先,在进行标记算法以前,利用硬件开辟独立的图像标记缓存和连通关系数组,接着在视频流的采集传输过程中,以流水线的方式按照视频传输顺序对图像进行逐行像素扫描,然后对每个像素的邻域分别按照逆时针方向和水平方向进行连通性检测和等价标记关系合并,检测出的结果对标记等价数组和标记缓存进行更新,在一帧图像采集传输结束后,得到图像的

高中数学-函数定义域、值域求法总结

函数定义域、值域求法总结 一.求函数的定义域需要从这几个方面入手: (1)分母不为零 (2)偶次根式的被开方数非负。 (3)对数中的真数部分大于0。 (4)指数、对数的底数大于0,且不等于1 (5)y=tanx 中x ≠k π+π/2;y=cotx 中x ≠k π等等。 ( 6 )0x 中x 0≠ 二、值域是函数y=f(x)中y 的取值范围。 常用的求值域的方法: (1)直接法 (2)图象法(数形结合) (3)函数单调性法 (4)配方法 (5)换元法 (包括三角换元)(6)反函数法(逆求法) (7)分离常数法 (8)判别式法 (9)复合函数法 (10)不等式法 (11)平方法等等 这些解题思想与方法贯穿了高中数学的始终。 定义域的求法 1、直接定义域问题 例1 求下列函数的定义域: ① 2 1 )(-=x x f ;② 23)(+=x x f ;③ x x x f -+ +=211)( 解:①∵x-2=0,即x=2时,分式 2 1 -x 无意义, 而2≠x 时,分式 21 -x 有意义,∴这个函数的定义域是{}2|≠x x . ②∵3x+2<0,即x<-32 时,根式23+x 无意义, 而023≥+x ,即3 2 -≥x 时,根式23+x 才有意义, ∴这个函数的定义域是{x |3 2 -≥x }.

③∵当0201≠-≥+x x 且,即1-≥x 且2≠x 时,根式1+x 和分式x -21 同时有意义, ∴这个函数的定义域是{x |1-≥x 且2≠x } 另解:要使函数有意义,必须: ? ??≠-≥+0201x x ? ???≠-≥21 x x 例2 求下列函数的定义域: ①14)(2 --= x x f ②2 14 3)(2-+--= x x x x f ③= )(x f x 11111++ ④x x x x f -+= 0)1()( ⑤3 7 3132+++-=x x y 解:①要使函数有意义,必须:142 ≥-x 即: 33≤≤-x ∴函数14)(2--= x x f 的定义域为: [3,3-] ②要使函数有意义,必须:???≠-≠-≤≥?? ??≠-+≥--131 40210432x x x x x x x 且或 4133≥-≤<--

二值化图像8联通域标记

//基于区域生长法的连通域标记(C语言) 区域生长法利用区域生长的思想,一次生长过程可以标记一整个连通区,只需对图像进行一次扫描就能标记出所有连通区。算法描述如下: Step1、输入待标记图像bitmap(二值化原图,SDRAM内,u16,只有0x0000与0xffff),初始化一个与输入图像同样尺寸的标记矩阵labelmap(SDRAM内,大小与二值化原图相同,u16,初值0x0000),一个队列queue(SDRAM内,大小与二值化原图相同)以及标记计数labelIndex (unsigned char,最大值255,初值0); Step2、按从左至右、从上至下的顺序扫描bitmap,当扫描到一个未被标记的前景像素p时(0xffff,2个字节,unsigned short int),labelIndex加1,并在labelmap中标记p(相应点的值赋为labelIndex),同时,扫描p的八邻域点,若存在未被标记的前景像素,则在labelmap 中进行标记,并放入queue中,作为区域生长的种子; Step3、当queue不为空时,从queue中取出一个生长种子点p1,扫描p1的八邻域点,若存在未被标记过的前景像素,则在labelmap中进行标记,并放入queue中; Step4、重复Step3直至queue为空,一个连通区标记完成; Step5、转到Step2,直至整幅图像被扫描完毕,得到标记矩阵labelmap和连通区的个数labelIndex。 该算法最坏情况下,将对每个像素点都进行一次八邻域搜索,算法复杂度为O(n)。 //辅助队列 typedef struct QNode { int data; struct QNode *next; }QNode; typedef struct Queue { struct QNode* first; struct QNode* last; }Queue; void PushQueue(Queue *queue, int data) { QNode *p = NULL; //p = (QNode*)malloc(sizeof(QNode)); p->data = data; if(queue->first == NULL) { queue->first = p; queue->last = p; p->next = NULL; } else

函数定义域与值域经典类型总结 练习题 含答案

<一>求函数定义域、值域方法和典型题归纳 一、基础知识整合 1.函数的定义:设集合A 和B 是非空数集,按照某一确定的对应关系f ,使得集合A 中任意一个数x,在集合B 中都有唯一确定的数f(x)与之对应。则称f:为A 到B 的一个函数。 2.由定义可知:确定一个函数的主要因素是①确定的对应关系(f ),②集合A 的取值范围。由这两个条件就决定了f(x)的取值范围③{y|y=f(x),x ∈A}。 3.定义域:由于定义域是决定函数的重要因素,所以必须明白定义域指的是: (1)自变量放在一起构成的集合,成为定义域。 (2)数学表示:注意一定是用集合表示的范围才能是定义域,特殊的一个个的数时用“列举法”;一般表示范围时用集合的“描述法”或“区间”来表示。 4.值域:是由定义域和对应关系(f )共同作用的结果,是个被动变量,所以求值域时一定注意求的是定义域范围内的函数值的范围。 (1)明白值域是在定义域A 内求出函数值构成的集合:{y|y=f(x),x ∈A}。 (2)明白定义中集合B 是包括值域,但是值域不一定为集合B 。 二、求函数定义域 (一)求函数定义域的情形和方法总结 1已知函数解析式时:只需要使得函数表达式中的所有式子有意义。 (1)常见情况简总: ①表达式中出现分式时:分母一定满足不为0; ②表达式中出现根号时:开奇次方时,根号下可以为任意实数;开偶次方时,根号下满足大于或等于0(非负数)。 ③表达式中出现指数时:当指数为0时,底数一定不能为0. ④根号与分式结合,根号开偶次方在分母上时:根号下大于0. ⑤表达式中出现指数函数形式时:底数和指数都含有x ,必须满足指数底数大于0且不等于1.(0<底数<1;底数>1) ⑥表达式中出现对数函数形式时:自变量只出现在真数上时,只需满足真数上所有式子大于0,且式子本身有意义即可;自变量同时出现在底数和真数上时,要同时满足真数大于0,底数要大于0且不等于 1. (2 ()log (1)x f x x =-) 注:(1)出现任何情形都是要注意,让所有的式子同时有意义,及最后求的是所有式子解集的交集。

求函数定义域练习题

函数定义域练习题 1、在函数 中,自变量x 的取值范围是( ) A 、x≠0 B 、x≤﹣2 C 、x≥﹣3且x≠0 D 、x≤2且x≠0 2、函数的定义域是( ) A 、x≠2 B 、x≥﹣2 C 、x≠﹣2 D 、x≠0 3、函数y= 的自变量x 的取值范围是( ) A 、x≥﹣2 B 、x≥﹣2且x≠﹣1 C 、x≠﹣1 D 、x >﹣1 4、在函数y= 中,自变量x 取值范围是( ) A 、x >1 B 、x <﹣1 C 、x≠﹣1 D 、x≠1 5、函数 的自变量x 的取值范围为( ) A 、x≥﹣2 B 、x >﹣2且x≠2 C 、x≥0且≠2 D 、x≥﹣2且x≠2 6. 函数 2()lg(31)f x x =++的定义域是( ) A .1(,)3-∞- B .11(,)33- C .1(,1)3- D .1(,)3 -+∞ 8 函数=y =R ,则k 的取值范围是( ) A.09k k ≥≤-或 B.1k ≥ C.91k -≤≤ D. 01k <≤ 9 .函数 ()f x =的定义域为( ) A .2[0,]3 B .[0,3] C .[3,0]- D .(0,3) 10.已知函数()f x 的定义域为[0,4],求函数2(3)()y f x f x =++的定义域为( ) A .[2,1]-- B .[1,2] C .[2,1]- D .[1,2]- 11.若函数()f x 的定义域为[2,2]- ,则函数f 的定义域是( ) .[4,4]A - .[2,2]B - .[0,2]C .[0,4]D 12.已知函数1()lg 1x f x x +=-的定义域为A ,函数()lg(1)lg(1)g x x x =+--的定义域为B ,则下述关于A 、B 的关系中,不正确的为( ) A .A B ? B .A B B = C .A B B = D .B ?≠A

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

二值图像连通域标记算法与代码收藏 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,则

求函数定义域练习题

函数定义域练习题 1. 函数2()lg(31)f x x = ++的定义域是( ) A .1(,)3-∞- B .11(,)33- C .1(,1)3- D .1(,)3-+∞ 2. 已知1()1f x x =+,则函数(())f f x 的定义域是( ). A .{|1}x x ≠- B .{|2}x x ≠- C .{|12}x x x ≠-≠-且 D .{|12}x x x ≠-≠-或 3. 函数=y =R , 则k 的取值范围是( ) A.09k k ≥≤-或 B.1k ≥ C.91k -≤≤ D. 01k <≤ 4 .函数()f x =的定义域为( ) A .2 [0,]3 B .[0,3] C .[3,0]- D .(0,3) 5.若函数()f x 的定义域为[,]a b ,且0b a >->,则函数()()()g x f x f x =--的定义域是( ) A .[,]a b B .[,]b a -- C .[,]b b - D .[,]a a - 6.已知函数()f x 的定义域为[0,4],求函数2(3)()y f x f x =++的定义域为( ) A .[2,1]-- B .[1,2] C .[2,1]- D .[1,2]- 7.若函数()f x 的定义域为[2,2]- ,则函数f 的定义域是( ) .[4,4]A - .[2,2]B - .[0,2]C .[0,4]D 8.已知函数1()lg 1x f x x +=-的定义域为A ,函数 ()lg(1)lg(1)g x x x =+--的定义域为B ,则下述关于A 、B 的关系中,不正确的为( )

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

第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),则依次判断该像素点的

函数的基本概念与定义域

学生: 科目: 第 阶段第 次课 教师: 课 题 函数的基本概念与定义域 教学目标 1.了解函数的的基本概念,并能熟练的应用 2.理解函数的三种表示方法,了解分段函数,并能够简单的应用 3.会求函数的定义域 重点、难点 函数的定义的理解;求简单函数的定义域 考点及考试要求 1.了解函数的概念; 2.理解函数的三种表示方法; 3.了解简单的分段函数 教学内容 知识框架 知识点一、区间的概念 设b a R b a <∈且,, 定义 名称 符号 数轴表示 }|{b x a x ≤≤ 闭区间 ],[b a }|{b x a x << 开区间 ),(b a }|{b x a x <≤ 前闭后开区间 ),[b a }|{b x a x ≤< 前开后闭区间 ],(b a 区间是集合的有一种形式.对于区间的理解应注意: (1)区间的左端点必修小于右端点,有时我们将b -a 成为区间的长度,对于只有一个元素的集合我们仍然用集合来表示,如{}a ; (2)注意开区间),(b a 与点),(b a 在具体情景中的区别.若表示点),(b a 的集合应为{}),(b a ; (3)用数轴来表示区间时,要特别注意实心点与空心点的区别; (4)对于一个不等式的解集,我们既可以用集合形式来表示,也可用区间形式来表示; (5)要注意区间表示实数集的几条原则,数集是连续的,左小,右大,开或闭不能混淆. 例1.把下列数集用区间表示: (1)}1|{-≥x x ;(2)}0|{

例5.高为h ,底面半径为R 的圆柱形容器内,以单位时间内体积为a 的速度灌水.试求水面高 y 用时间t 表示的函数式,并求其定义域. 例6.已知函数3 2 3 41 ++-=ax ax ax y 的定义域为R ,求实数a 的取值范围. 例7.设}20|{},20|{≤≤=≤≤=y y N x x M ,下图中的四个图形,其中能表示从集合M 到集合N 的函数关系的有( ) 知识点四、抽象函数的定义域【拓展】 (1)函数)(x f 的定义域是指x 的取值范围; (2)函数))((x g f 的定义域是指x 的取值范围,而不是)(x g 的取值范围; (3)已知))((x g f 的定义域为B ,求)(x f 的定义域,其实质是已知))((x g f 中x 的取值范围为B ,求出)(x g 的范围(值域),此范围就是)(x f 的定义域. 例8.已知函数)(x f 的定义域为]9,0[,求)12(+x f 的定义域.

《高一数学必修1》函数的概念、定义域、值域练习题(含答案)

函数的概念、定义域、值域练习题 班级:高一(3)班 姓名: 得分: 一、选择题(4分×9=36分) 1.集合A ={x |0≤x ≤4},B ={y |0≤y ≤2},下列不表示从A 到B 的函数是( ) A .f (x )→y =12x B .f (x )→y =13x C .f (x )→y =23 x D .f (x )→y =x 2.函数y =1-x 2+x 2-1的定义域是( ) A .[-1,1] B .(-∞,-1]∪[1,+∞) C .[0,1] D .{-1,1} 3.已知f (x )的定义域为[-2,2],则f (x 2-1)的定义域为( ) A .[-1,3] B .[0,3] C .[-3,3] D .[-4,4] 4.若函数y =f (3x -1)的定义域是[1,3],则y =f (x )的定义域是( ) A .[1,3] B .[2,4] C .[2,8] D .[3,9] 5.函数y =f (x )的图象与直线x =a 的交点个数有( ) A .必有一个 B .一个或两个 C .至多一个 D .可能两个以上 6.函数f (x )=1ax 2+4ax +3 的定义域为R ,则实数a 的取值范围是( ) A .{a |a ∈R } B .{a |0≤a ≤34} C .{a |a >34} D .{a |0≤a <34} 7.某汽车运输公司购买了一批豪华大客车投入运营.据市 场分析,每辆客车营运的利润y 与营运年数x (x ∈N )为二次函数 关系(如图),则客车有营运利润的时间不超过( )年. A .4 B .5 C .6 D .7 8.(安徽铜陵县一中高一期中)已知g (x )=1-2x ,f [g (x )]=1-x 2x 2(x ≠0),那么f ????12等于( ) A .15 B .1 C .3 D .30 9.函数f (x )=2x -1,x ∈{1,2,3},则f (x )的值域是( ) A .[0,+∞) B .[1,+∞) C .{1,3,5} D .R

计算机图形学四连通区域种子填充算法实验

《计算机图形学实验》报告 任课教师:钱文华 2016年春季学期 实验:四连通区域种子填充算法 实验时间:2016年12月8日 实验地点:信息学院2204 实验目的:掌握种子填充算法的原理,并会用种子填充算法和opengl

并结合使用c++语言编写程序绘制多边形。 实验原理:种子填充算法又称为边界填充算法。其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。内点的检测条件:if(interiorColor!=borderColor&&interiorColor!=fillColor)。 种子填充算法常用四连通域和八连通域技术进行填充操作。从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。 一般来说,八向连通算法可以填充四向连通区域,而四向连通算法有时不能填充八向连通区域。 四向连通填充算法: a)种子像素压入栈中; b)如果栈为空,则转e);否则转c); c)弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈; d)转b); e)结束。

四连通填充算法利用到了递归的思想。 本实验只包括四连通填充算法 程序代码:#include #include #include #include void init(void) { glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,300.0,0.0,300.0); } void setPixel(int x,int y,long fillColor){ glColor3f(fillColor<<16,fillColor<<8,fillColor); glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); } void boundaryFill4(int x,int y,long fillColor,long borderColor) { unsigned char params[3]; long interiorColor; glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_BYTE,params); interiorColor=RGB(params[0],params[1],params[2]); if(interiorColor!=borderColor&&interiorColor!=fillColor)

函数定义域值域经典习题及答案

复合函数定义域和值域练习题 一、 求函数的定义域 1、求下列函数的定义域: ⑴33 y x = +- (2 )01(21)111 y x x = +-++ - 2、设函数的定义域为,则函数的定义域为_ _ _;函数 的定义域为________; 3、若函数(1)f x +的定义域为 ,则函数(21)f x -的定义域是 ;函 数1 (2)f x +的定义域为 。 4、 已知函数 的定义域为 [1,1]-,且函数()()()F x f x m f x m =+--的定义域存在, 求实数m 的取值范围。 二、求函数的值域 5、求下列函数的值域: ⑴223y x x =+- ()x R ∈ ⑵223y x x =+- [1,2]x ∈ ⑶31 1x y x -= + ⑷311 x y x -=+ (5)x ≥ ⑸ y = 三、求函数的解析式 1、 已知函数2(1)4f x x x -=-,求函数()f x ,(21)f x +的解析式。 2、 已知()f x 是二次函数,且2(1)(1)24f x f x x x ++-=-,求()f x 的解析式。

3、已知函数()f x 满足2()()34f x f x x +-=+,则()f x = 。 4、设 ()f x 是R 上的奇函数,且当[0,)x ∈+∞时, ()(1f x x =+,则当(,0)x ∈-∞时 ()f x =____ _ ()f x 在R 上的解析式为 5、设()f x 与()g x 的定义域是{|,1}x x R x ∈≠±且,()f x 是偶函数,()g x 是奇函数,且 1 ()()1 f x g x x += -,求()f x 与()g x 的解析表达式 四、求函数的单调区间 6、求下列函数的单调区间: ⑴ 223y x x =++ ⑵ y = ⑶ 261y x x =-- 7、函数()f x 在[0,)+∞上是单调递减函数,则2(1)f x -的单调递增区间是 8、函数236 x y x -= +的递减区间是 ;函数y =的递减 区间是 五、综合题 9、判断下列各组中的两个函数是同一函数的为 ( ) ⑴3 ) 5)(3(1+-+= x x x y , 52-=x y ; ⑵111-+=x x y , )1)(1(2-+=x x y ; ⑶ x x f =)(, 2)(x x g = ; ⑷x x f =)(, ()g x =; ⑸ 2 1)52()(-=x x f , 52)(2-=x x f 。 A 、⑴、⑵ B 、 ⑵、⑶ C 、 ⑷ D 、 ⑶、⑸ 10、若函数()f x = 3 44 2 ++-mx mx x 的定义域为R ,则实数m 的取值范围是 ( ) A 、(-∞,+∞) B 、(0,43] C 、(43,+∞) D 、[0, 4 3 )

相关文档
最新文档