文档视界 最新最全的文档下载
当前位置:文档视界 › OpenCV学习笔记

OpenCV学习笔记

OpenCV学习笔记
OpenCV学习笔记

第一章概述

OpenCV 是有Intel公司资助的开源计算机视觉库,它由一系列C函数和少量C++类构成,实现图像处理和计算机视觉方面的很多通用算法。

1、OpenCV的特征

(1)开源计算机视觉库采用C/C++编写

(2)使用目的是开发实时的应用程序

(3)独立于操作系统、硬件和图形管理器

(4)具有通用的图像/视频载入、保存和获取模块

(5)具有底层和高层的应用开发包

2、OpenCV的功能

(1)对图像数据的操作,包括分配、释放、复制、设置和转换数据

(2)对图像和视频的输入输出,指文件和摄像头作为输入,图像和视频文件作为输出(3)具有对矩阵和向量的操作及线性代数的算法程序,包括矩阵积、解方程、特征值以及奇异值

(4)可对各种动态数据结构,如列表、队列、集合、树和图等进行操作

(5)具有基本的数字图像处理能力,如可以进行滤波、边缘检测、角点检测、采样于差值、色彩转换、形态操作、直方图和图像金字塔等操作

(6)对各种结构进行分析,包括连接部件分析、轮廓处理、距离变换、各种距的计算、模板匹配、Hough变换、多边行逼近、直线拟合、椭圆拟合、和Delaunay三角划分等

(7)对摄像头的定标,包括发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计和立体对应

(8)对运动的分析,如对光流、运动分割和跟踪的分析

(9)对目标的识别,如可采用特征法和隐马尔科夫模型(HMM)法

(10)具有基本的GUI功能,包括图像与视频显示、键盘和鼠标事件处理及滚动条等(11)课对图像标注,如对线,二次曲线和多边行进行标注

3.OpenCV模块

?cv –核心函数库

?cvaux –辅助函数库

?cxcore –数据结构与线性代数库

?highgui – GUI函数库

?ml –机器学习函数库

第3章OpenCV基础

3.1 OpenCV命名规则

1、函数命名规则

通用函数名为cvActionTargetMod(……)

其中,Action 表示核心函数(如:set,create)

Target表示目标图像区域(如:轮廓,多边形)

Mod表示可选变种(如:变量类型)

2、矩阵数据类型

通用矩阵数据类型为CV_(S|U|F)C

其中,S表示带符号整数

U表示无符号整数

F表示浮点数

例如:CV_8UC1表示8位无符号单通道矩阵

3、图像数据类型

通用图像数据类型为IPL_DEPTH_(S|U|F)

例如:IPL_DEPTH__8U表示无符号整数图像

4、头文件

#include

#include

#include

#include//不是必须的,它包含在cv.h中

3.2基本数据结构

1、图像结构

OpenCV中德所有图像采用同一个结构IplImage

2、矩阵与向量结构

OpenCV采用一种独特的结构CvArr*,该结构是一个通用数组的变现形式,用做函数的参数,说明函数在调用该函数时接受多种类型的输入数据形式。

3、其他数据结构

(1)点的表示

点的数据结构有以下三种:

CvPoint p=cvPoint(int x,int y)

CvPoint2D32f p=CvPoint2D32f(float x,float y)

CvPoint2D32f p=CvPoint2D32f(float x,float y,float z)

(2)长方形维数的表示

表示长方形维数的数据结构及用法

CvSize r=cvSize(int width,int height)

CvSizeD32f r=cvSize32f(float width,float height)

(3)有偏移量的长方形表示

CvRect r=cvRect(int x,int y,int width,int height)

3.3 矩阵的使用与操作

3.3.1 分配与释放矩阵

在OpenCV中,向量被当成行货列为1的矩阵,并且矩阵在内存中德存储方式是按行存储,且每行按4字节对齐。

(1)分配矩阵

分配矩阵的函数原型为:

CvMat* cvCreateMat(int rows,int cols,int type)

其中type表示矩阵元素的类型,可以用如下形式表达

CV_ (S|U|F)C

(2)释放矩阵

释放矩阵的函数原型为void cvReleaseMat(CvMat**)

(3)复制矩阵

复制矩阵的函数原型

CvMat *cvCloneMat(CvMat*)

3.3.2 访问矩阵元素

若访问一个浮点数矩阵的第i行第j列元素,可采用以下几种方式

(1)直接访问M(i,j)

cvmSet(M,i,j,2.0)//SET M(i,j)

(2)已知对齐方式的直接访问

3.4 GUI命令

3.4.1 窗口管理

(1)创建及定位一个窗口

cvNamedWindow("wins",CV_WINDOW_AUTOSIZE)

cvMovewindow("win1",100,100)//偏移量从屏幕的左上角算起

(2)加载一副图像

具体事例

IplImage * image=0;

Img=cvLoadImage(fileName)

If(img)printf(“Could not load image file:%s \n”,filename);

(3)显示一副画像

具体操作语句实例为:cvShowImage("win1",img)

(4)关闭窗口

cvDestroyWindow(“win1”)

(5)缩放窗口

cvResizeWindow(“win1”,100,100)

IplImage数据结构

IplImage结构

Typedef struct _IplImage{

Int nSize;

Int ID;

Int nChannels;

Int alphaChannel;

Int depth;

Char colorModel[4];

Char channelSeq;

Int dataOrder;//////值可以是IPL_DATA_ORDER_PIXE指明数据将像素点不同通道的值交错排在一起和LIPL_DATA_ORDER_PLANE把所有的像素同通道值排在一起,形成通道平面,在把平面排列在一起;

Int origin;/////////有两种取值:IPL_ORIGIN_TL和IPL_ORIGIN_BL分别是设置坐标原点位于图像的左上角或左下角

Int aligin;

Int width;

Int height;

Struct _IplTOI* roi;

Struct _IplImage* maskROI;

V oid* imaged;

Strcut _IplTileInfo* tileInfo;

Int imageSize;

Char* imageData;//////////包含一个指向第一行图像数据的指针

Int widthStep; /////////包括相邻行的同列点之间的字节数

Int borderMode[4];

Int BorderConst[4];

Char* imageDataOrigin;

} IplImage;

对ROI和widthStep的补充

设置ROI可以使用函数cvSetImageROI()并为其传递一个图像指针和矩形;

取消ROI,只需要为函数cvRestImageROI()传递一个图像指针。

V oid cvSetImageROI(IplImage* image,CvRect rect);

cvRestImageROI(IplImage* image);

矩阵和图像的操作

矩阵和图像的基本操作

1、cvAbs 计算数组中所有元素的绝对值

2、cvAbsDiff 计算两个数组差值的绝对值

3、cvAbsDiffS 计算数组和标量差值的绝对值

4、cvAdd 两个数组的元素级的加运算

5、cvAddS 一个数组和一个标量的元素级的相加运算

6、cvAddWeighted 两个数组的元素级的加权相加运算

7、cvAvg 计算数组中所有元素的平均值

8、cvAvgSdv 计算数组中所有元素的绝对值和标准差

9、cvCalcCovarMatrix 计算一组n维空间向量的协方差

10、cvCmp 对两个数组中德所有元素运用设这的比较操作

11、cvCmpS 对数组和标量运用设置的比较操作

12、cvConvertScale 可选的缩放值转换数组元素类型

13、cvConvertScaleAbs 计算可选的缩放值的绝对值之后再转换数组元素的类型

14、cvCopy 把数组中德值复制到另一个数组中

15、cvCountNonZero 计算数组中非0值的个数

16、cvCrossProduct 计算两个三维向量的向量积(叉积)

17、cvCvtColor 将数组的通道从一个颜色空间转换另一个颜色空间

18、cvDet 计算方阵的行列式

19、cvDiv 用另外一个数组对一个数组进行元素级的除法运算

20、cvDotProduct 计算两个向量的点积

21、cvEigenVV 计算方阵的特征值和特征向量

22、cvFilp 围绕选定的轴翻转

23、cvGEMM 矩阵乘法

24、cvGetCol 从一个数组的列中复制元素

25、cvGetCol s 从元素相邻的多列中复制元素值

26、cvGetDiag 复制数组中对角线上的所有元素

27、cvGetDIms 返回数组的维数

28、cvGetDImSize 返回一个数组的所有维数的大小

29、cvGetRow 从一个数组的行中复制元素值

30、cvGetRows 从一个数组的对个相邻的行中复制元素值

31、cvGetSize 得到二维的数组的尺寸。以CvSize返回

32、cvGetSubRect 从一个数组的子区域复制元素值

33、cvInRange 检查一个数组的元素是否在另外两个数组的值的范围内

34、cvInRangeS 检查一个数组的元素的值是否在另外两个标量的范围内

35、cvInvert 求矩阵的转置

36、cvMahalonobis 计算两个向量间的马氏距离

37、cvMax 在两个数组中进行元素级的取最大值操作

38、cvMaxS 在一个数组和一个标量中进行元素级的取最大值操作

39、cvMerge 把几个单通道图像合并为一个多通道图像

40、CvMin 在两个数组中进行元素级的取最小值操作

41、cvMinS 在一个数组和一个标量中进行元素级的取最小值操作

42、cvMinMaxLoc 寻找数组中最大值最小值

43、cvMul 计算两个数组的元素级的乘积

44、cvNot 按位对数组中德每个元素求反

45、cvNorm 计算两个数组的正态相关性

46、cvNormalize 将数组中元素进行规一化

47、cvOr 对两个数组进行按位或操作

48、cvOrs 在数组与变量之间进行按位或操作

49、cvReduce 通过给定的操作符将二维数组约简为向量

50、cvRepeat 以平铺的方式进行数组复制

51、cvSet 用给定值初始化数组

52、cvSetZero 将数组中所有元素初始化为0

53、cvSetIdenty 将数组中对角线上的元素设为1,其他设置0

54、cvSolve 求出线性方程组的解

55、cvSplit 将多通道所组分割成多个单通道数组

56、cvSub 两个数组元素级的相减

57、cvSubs 元素级的从数组中减去标量

58、cvSubRS 元素组中德所有元素求和

59、cvSum 对数组中德所有元素求和

60、cvSVD 二维矩阵的奇异值分解

61、cvSVBkSb 奇异值回代计算

62、cvTrace 计算矩阵迹

63、cvTranspose 矩阵的转置运算

64、cvXor 对两个数组进行按位异或操作

65、cvXorS 在数组和变量之间进行按位异或操作

66、cvZero 将所有数组中德元素置为0

1、cvAbs、cvAbsDiff 和cvAbsDiffs

V oid cvAbs{////////计算src里德值绝对值,然后把结果写到dst

Const CvArr* src,

Const dst

};

V oid cvAbsDiff{//////////先从src1减去src2,然后将所得差的绝对值写到dst Const CvArr* src1,

Const CvArr* src2,

Const dst

};

V oid cvAbsDiffs{

Const CvArr* src,

CvScalar value,

Const dst

};

2、cvAdd,cvAddS,cvAddWeighted和alpha

V oid cvAdd{///////////简单的加法,把src1里的所有元素对应进行相加,然后结果放到dst中,如果mask没有被设为null,那么有mask中非零元素指定dst元素值为在函数执行后不变Const CvArr* src1,

Const CvArr* src2,

CvArr* dst;

Const CvArr* mask=NULL

};

V oid cvAddS{////////

Const CvArr* src,

CvScalar value,

CvArr* dst;

Const CvArr* mask=NULL

};

V oid cvAddWeighted {////////两个图像src1和src2融合成dst,src1的融合度为alpha,src22 的融合度为beta;dst=α*src1+β*src2+γ;

Const CvArr* src1,

Double alpha,

Const CvArr* src2,

Double beta,

Double gamma,

CvArr* dst

};

cvAnd和cvAndS

V oid cvAnd{////在src1数组上进行与运算结果在dst中

Const CvArr* src1,

Const CvArr* src2,

CvArr* dst;

Const CvArr* mask=NULL

};

V oid cvAndS{在src1数组上进行与运算,位于运算有常标量value得出,若mask非空,只计算得0 mask元素所对应的dst元素。

Const CvArr* src1,

CvScalar value,

CvArr* dst;

Const CvArr* mask=NULL}

cvAvg 计算数组arr的平均像素值,若mask为非空,那么平均值仅由那些mask为非0的元素对应的像素算出。

CvScalar cvAvg{

Const CvArr* arr;

Const CvArr* mask=NULL;

};

cvAvgSdv求平均值和像素的方差

cvAvgSdv{

Const CvArr* arr;

CvScalar* mean;

CvScalar* std_dev;

Const CvArr* mask =null;

};

cvCalcCovarMatrix计算向量的均值和协方差矩阵

V oid cvCalcCovarMatrix

{

Const CvArr* vects,

Int count,

CvArr* cov_mat,

CvArr* avg,

Int flags

};

cvCmp和cvCmpS

V oid cvCmp{//////比较两幅图相应的像素值

Const CvArr* src1,

Const CvArr* src2,

CvArr* dst,

Int cmp_op

};

V oid cvCmpS{//////将给定图像的像素值与某常标量值进行比较

Const CvArr* src,

CvScalar value,

CvArr* dst,

Int cmp_op

};

cvConvertScale 功能:1、将源图像的数据类型转换成目标图像的数据类型。2、对图像数据执行线性变换。

V oid cvConvertScale{

Const CvArr* src,

CvArr* dst,

Double scale=1.0,

Double shift=0.0,

};

cvConvertScaleAbs先缩放和平移,然后计算出绝对值,最后进行数据类型的转换

V oid cvConvertScaleAbs{

Const CvArr* src,

CvArr* dst,

Double scale=1.0,

Double shift=0.0,

};

cvCopy 功能:将一个图像复制到另一个图像,要求两个数组具有相同的数据类型、相同的大小和相同的维数。

V oid cvCopy {

Const CvArr* src,

CvArr* dst,

Const CvArr* mask =null

};

cvCountZero 返回数组arr中非0像素的个数

Int cvCountZero(const CV Arr* arr);

cvCrossProduct功能:计算两个三维向量的叉积

V oid cvCrossProduct(

Const CvArr* src1,

Const CvArr* src2,

CvArr* dst,

);

cvCvtColor

V oid cvCvtColor(

Const CvArr* src,

CvArr* dst,

Int code,

);

cvLine()是绘图函数中最简单的,只需要Bresenham算法画一条线:

V oid cvLine(

CvArr* array;

Cvpoint pt1,

Cvpoint pt2,

CvScalar color,///颜色变量

Int thickness=1,/////线的粗细一般用像素表示

Int connectivity=8,/////被设为反走样模式

),;

矩形

cvRectangle(

CvArr* array;

Cvpoint pt1,

Cvpoint pt2,

CvScalar color,///颜色变量

Int thickness=1

);

圆形和椭圆

V oid cvCircle(

CvArr* array,

Cvpoint center,

Int radius,

CvScalar color,

Int thickness=1,

Int connectivity=8

);

V oid cvEllipse(

CvArr* img,

CvPoint center,

CvSize axes,

Double start_angle,

Double end_angle,///////angle表示偏离主轴的角度,从X轴算起,逆时针方向为正,表示弧线开始和结束位置的角度

CvScalar color,

Int thickness=1,

Int line_type=8

);

V oid cvFillPoly(///////允许一个调用中绘制多个多边形

CvArr* img,

CvPoint** pts,

Int* npts,

Int contours,

CvScalar color,

Int line_type=8

);

V oid cvFillConvexPoly(////////允许一个调用中绘制多个多边形,他一次只能画一个多边形,而且只能画凸多边形

CvArr* img,

CvPoint* pts,

Int* npts,

CvScalar color,

Int line_type=8

);

V oid cvPolyLine(////////允许一个调用中绘制多个多边形,只需画出多边形的边,不需处理相交情况,速度快

CvArr* img,

CvPoint** pts,

Int* npts,

Int contours,

Int is_closed,

CvScalar color,

Int thickness=1,

Int line_type=8

);

字体和文字

cvPutText()功能:可以在图像上输出一些文本

V oid cvPutText(

CvArr* img,

Const char* text,/////所指向的文本将打印到图像上

CvPoint origin,/////指定文本框左下角位置

Const CvPoint* font,/////调用函数cvInitFont()

CvScalar color///////指定文本颜色

);

V oid cvInitFont(

CvFont* font,

Int font_face,

Double hscale,

Double vscale,

Double shear=0,/////创建斜字体若为0.0字体不斜,若为1.0时字体倾斜范围接近45度

Int thickness=1,

Int line_type=8

);

第4章细说HighGUI——一个可移植的工具包

创建窗口

Int cvNamedWindow(const char* name,int flag=CV_WINDOW_AUTOSIZE);

释放窗口

cvDestroyWindow(),这个函数接收一个字符串参数,这个字符串是窗口创建时所指定的名字。

cvResizeWindow()来调整窗口的大小

V oid cvResizeWindow(const char*name,int width,int height);

这里的宽度和高度是以像素为单位的,指定了窗口中可以显示部分的大小。

载入图像

IplImage *cvLoadImage(const char* filename,int iscolor CV_LOAD_IMAGE_COLOR); Iscolor 有几个值可以选择,默认情况下,图像是以每个通道8位,3个通道的形式被读入,可以通过设置CV_LOAD_IMAGE_COLOR来读入非8位的图像

保存图像

Int cvSaveImage(const char* filename ,const CvArr* image);

第二个参数是值要存储的图像数据

显示图像

V oid cvShowImage(const char* name,const CvArr* image );

第一个参数用来指定用来显示图像的窗口,第二个参数指向需要显示的图像

cvWaitKey()这个函数在一个给定的时间等待用户按键触发。cvWaitKey()可以接收0作为参数,在这种情况下,cvWaitKey()会无限期地等待,直到用户触发一个按键。

鼠标事件

鼠标事件相应采用回调函数的方式来处理,为了可以相应鼠标点击事件,首先必须创建一个回调函数,是鼠标点击事件发生时OpenCV可以调用这个函数。

回调函数的格式:

V oid CvMouseCallback(int event,int x,int y,int flags,void*param);

第二个以及第三个参数会被设置成事件发生时鼠标位置的x,y坐标值。这些坐标代表窗口中图像的像素坐标,与窗口的大小没有关系。

第四个参数flags ,每一位指定了在事件发生时的不同状态。

Param可以用来以任何结构方式传递额外的参数信息

注册回调函数

V oid cvSetMouseCallBack (

const char* window_name,/////指定回调函数要注册到的窗口

CvMouseCallback on_mouse,///回调函数

void* param=NULL);////传递额外的信息给void* param 参数

Sliders ,Trackbars,和Switches

滑动条被指定了一个独立的名称(字符串形式),并且后面使用此名称来制定这个滑动条。

Int cvCreateTracker(

Const char* trackba_name,////滑动条的名字

Const char* widow_name,///滑动条附属的窗口名字

Int* value,///当滑动条被拖动时,OpenCV自动将当前位置所代表的值传给指针指向的整数Int count ,/////滑动条所能表示的最大值

CvTrackbarCallback on_change///指向回滑函数的指针,当滑动条被拖动时,回滑函数会自动调用。

);

CvTrackCallback定义如下:

V oid(*callback)(intposition)

Int cvGetTrackbarPos(////用于读取滑动条value的值

const char* track_name,

Const char* window_name

);

V oid cvSetTrackbarPos(

const char* track_name,

Const char* window_name

Int pos

);

无按钮

用只有两个取值的滑动条来代替按钮,开关(switch)事实上就是只有两个状态的滑动条,这个状态是“on”和“off”。

视频的处理

CvCapture* cvCreateFileCapture(const char* filename);///只需要将MPG或A VI视频文件名CvCapture* cvCreateCameraCapture(int index);

读视频

Int cvGrabFrame(CvCapture* capture);

IplImage* CvRetrieveFrame(CvCapture* capture);

IplImage* cvQueryFrame (CvCapture* capture);

ConvertImage函数//用于不同图像格式之间转换

V oid ConvertImage(const CvArr* src,

CvArr* dst,

int flags=0///垂直旋转图像

);

第5章图像处理

图像处理:使用图像结构中所定义的高层处理方法来完成特定任务,这些任务是图形和视觉范畴的任务。

平滑处理(模糊处理)

OpenCV提供的平滑操作方法都是由cvSmooth函数实现,该函数可以将用户所期望的平滑方式作为参数。

V oid cvSmooth(

Const cvArr* src,//平滑操作的输入图像

CvArr* dst,///平滑操作的结果

Int smootype =CV_GAUSSIAN,

Int param1=3,

Int param2=0,

Double param3=0,

Double param3=0,////这些参数的含义取决于smoothtype的值

);

CV_BLUR (简单模糊)对每个像素param1*param2领域求和,并缩放1/(param1*param2) CV_BLUR_NO_SCALE(简单无缩放变换的模糊)对每个像素的param1*param2领域求和CV_MEDIAN(中值模糊)对图像核进行大小为param1*param2的中值滤波

CV_GAUSSIAN(高斯模糊)对图像进行大小为param1*param2的高斯卷积

CV_BILATERAL(双边滤波)应用双线性3*3滤波,颜色sigma=param1,空间sigma=param2 图像形态学

基本的图像转换是膨胀与腐蚀

膨胀是指将一些图像(或图像中德一部分区域成为A)与核(称为B)进行卷积,核可以是任何的形状或大小,他拥有一个单独定义出来的参考点,多数情况下,核是一个小的中间带有参考点的实心正方形或圆盘。核可以视为模板或掩码,膨胀是求局部最大值的操作。

腐蚀是膨胀的反操作,腐蚀操作要计算核区域像素的最小值,腐蚀可以通过下面的算法生成一个新的图像:当核B与图像卷积时,计算被B覆盖区域的最小像素值,并把这个值放到参考点上。

膨胀可以填补凹洞,腐蚀可以消除细的凸起。

膨胀函数cvErode()和腐蚀函数cvDilate()都有源图像和目标函数参数

V oid cvErode(

IplImage* src,

IplImage* dst,

IplConvKernel* B=NULL,//是核当为空时,所使用的是参考点位于中心3*3核

int interations=1////迭代的次数

);

V oid cvDilate(

IplImage* src,

IplImage* dst,

IplConvKernel* B=NULL,

int interations=1

);

当OpenCV执行cvErode()函数时,将某点p的像素值设为与p对应的核覆盖下所有点中的最小值,同样的,对于执行膨胀操作时,将取最小值换为取最大值:

自定义核

创建

IplConvKernel* cvCreateStructuringElementEx(

Int cols,

Int rows,///行和列确定了所构成矩形大小

Int anchor_x,//是核的封闭矩形内参数点的横纵左边(x,y)

Int anchor_y,

Int shape,//形状

Int* values=NULL///value在封闭矩形内定义核的形状

);

释放

V oid cvRealseStructuringElement(IplConvKernel** element);

IplConvKernel的形状取值

CV_SHAPE_RECT 核是矩形

CV_SHAPE_CROSS 核是十字交叉形

CV_SHAPE_ELLIPSE 核是椭圆形

CV_SHAPE_CUSTOM 核是用户自定义的值

更通用的形态学

在处理布尔图像和图像掩码时,基本的腐蚀和膨胀操作通常是足够的,然而,在处理灰度或彩色图像时,需要使用cvMorphologyEx()函数

V oid cvMorphologyEx(

Const CvArr* src,

CvArr* dst,

CvArr* temp,///temp数组与源图像同样大小

IplConvKernel* element,

Int operation,////指定形态学操作的方法

Int interations=1

);

cvMorphologyEx()操作选项

CV_MOP_OPEN 开运算——先腐蚀后膨胀,常用来统计二值图像中得区域数,CV_MOP_CLOSE 闭运算——先膨胀后腐蚀,在连通区域分析算法中,都会用到闭运算来除去噪声引起的区域。

CV_MOP_GRADIENT 形态运算

CV_MOP_TOPHAT “礼帽”

CV_MOP_BLACKHA T “黑帽”

1、开运算和闭运算操作“保留区域”形式:最显著的效果是:闭运算消除低于其临近点的孤立点,开运算消除高于其邻近点的孤立点

2、开运算和闭运算“面积保持”形式:闭运算消除低于邻近点的孤立点,开运算消除高于其邻近点的孤立点

形态学梯度

公式:

gradient(src)=dilate(src)-erode(src)

对二值图像进行这一操作可以将团块的边缘突出出来,形态梯度操作能描述图像亮度变化的剧烈程度。

礼帽和黑帽

这些操作分别用于分离比邻近点亮或暗的一些斑块,当试图鼓励的部分相对于其邻近的部分有亮度变化时,就可以使用这些方法。

TopHat(src)=src-open(src)

从A中减去open(src)可以突出比A周围的区域更明亮的区域,并跟核的大小相关BlackHat(src)=close(src)-src

从A中减去open(src)可以突出比A周围的区域更黑暗的区域,并跟核的大小相关

漫水填充算法

常被用来标记或分离图像的一部分以便对其进行进一步的处理和分析。也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码制定的像素点。

cvFloodFill函数本身包含一个可选的掩码参数,用来进一步控制那些区域将被填充颜色。漫水填充操作的结果总是某个连续的区域。

漫水填充算法的函数原型:

void cvFloodFill(

IplImage* img;//输入图像

CvPoint seedPoint,漫水法填充从seedPoint开始

CvScalar newV al,///像素点被染色的值

CvScalar loDiff =cvScalarAll(0),

CvScalar upDiff =cvScalarAll(0),

CvConnectedComp* comp =NULL,

int flags=4,

CvArr* mask=NULL

);

Flags低8位部分可以设置为4或8,这个参数控制填充算法的连通性,若为4,填充算法只考虑当前像素水平方向和垂直方向的相邻点,若为8,还要考虑包含对角线方向的相邻点。

尺寸调整

cvResize()函数来放大或缩小图像

void cvResize(

const CvArr* src,

CvArr* dst,

int interpolation=CV_INTER_LINEAR///指定插值法

);

cvResize()插值方法

CV_INTER_NN 最邻近插值

CV_INTER_LINEAR 线性插值

CV_INTER_AREA 区域插值

CV_INTER_CUBIC 三次样条插值

图像金字塔

图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而且通过对原始图像连续将采样获得,直到带到某个中止条件才停止采样。

高斯金字塔:用来向下降采样图像,

拉普拉斯金字塔:底层图像中向上采样重建一个图像。

OpenCV为我们提供了从金字塔中上一级图像生成下一级图像的方法:、

void cvPyrDown(

IplImage* src,

IplImage* dst,

IplFilter filter=IPL_GAUSSIAN_5x5);

将现有的图像在每个维度上都放大两倍:

void cvPyrUp(

IplImage* src,

IplImage* dst,

IplFilter filter=IPL_GAUSSIAN_5x5

);

PyrUp()不是函数PyrDown()的逆操作,因为PyrDown()是一个会丢失信息的函数。

下面是拉普拉斯金字塔的第i层的数学定义:

其中,UP()操作将原始图像中位置为(x,y)的像素映射到目标图像的(2x+1,2y+1)位置,g5*5高斯核。

使用OpenCV直接进行拉普拉斯运算:

最广泛的应用:利用金字塔实现图像分割,图像分割需要建立一个图像金字塔,然后在Gi的像素和Gi+1的像素直接依照对应关系,建立起“父—子”关系,这种方式,快速初始分割可以先在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化。

使用cvPyrSegmentation()函数来实现,

void cvPyrSegmentation (

IplImage* src,////源图像,起始图像的长和宽都能够被2整除,并且能够被2 整除的次数不小于金字塔的总得层数。

IplImage* dst,////目标图像

CvMemStorage* storage,///指向OpenCV的存储区

CvSeq** comp,////用于存储分割结果更详细的信息——存储区里一系列相连的组成部分

int level,

double threshold1,

double threshold2,

);

阈值化

使用cvTreshold()可以完成直接剔除一些低于或高于一定值像素

double cvTreshold(

CvArr* src,

CvArr* dst,

double threshold,

double max_value,

int threshold_type

);

第6章图像变换

卷积

void cvFilter2D(

const CvArr* src,源图像

CvArr* dst,目标图像

const CvMat* kernel,核

CvPoint anchor=cvPoint(-1,-1)默认核的中心

);

卷积边界

使用cvCopyMakeBorder()函数来处理卷积的边界,它可以将特定的图像微变大,然后以各种方式自动填充图像边界。

void cvCopyMakeBorder(

const CvArr* src,源图像

CvArr* dst,目标图像

CvPoint offset,告诉cvCopyMakeBorder()将源图像的副本放到目标图像中的位置

int bordertype,类型可以是IPL_BORDER_CONSTANT表示value 变量被认为是所在边界的像素应该设置的值,IPL_BORDER_REPLICATE表示原始图像边缘的行和列被复制到大图像的边缘

CvScalar value=cvScalarAll(0)

);

梯度和Sobel导数

cvSobel(

const CvArr* src,

CvArr* dst,

int xorder,

int yorder,///求导数的阶数可能得取值0,1,2

int aperture_size=3表示方形滤波器的宽并且应该是奇数

);

Sobel 导数性质:可以定义任意大小的核,并且这些核可以用快速且迭代方式构造,大核对导数有更好的逼近,因为小核对噪声更敏感。其中Sobel导数并不是真正的导数,因为Sobel 算子定义于一个离散空间之上。

Scharr滤波器

Scharr滤波器解决小导数滤波器不准确的问题,功能和sobel相似

相关文档