图形形状获取图像处理_判断几何图形形状 图像处理 - CSDN
  • 图像处理最早出现于 20 世纪 50 年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。数字图像处理作为一门学科大约形成于 20 世纪 60 年代初期。早期的图像处理的目的是改善图像的...

      数字图像处理是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。图像处理最早出现于 20 世纪 50 年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。数字图像处理作为一门学科大约形成于 20 世纪 60 年代初期。早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。图像处理中,输入的是质量低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等。

    数字图像处理常用方法:

    1 )图像变换:由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理(如傅立叶变换可在频域中进行数字滤波处理)。目前新兴研究的小波变换在时域和频域中都具有良好的局部化特性,它在图像处理中也有着广泛而有效的应用。

    2 )图像编码压缩:图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。

    3 )图像增强和复原:图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型”,再采用某种滤波方法,恢复或重建原来的图像。

    4 )图像分割:图像分割是数字图像处理中的关键技术之一。图像分割是将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。

    5 )图像描述:图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。对于特殊的纹理图像可采用二维纹理特征描述。随着图像处理研究的深入发展,已经开始进行三维物体描述的研究,提出了体积描述、表面描述、广义圆柱体描述等方法。

    6 )图像分类(识别):图像分类(识别)属于模式识别的范畴,其主要内容是图像经过某些预处理(增强、复原、压缩)后,进行图像分割和特征提取,从而进行判决分类。图像分类常采用经典的模式识别方法,有统计模式分类和句法(结构)模式分类,近年来新发展起来的模糊模式识别和人工神经网络模式分类在图像识别中也越来越受到重视。

    图像的基本属性

       亮度:也称为灰度,它是颜色的明暗变化,常用 0 %~ 100 % ( 由黑到白 ) 表示。以下三幅图是不同亮度对比。

    亮度对图像色彩的影响

       对比度:是画面黑与白的比值,也就是从黑到白的渐变层次。比值越大,从黑到白的渐变层次就越多,从而色彩表现越丰富。

    对比度对图像色彩表现的影响

       直方图:表示图像中具有每种灰度级的象素的个数,反映图像中每种灰度出现的频率。图像在计算机中的存储形式,就像是有很多点组成一个矩阵,这些点按照行列整齐排列,每个点上的值就是图像的灰度值,直方图就是每种灰度在这个点矩阵中出现的次数。我们可以具体看一下下面两个不同图形的灰度直方图:

     

    直方图均衡化

       通过灰度变换将一幅图像转换为另一幅具有均衡直方图的图像,即在一定灰度范围内具有相同的象素点数的图像的过程。下面是直方图均衡化前后的图形变化以及直方图变化:

    图像的加减运算

       两幅图像的加减运算:对图像进行加减运算,就是将图像对应的存储矩形点列上的灰度值进行加减运算。图像相加可以将一幅图像的内容加到另一幅图像上,可以实现二次曝光,也可一对同一个场景的多幅图像求平均值,这样可以降低噪声。图像相减可以用于运动检测或去除图像中不需要的加性图案。

       图像的加法示例:图中运算为: (a)+(b)=(c)

    a
    b
    c

       图像的减法运算示例:图中运算为 (a)-(b)=(c)

    a
    b
    c

    图像的噪声

       图像的噪声:就像对于听觉而言,在打电话时对方说话我们有时候会听到很嘈杂的噪声,以至于听不清楚对方在说什么。同样的,对于图像,原本我们可以很清晰的看到一幅图像,但是有时候图像上会有一些我们不需要的图案,使我们无法很清楚的看清一幅图,这就是图像的噪声。

    常用的图像去噪声方法

       常用的去噪方法:主要是采用滤波器对带噪声图像进行滤波处理。

    带噪声的图
    算术平均滤波后的图
    中值滤波后的图
    无噪声图

     

     

    数字图像处理技术的应用

       随着计算机技术的发展,图像处理技术已经深入到我们生活中的方方面面,其中,在娱乐休闲上的应用已经深入人心。图像处理技术在娱乐中的应用主要包括:电影特效制作、电脑电子游戏、数码相机、视频播放、数字电视等

       电影特效制作:自从 20 世纪 60 年代以来,随着电影中逐渐运用了计算机技术,一个全新的电影世界展现在人们面前,这也是一次电影的革命。越来越多的计算机制作的图像被运用到了电影作品的制作中。其视觉效果的魅力有时已经大大超过了电影故事的本身。如今,我们已经很难发现在一部电影中没有任何的计算机数码元素。

       电脑电子游戏:电脑电子游戏的画面,是近年来电子游戏发展最快的部分之一。从 1996 年到现在,游戏画面的进步简直可以用突飞猛进来形容,随着图像处理技术的发展,众多在几年前无法想象的画面在今天已经成为了平平常常的东西。

       数码相机:所谓数码相机,是一种能够进行拍摄,并通过内部处理把拍摄到的景物转换成以数字格式存放图像的特殊照相机。与普通相机不同,数码相机并不使用胶片,而是使用固定的或者是可拆卸的半导体存储器来保存获取的图像。数码相机可以直接连接到计算机、电视机或者打印机上。在一定条件下,数码相机还可以直接接到移动式电话机或者手持 PC 机上。由于图像是内部处理的,所以使用者可以马上检查图像是否正确,而且可以立刻打印出来或是通过电子邮件传送出去。

       视频播放与数字电视:家庭影院中的 VCD , DVD 播放器和数字电视中,大量使用了视频编码解码等图像处理技术,而视频编码解码等图像处理技术的发展,也推动了视频播放与数字电视象高清晰,高画质发展。

    展开全文
  • 图像处理基本算法之形状特征

    千次阅读 2019-08-29 14:46:04
    Reference:图像处理基本算法之形状特征 下文是在原文基础上进行修改的,具体可以查看原文。 (一)形状特征 (一)特点:各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们...

    Reference:图像处理基本算法之形状特征

    下文是在原文基础上进行修改的,具体可以查看原文。

    (一)形状特征

      (一)特点:各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果往往不太可靠;③许多形状特征仅描述了目标局部的性质,要全面描述目标常对计算时间和存储量有较高的要求;④许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。另外,从 2-D 图像中表现的 3-D 物体实际上只是物体在空间某一平面的投影,从 2-D 图像中反映出来的形状常不是 3-D 物体真实的形状,由于视点的变化,可能会产生各种失真。

     

    (二)常用的特征提取与匹配方法

     

    Ⅰ几种典型的形状特征描述方法

     

    通常情况下,形状特征有两类表示方法,一类是轮廓特征,另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征则关系到整个形状区域。

     

    几种典型的形状特征描述方法:

    (1)边界特征法该方法通过对边界特征的描述来获取图像的形状参数。其中Hough 变换检测平行直线方法和边界方向直方图方法是经典方法。Hough 变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法,其基本思想是点—线的对偶性;边界方向直方图法首先微分图像求得图像边缘,然后,做出关于边缘大小和方向的直方图,通常的方法是构造图像灰度梯度方向矩阵。

    (2)傅里叶形状描述符法

     

    傅里叶形状描述符(Fourier shape descriptors)基本思想是用物体边界的傅里叶变换作为形状描述,利用区域边界的封闭性和周期性,将二维问题转化为一维问题。

     

    由边界点导出三种形状表达,分别是曲率函数、质心距离、复坐标函数。

     

    (3)几何参数法

     

    形状的表达和匹配采用更为简单的区域特征描述方法,例如采用有关形状定量测度(如矩、面积、周长等)的形状参数法(shape factor)。在 QBIC 系统中,便是利用圆度、偏心率、主轴方向和代数不变矩等几何参数,进行基于形状特征的图像检索。

     

    需要说明的是,形状参数的提取,必须以图像处理及图像分割为前提,参数的准确性必然受到分割效果的影响,对分割效果很差的图像,形状参数甚至无法提取。

     

    (4)形状不变矩法

     

    利用目标所占区域的矩作为形状描述参数。

     

    (5)其它方法

     

    近年来,在形状的表示和匹配方面的工作还包括有限元法(Finite Element Method 或 FEM)、旋转函数(Turning Function)和小波描述符(Wavelet Descriptor)等方法。

     

    实际上,只是提取物体的形状,这并不难,最难的是这些特征该怎么用!

    特征嘛,自然是讲此物区分彼物的特点。

    那么假如,给出了一系列不同形状物体的轮廓该如何识别出他们呢?正方形,圆形,矩形,椭圆,不规则图形,再进一步,这些图形由于受到信号的干扰,有噪声存在时,该如何去识别他们呢?

    那就可以使用形状的特征了,我们定义一些参数,来描述这些形状。

    1 矩形度:R = A0/A; A0为区域面积,A为区域最小外接矩形面积。

    那么R = 1 时,为矩形的概率很大,R = PI/4时为圆的可能性最大

    2 体态比 T = a/b;

    a b 分别为区域最小外接矩形的长和宽。

    T = 1 为正方形或者圆形,

    T>1 为细长图形

    3 球状性 S = Ri/Rc

    Ri Rc分别为内切圆和外接圆半径,圆心都在中心上

    4 球状性 C = Ur/Pr

    Ur 为区域重心到轮廓点的平均距离

    Pr 为区域重心到轮廓点的均方差

    5 中心矩

    这一特征,使用颇为频繁,OpenCV有专门的函数求解(p,q)次矩

    6 长轴 短轴

    最小外接矩形的长轴和短轴

    7面积

    一般会作为阈值使用,判定某个区域的面积在两个阈值之间才判定有效

     

     下面给出各个形状特征的求法:

    //图像的形状特征分析
    #include <cv.h>
    #include <cxcore.h>
    #include <highgui.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	IplImage *src = cvLoadImage("E:\\image\\mapleleaf.tif",0);
    	IplImage *image = cvCreateImage(cvGetSize(src),8,3); 
    	image = cvCloneImage(src);
    	cvNamedWindow("src",1);
    	cvNamedWindow("dst",1);
    	cvShowImage("src",src);
    
    	CvMemStorage *storage = cvCreateMemStorage(0);
    	CvSeq * seq = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), storage);
    	CvSeq * tempSeq = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), storage);
    	//新图,将轮廓绘制到dst
    	IplImage *dst = cvCreateImage(cvGetSize(src),8,3); 
    	cvZero(dst);//赋值为0
    	double length,area;
    
    	//获取轮廓
    	int cnt = cvFindContours(src,storage,&seq);//返回轮廓的数目
    	cout<<"number of contours   "<<cnt<<endl;
    	
    	//计算边界序列的参数 长度 面积 矩形 最小矩形 
    	//并输出每个边界的参数
    	CvRect rect;
    	CvBox2D box;
    	double axislong,axisShort;//长轴和短轴
    	double temp1= 0.0,temp2 = 0.0;
    	double Rectangle_degree;//矩形度
    	double long2short;//体态比
    	double x0,y0;
    	long sumX  = 0 ,sumY = 0;
    	double sum =0.0;
    	int i,j,m,n;
    	unsigned char* ptr;
    
    	double UR;//区域重心到轮廓的平均距离
    	double PR;//区域重心到轮廓点的均方差
    	CvPoint * contourPoint; 
    	int count = 0;
    	double CDegree;//圆形性
    
    	CvPoint *A,*B,*C;
    	double AB,BC,AC;
    	double cosA,sinA;
    	double tempR,inscribedR;
    	
    	for (tempSeq = seq;tempSeq != NULL; tempSeq = tempSeq->h_next)
    	{
    		//tempSeq = seq->h_next;
    		length = cvArcLength(tempSeq);
    		area = cvContourArea(tempSeq);
    		cout<<"Length = "<<length<<endl;
    		cout<<"Area = "<<area<<endl;
    		cout<<"num of point "<<tempSeq->total<<endl;
    		//外接矩形
    		rect = cvBoundingRect(tempSeq,1);
    		
    
    		//绘制轮廓和外接矩形
    		cvDrawContours(dst,tempSeq,CV_RGB(255,0,0),CV_RGB(255,0,0),0);
    		cvRectangleR(dst,rect,CV_RGB(0,255,0));
    		cvShowImage("dst",dst);
    		//cvWaitKey();
    
    		//绘制轮廓的最小外接圆 
    		CvPoint2D32f center;//亚像素精度 因此需要使用浮点数
    		float radius;
    		cvMinEnclosingCircle(tempSeq,¢er,&radius);
    		cvCircle(dst,cvPointFrom32f(center),cvRound(radius),CV_RGB(100,100,100));
    		cvShowImage("dst",dst);
    		//cvWaitKey();
    
    		//寻找近似的拟合椭圆 可以使斜椭圆
    		CvBox2D ellipse = cvFitEllipse2(tempSeq);
    		cvEllipseBox(dst,ellipse,CV_RGB(255,255,0));
    		cvShowImage("dst",dst);
    		//cvWaitKey();
    
    
    		//绘制外接最小矩形
    		CvPoint2D32f pt[4];
    		box = cvMinAreaRect2(tempSeq,0);
    		cvBoxPoints(box,pt);
    		for(int i = 0;i<4;++i){
    			cvLine(dst,cvPointFrom32f(pt[i]),cvPointFrom32f(pt[((i+1)%4)?(i+1):0]),CV_RGB(0,0,255));
    		}
    		cvShowImage("dst",dst);
    		//cvWaitKey();
    
    
    		//下面开始分析图形的形状特征 
    		//长轴 短轴
    		temp1 = sqrt(pow(pt[1].x -pt[0].x,2) + pow(pt[1].y -pt[0].y,2));
    		temp2 = sqrt(pow(pt[2].x -pt[1].x,2) + pow(pt[2].y -pt[1].y,2));
    
    		if (temp1 > temp2)
    		{
    			axislong = temp1;
    			axisShort=temp2;
    		} 
    		else
    		{
    			axislong = temp2;
    			axisShort=temp1;
    		}
    		
    		cout<<"long axis: "<<axislong<<endl;
    		cout<<"short axis: "<<axisShort<<endl;
    		//矩形度 轮廓面积和最小外接矩形面积(可以是斜矩形)之比
    		Rectangle_degree = (double)area/(axisShort*axislong);
    
    		cout<<"Rectangle degree :"<<Rectangle_degree<<endl;
    		//体态比or长宽比 最下外接矩形的长轴和短轴的比值
    		long2short = axislong/axisShort;
    		cout<<"ratio of long axis to short axis: "<<long2short<<endl;
    		//球状性 由于轮廓的内切圆暂时无法求出先搁置 
    		//先求内切圆半径 枚举任意轮廓上的三个点,半径最小的就是内切圆的半径
    		//以下的最大内切圆半径求法有误 待改进
    		
    		/*
    		for (int i = 0 ; i< tempSeq->total -2;i++)
    		{
    			for (int j= i+1; j<tempSeq->total-1;j++)
    			{
    				for (int m = j+1; m< tempSeq->total; m++)
    				{
    					//已知圆上三点,求半径
    					A = (CvPoint*)cvGetSeqElem(tempSeq ,i);
    					B = (CvPoint*)cvGetSeqElem(tempSeq ,j);
    					C = (CvPoint*)cvGetSeqElem(tempSeq,m);
    					AB = sqrt(pow((double)A->x - B->x,2)+ pow((double)A->y - B->y,2));
    					AC =sqrt(pow((double)A->x - C->x,2) + pow((double)A->y - C->y,2));
    					BC = sqrt(pow((double)B->x - C->x,2)+ pow((double)B->y - C->y,2));
    
    					cosA = ((B->x - A->x)*(C->x - A->x) + (B->y - A->y)*(C->y - A->y))/(AB*AC);
    					sinA = sqrt(1 - pow(cosA,2));
    					tempR = BC/(2*sinA);
    
    					if (m == 2)
    					{
    						inscribedR = tempR;
    					} 
    					else
    					{
    						if (tempR < inscribedR)
    						{
    							inscribedR = tempR;
    						}
    					}
    
    
    				}
    			}
    		}
    
    		//输出最大内切圆半径
    		cout<<"radius of max inscribed circle  "<<inscribedR<<endl;
    		*/
    		//圆形性 假设轮廓内是实心的
    		//球区域中心x0 y0
    		sumX = 0;
    		sumY = 0;
    		src = cvCloneImage(image);
    		for (int i = 0 ; i< src->height;i++)
    		{
    			for (int j = 0; j< src->width;j++)
    			{
    				ptr = (unsigned char *)src->imageData + i*src->widthStep + j;
    				if ((*ptr) > 128)
    				{
    					sumX += (long)j;
    					sumY += (long)i;
    				}
    
    			}
    		}
    		x0 = sumX/area;
    		y0 = sumY/area;
    		cout<<"center of gravity "<<x0<<"   "<<y0<<endl;
         //求区域到重心的平均距离
    		sum = 0;
    		count = 0;
    		for (m = 0 ; m< tempSeq->total;m++)
    		{
    			contourPoint = (CvPoint*)cvGetSeqElem(tempSeq,m);
    			sum += sqrt(pow(contourPoint->x - x0,2)+ pow(contourPoint->y - y0,2));
    			count++;
    		}
    		UR = sum/count;
    		cout<<"mean distance to center of gravity"<<UR<<endl;
    		//求区域重心到轮廓点的均方差
    		sum = 0;
    		for (m = 0 ; m< tempSeq->total;m++)
    		{
    			contourPoint = (CvPoint*)cvGetSeqElem(tempSeq,m);
    			temp1 = sqrt(pow(contourPoint->x - x0,2)+ pow(contourPoint->y - y0,2));
    			sum += pow(temp1 - UR,2);
    		}
    		PR = sum/count;
    		cout<<"mean square error of distance to center of gravity"<<PR<<endl;
    		//圆形性 
    		CDegree= UR/PR;
            cout<<"degree of circle "<<CDegree<<endl;
    		//中心距
    		
    		cvWaitKey(0);
    	}
    	
    	
    	cvReleaseImage(&src);
    	cvReleaseImage(&dst);
    	cvReleaseMemStorage(&storage);	
    	
    	return 0;
    }

     

     

    展开全文
  • 搞了CV一段时间,仍时不时因为概念问题而困惑,搞不清楚计算机视觉(Computer Vision),计算机图形学(Computer Graphics)和图像处理(Image Processing)的区别和联系。在知乎上看到了一个帖子,觉得解释的很好,结合...

    搞了CV一段时间,仍时不时因为概念问题而困惑,搞不清楚计算机视觉(Computer Vision),计算机图形学(Computer Graphics)和图像处理(Image Processing)的区别和联系。在知乎上看到了一个帖子,觉得解释的很好,结合自己的理解,形成此文存档。

    ##1.基本概念
    从定义理解概念是最严谨的。所以首先搞清楚维基百科中这些概念的定义。

    计算机视觉(CV):

    Computer vision is a field that includes methods for acquiring, processing, analyzing, and understanding images and, in general, high-dimensional data from the real world in order to produce numerical or symbolic information, e.g., in the forms of decisions.[1]

    直译过来就是

    计算机视觉是一个学科/领域,它包括获取、处理、分析和理解图像或者更一般意义的真实世界的高维数据的方法;它的目的是产生决策形式的数字或者符号信息。

    计算机图像学(CG):

    Computer graphics is a sub-field of computer science which studies methods for digitally synthesizing and manipulating visual content. Although the term often refers to the study of three-dimensional computer graphics, it also encompasses two-dimensional graphics and image processing.[2]

    直译过来就是

    计算机图形学是计算机科学的一个子领域,它包括数字合成和操作可视内容(图像、视频)的方法。尽管这个术语通常指三维计算机图形学的研究,但它也包括二维图形学和图像处理。

    图像处理(IP):

    In imaging science, image processing is processing of images using mathematical operations by using any form of signal processing for which the input is an image, such as a photograph or video frame; the output of image processing may be either an image or a set of characteristics or parameters related to the image.[3]

    直译过来就是

    在图像科学中,图像处理是用任何信号处理等数学操作处理图像的过程,输入时图像(摄影图像或者视频帧),输出是图像或者与输入图像有关的特征、参数的集合。

    ##2.区别和联系[4]
    ###2.1 精简的概括

    Computer Graphics和Computer Vision是同一过程的两个方向。Computer Graphics将抽象的语义信息转化成图像,Computer Vision从图像中提取抽象的语义信息。Image Processing探索的是从一个图像或者一组图像之间的互相转化和关系,与语义信息无关。

    ###2.2 从输入输出角度看
    ####(1)区别
    Computer Graphics,简称 CG 。输入的是对虚拟场景的描述,通常为多边形数组,而每个多边形由三个顶点组成,每个顶点包括三维坐标、贴图坐标、rgb 颜色等。输出的是图像,即二维像素数组。

    Computer Vision,简称 CV。输入的是图像或图像序列,通常来自相机、摄像头或视频文件。输出的是对于图像序列对应的真实世界的理解,比如检测人脸、识别车牌。

    Digital Image Processing,简称 DIP。输入的是图像,输出的也是图像。Photoshop 中对一幅图像应用滤镜就是典型的一种图像处理。常见操作有模糊、灰度化、增强对比度等。

    ####(2)联系
    CG 中也会用到 DIP,现今的三维游戏为了增加表现力都会叠加全屏的后期特效,原理就是 DIP,只是将计算量放在了显卡端。

    CV 更是大量依赖 DIP 来打杂活,比如对需要识别的照片进行预处理。

    最后还要提到近年来的热点——增强现实(AR),它既需要 CG,又需要 CV,当然也不会漏掉 DIP。它用 DIP 进行预处理,用 CV 进行跟踪物体的识别与姿态获取,用 CG 进行虚拟三维物体的叠加。

    ####(3)图解
    这里还有一张图,简明地表达了CV、CG、DIP和AI的区别和联系。
    区别和联系

    2.3 从问题本身看

    (1)区别

    从问题本身来说,这三者主要以两类问题区分:是根据状态模拟观测环境,还是根据观测的环境来推测状态。假设观测是Z,状态是X:Computer Graphics是一个Forwad Problem (Z|X): 给你光源的位置,物体形状,物体表面信息,你如何根据已有的变量的状态模拟出一个环境出来。

    Computer Vision正好相反,是一个Inverse Problem (X|Z):你所有能得到的都是观测信息(measurements), 根据得到的每一个Pixel的信息(颜色,深度),我要来估计物体环境的特征和状态出来,比如物体运动(Tracking),三维结构(SFM),物体类别(Classification and Segmentation)等等。

    对于Image Processing来说,它恰好介于两者之间,两种问题都有。但对于State-of-art的研究来说,Image Processing更偏于Computer Vision, 或者看上去更像Computer Vision的子类。尽管这三类研究中,随着CV领域的不断进步,以及越来越高级相机传感器出现(Depth Camera, Event Camera),很多算法都被互相用到,但是从Motivation来看,并没有太大变化。

    (2)联系

    得益于这几个领域的共同进步,所以你能看到Graphics和Computer Vision现在出现越来越多的交集。如果根据观测量(图片),Computer Vision可以越来越准确的估计出越来越多的变量,那么这些变量套到Graphics算法中,就可以模拟出一个跟真实环境一样的场景出来。

    与此同时,Graphics需要构建更真实的场景,也希望能够将变量更加接机与实际,或者通过算法估计出来,这就引入了Vision的动机。这也是近年来三维重建算法,同时大量发表在Graphics和Vision的会议的原因。随着CV从2D向3D发展,以后两者的交集会越来越大,除了learning以外的其他很多问题融合并到一个领域我也不会奇怪。

    ##参考文献
    [1] https://en.wikipedia.org/wiki/Computer_vision
    [2]https://en.wikipedia.org/wiki/Computer_graphics_(computer_science)
    [3] https://en.wikipedia.org/wiki/Image_processing
    [4] 张静, 知乎,
    http://www.zhihu.com/question/20672053/answer/15854031

    展开全文
  • 图像处理基本算法 形状特征

    万次阅读 多人点赞 2012-02-24 23:08:03
     (一)特点:各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果...

    形状特征

      (一)特点:各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果往往不太可靠;③许多形状特征仅描述了目标局部的性质,要全面描述目标常对计算时间和存储量有较高的要求;④许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。另外,从 2-D 图像中表现的 3-D 物体实际上只是物体在空间某一平面的投影,从 2-D 图像中反映出来的形状常不是 3-D 物体真实的形状,由于视点的变化,可能会产生各种失真。

     

    (二)常用的特征提取与匹配方法

     

    Ⅰ几种典型的形状特征描述方法

     

    通常情况下,形状特征有两类表示方法,一类是轮廓特征,另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征则关系到整个形状区域。

     

    几种典型的形状特征描述方法:

     

    (1)边界特征法该方法通过对边界特征的描述来获取图像的形状参数。其中Hough 变换检测平行直线方法和边界方向直方图方法是经典方法。Hough 变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法,其基本思想是点—线的对偶性;边界方向直方图法首先微分图像求得图像边缘,然后,做出关于边缘大小和方向的直方图,通常的方法是构造图像灰度梯度方向矩阵。

     

    (2)傅里叶形状描述符法

     

    傅里叶形状描述符(Fourier shape descriptors)基本思想是用物体边界的傅里叶变换作为形状描述,利用区域边界的封闭性和周期性,将二维问题转化为一维问题。

     

    由边界点导出三种形状表达,分别是曲率函数、质心距离、复坐标函数。

     

    (3)几何参数法

     

    形状的表达和匹配采用更为简单的区域特征描述方法,例如采用有关形状定量测度(如矩、面积、周长等)的形状参数法(shape factor)。在 QBIC 系统中,便是利用圆度、偏心率、主轴方向和代数不变矩等几何参数,进行基于形状特征的图像检索。

     

    需要说明的是,形状参数的提取,必须以图像处理及图像分割为前提,参数的准确性必然受到分割效果的影响,对分割效果很差的图像,形状参数甚至无法提取。

     

    (4)形状不变矩法

     

    利用目标所占区域的矩作为形状描述参数。

     

    (5)其它方法

     

    近年来,在形状的表示和匹配方面的工作还包括有限元法(Finite Element Method 或 FEM)、旋转函数(Turning Function)和小波描述符(Wavelet Descriptor)等方法。

     

    实际上,只是提取物体的形状,这并不难,最难的是这些特征该怎么用!

    特征嘛,自然是讲此物区分彼物的特点。

    那么假如,给出了一系列不同形状物体的轮廓该如何识别出他们呢?正方形,圆形,矩形,椭圆,不规则图形,再进一步,这些图形由于受到信号的干扰,有噪声存在时,该如何去识别他们呢?

    那就可以使用形状的特征了,我们定义一些参数,来描述这些形状。

    1 矩形度:R = A0/A; A0为区域面积,A为区域最小外接矩形面积。

    那么R = 1 时,为矩形的概率很大,R = PI/4时为圆的可能性最大

    2 体态比 T = a/b;

    a b 分别为区域最小外接矩形的长和宽。

    T = 1 为正方形或者圆形,

    T>1 为细长图形

    3 球状性 S = Ri/Rc

    Ri Rc分别为内切圆和外接圆半径,圆心都在中心上

    4 球状性 C = Ur/Pr

    Ur 为区域重心到轮廓点的平均距离

    Pr 为区域重心到轮廓点的均方差

    5 中心矩

    这一特征,使用颇为频繁,OpenCV有专门的函数求解(p,q)次矩

    6 长轴 短轴

    最小外接矩形的长轴和短轴

    7面积

    一般会作为阈值使用,判定某个区域的面积在两个阈值之间才判定有效

     

     下面给出各个形状特征的求法:

    //图像的形状特征分析
    #include <cv.h>
    #include <cxcore.h>
    #include <highgui.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	IplImage *src = cvLoadImage("E:\\image\\mapleleaf.tif",0);
    	IplImage *image = cvCreateImage(cvGetSize(src),8,3); 
    	image = cvCloneImage(src);
    	cvNamedWindow("src",1);
    	cvNamedWindow("dst",1);
    	cvShowImage("src",src);
    
    	CvMemStorage *storage = cvCreateMemStorage(0);
    	CvSeq * seq = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), storage);
    	CvSeq * tempSeq = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), storage);
    	//新图,将轮廓绘制到dst
    	IplImage *dst = cvCreateImage(cvGetSize(src),8,3); 
    	cvZero(dst);//赋值为0
    	double length,area;
    
    	//获取轮廓
    	int cnt = cvFindContours(src,storage,&seq);//返回轮廓的数目
    	cout<<"number of contours   "<<cnt<<endl;
    	
    	//计算边界序列的参数 长度 面积 矩形 最小矩形 
    	//并输出每个边界的参数
    	CvRect rect;
    	CvBox2D box;
    	double axislong,axisShort;//长轴和短轴
    	double temp1= 0.0,temp2 = 0.0;
    	double Rectangle_degree;//矩形度
    	double long2short;//体态比
    	double x0,y0;
    	long sumX  = 0 ,sumY = 0;
    	double sum =0.0;
    	int i,j,m,n;
    	unsigned char* ptr;
    
    	double UR;//区域重心到轮廓的平均距离
    	double PR;//区域重心到轮廓点的均方差
    	CvPoint * contourPoint; 
    	int count = 0;
    	double CDegree;//圆形性
    
    	CvPoint *A,*B,*C;
    	double AB,BC,AC;
    	double cosA,sinA;
    	double tempR,inscribedR;
    	
    	for (tempSeq = seq;tempSeq != NULL; tempSeq = tempSeq->h_next)
    	{
    		//tempSeq = seq->h_next;
    		length = cvArcLength(tempSeq);
    		area = cvContourArea(tempSeq);
    		cout<<"Length = "<<length<<endl;
    		cout<<"Area = "<<area<<endl;
    		cout<<"num of point "<<tempSeq->total<<endl;
    		//外接矩形
    		rect = cvBoundingRect(tempSeq,1);
    		
    
    		//绘制轮廓和外接矩形
    		cvDrawContours(dst,tempSeq,CV_RGB(255,0,0),CV_RGB(255,0,0),0);
    		cvRectangleR(dst,rect,CV_RGB(0,255,0));
    		cvShowImage("dst",dst);
    		//cvWaitKey();
    
    		//绘制轮廓的最小外接圆 
    		CvPoint2D32f center;//亚像素精度 因此需要使用浮点数
    		float radius;
    		cvMinEnclosingCircle(tempSeq,¢er,&radius);
    		cvCircle(dst,cvPointFrom32f(center),cvRound(radius),CV_RGB(100,100,100));
    		cvShowImage("dst",dst);
    		//cvWaitKey();
    
    		//寻找近似的拟合椭圆 可以使斜椭圆
    		CvBox2D ellipse = cvFitEllipse2(tempSeq);
    		cvEllipseBox(dst,ellipse,CV_RGB(255,255,0));
    		cvShowImage("dst",dst);
    		//cvWaitKey();
    
    
    		//绘制外接最小矩形
    		CvPoint2D32f pt[4];
    		box = cvMinAreaRect2(tempSeq,0);
    		cvBoxPoints(box,pt);
    		for(int i = 0;i<4;++i){
    			cvLine(dst,cvPointFrom32f(pt[i]),cvPointFrom32f(pt[((i+1)%4)?(i+1):0]),CV_RGB(0,0,255));
    		}
    		cvShowImage("dst",dst);
    		//cvWaitKey();
    
    
    		//下面开始分析图形的形状特征 
    		//长轴 短轴
    		temp1 = sqrt(pow(pt[1].x -pt[0].x,2) + pow(pt[1].y -pt[0].y,2));
    		temp2 = sqrt(pow(pt[2].x -pt[1].x,2) + pow(pt[2].y -pt[1].y,2));
    
    		if (temp1 > temp2)
    		{
    			axislong = temp1;
    			axisShort=temp2;
    		} 
    		else
    		{
    			axislong = temp2;
    			axisShort=temp1;
    		}
    		
    		cout<<"long axis: "<<axislong<<endl;
    		cout<<"short axis: "<<axisShort<<endl;
    		//矩形度 轮廓面积和最小外接矩形面积(可以是斜矩形)之比
    		Rectangle_degree = (double)area/(axisShort*axislong);
    
    		cout<<"Rectangle degree :"<<Rectangle_degree<<endl;
    		//体态比or长宽比 最下外接矩形的长轴和短轴的比值
    		long2short = axislong/axisShort;
    		cout<<"ratio of long axis to short axis: "<<long2short<<endl;
    		//球状性 由于轮廓的内切圆暂时无法求出先搁置 
    		//先求内切圆半径 枚举任意轮廓上的三个点,半径最小的就是内切圆的半径
    		//以下的最大内切圆半径求法有误 待改进
    		
    		/*
    		for (int i = 0 ; i< tempSeq->total -2;i++)
    		{
    			for (int j= i+1; j<tempSeq->total-1;j++)
    			{
    				for (int m = j+1; m< tempSeq->total; m++)
    				{
    					//已知圆上三点,求半径
    					A = (CvPoint*)cvGetSeqElem(tempSeq ,i);
    					B = (CvPoint*)cvGetSeqElem(tempSeq ,j);
    					C = (CvPoint*)cvGetSeqElem(tempSeq,m);
    					AB = sqrt(pow((double)A->x - B->x,2)+ pow((double)A->y - B->y,2));
    					AC =sqrt(pow((double)A->x - C->x,2) + pow((double)A->y - C->y,2));
    					BC = sqrt(pow((double)B->x - C->x,2)+ pow((double)B->y - C->y,2));
    
    					cosA = ((B->x - A->x)*(C->x - A->x) + (B->y - A->y)*(C->y - A->y))/(AB*AC);
    					sinA = sqrt(1 - pow(cosA,2));
    					tempR = BC/(2*sinA);
    
    					if (m == 2)
    					{
    						inscribedR = tempR;
    					} 
    					else
    					{
    						if (tempR < inscribedR)
    						{
    							inscribedR = tempR;
    						}
    					}
    
    
    				}
    			}
    		}
    
    		//输出最大内切圆半径
    		cout<<"radius of max inscribed circle  "<<inscribedR<<endl;
    		*/
    		//圆形性 假设轮廓内是实心的
    		//球区域中心x0 y0
    		sumX = 0;
    		sumY = 0;
    		src = cvCloneImage(image);
    		for (int i = 0 ; i< src->height;i++)
    		{
    			for (int j = 0; j< src->width;j++)
    			{
    				ptr = (unsigned char *)src->imageData + i*src->widthStep + j;
    				if ((*ptr) > 128)
    				{
    					sumX += (long)j;
    					sumY += (long)i;
    				}
    
    			}
    		}
    		x0 = sumX/area;
    		y0 = sumY/area;
    		cout<<"center of gravity "<<x0<<"   "<<y0<<endl;
         //求区域到重心的平均距离
    		sum = 0;
    		count = 0;
    		for (m = 0 ; m< tempSeq->total;m++)
    		{
    			contourPoint = (CvPoint*)cvGetSeqElem(tempSeq,m);
    			sum += sqrt(pow(contourPoint->x - x0,2)+ pow(contourPoint->y - y0,2));
    			count++;
    		}
    		UR = sum/count;
    		cout<<"mean distance to center of gravity"<<UR<<endl;
    		//求区域重心到轮廓点的均方差
    		sum = 0;
    		for (m = 0 ; m< tempSeq->total;m++)
    		{
    			contourPoint = (CvPoint*)cvGetSeqElem(tempSeq,m);
    			temp1 = sqrt(pow(contourPoint->x - x0,2)+ pow(contourPoint->y - y0,2));
    			sum += pow(temp1 - UR,2);
    		}
    		PR = sum/count;
    		cout<<"mean square error of distance to center of gravity"<<PR<<endl;
    		//圆形性 
    		CDegree= UR/PR;
            cout<<"degree of circle "<<CDegree<<endl;
    		//中心距
    		
    		cvWaitKey(0);
    	}
    	
    	
    	cvReleaseImage(&src);
    	cvReleaseImage(&dst);
    	cvReleaseMemStorage(&storage);	
    	
    	return 0;
    }



     

     

    展开全文
  • 本文转自:https://blog.csdn.net/hanlin_tan/article/details/50447895,感谢博主TomHeaven分享1.基本概念从定义理解概念是最严谨的。所以首先搞清楚维基百科中这些概念的定义。计算机视觉(CV):Computer vision is...
  • 第7章 Android图形图像处理

    千次阅读 2014-02-05 23:18:00
    本章主要介绍了Android的图形图像处理,按照下面思维导图的思路来梳理本章书的内容。重点学习使用简单图片方法;Android丰富的绘图API,包括Canvas、Paint、Path等类;各种图形特效,利用Matrix对图形进行几何变换...
  • python图像处理较为全面

    万次阅读 2018-06-28 19:08:01
    第 1 章 基本的图像操作和处理本章讲解操作和处理图像的基础知识,将通过大量...1.1 PIL:Python图像处理类库PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图...
  • 数字图像处理应用领域

    千次阅读 2018-10-09 02:42:22
    图像是人类获取和交换信息的主要来源,因此,图像处理的应用领域必然涉及到人类生活和工作的方方面面。随着人类活动范围的不断扩大,图像处理的应用领域也将随之不断扩大。 1)航天和航空方面 航天和航空技术方面的...
  • 在我的理解里,要实现计算机视觉必须有图像处理的帮助,而图像处理倚仗与模式识别的有效运用,而模式识别是人工智能领域的一个重要分支,人工智能与机器学习密不可分。纵观一切关系,发现计算机视觉的应用服务于机器...
  • 数字图像处理概述

    千次阅读 2019-05-07 16:59:47
    图像处理的两个重要应用领域:(1)改善图像信息以便于人类理解 (2)为了方便存储、传输和表示而对图像进行处理,从而达到便于及其自动识别的目的。 什么是图像处理 简单来说,一幅图像可以认为就是一个二维...
  • 图形图像处理绪论

    千次阅读 2009-10-09 11:30:00
    图形图像处理起源于20世纪20年代,当时通过海底电缆从英国伦敦到美国纽约采用数字压缩技术传输了第一幅数字照片,用来改善图像的质量。此后由于遥感等领域的应用,使得图形图像处理技术逐步得到发展。一直到20世纪50...
  • 图像处理期末总结

    2020-01-13 12:20:27
    2. 图像处理的三个层次: 狭义图像:处理从图像到图像的过程(像素级); 图像分析:从 图像到数值或符号的过程(符号级); 图像理解:以客观世界分析客观世界(人工智能级) 3. 图像处理系统包括 采集,显示,存储...
  • 图像处理与识别学习小结

    万次阅读 2013-09-27 10:46:55
    图像处理与识别学习小结   数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多...
  • 通过shape关键字获取图像形状,返回包含行数、列数、通道数的元祖。其中灰度图像返回行数和列数,彩色图像返回行数、列数和通道数。如下图所示: # -- coding:utf-8 -- import cv2 import numpy #读取图片 img = ...
  • HALCON图像处理总流程

    2020-06-13 22:02:02
    HALCON图像处理总流程 一、程序初始化 二、获取图像(获取信息) 三、预处理 四、分割图像 五、形态学处理 六、特征提取 七、输出结果 一、程序初始化 图像处理基准,在使用HALCON时,可以省略,因为程序初始化...
  • 图像处理岗位面试题搜罗汇总

    万次阅读 多人点赞 2018-06-21 15:11:46
    原文...传统图像处理部分 图像处理基础知识 彩色图像、灰度图像、二...
  • 数字图像处理常用的方法总结

    千次阅读 2018-06-03 11:30:48
    做了几年的图像处理,可以对一些使用的方法进行总结: 1、图像变换 由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,例如: 傅立叶变换、沃尔什变换、离散余弦...
1 2 3 4 5 ... 20
收藏数 13,741
精华内容 5,496
关键字:

图形形状获取图像处理