OpenCV常⽤库函数
⼀、core模块
1、Mat - 基本图像容器
Mat 是⼀个类,由两个数据部分组成:矩阵头(包含矩阵尺⼨,存储⽅法,存储地址等信息)和⼀个指向存储所有像素值的矩阵(根据所选存储⽅法的不同矩阵可以是不同的维数)的指针。
创建Mat对象⽅法:
11->Mat() 构造函数:
2 Mat M(2,2, CV_8UC3, Scalar(0,0,255));
3int sz[3] = {2,2,2};
4 Mat L(3,sz, CV_8UC(1), Scalar::all(0));
52->Create() function: 函数
ate(4,4, CV_8UC(2));
73-> 初始化zeros(), ones(), :eyes()矩阵
8 Mat E = Mat::eye(4, 4, CV_64F);
9 Mat O = Mat::ones(2, 2, CV_32F);
10 Mat Z = Mat::zeros(3,3, CV_8UC1);
114->⽤逗号分隔的初始化函数:
12 Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
常⽤操作:
1 Mat A, C; // 只创建信息头部分
2 A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 这⾥为矩阵开辟内存
3 Mat B(A); // 使⽤拷贝构造函数
4 C = A; // 赋值运算符
5 Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
6 Mat E = A(Range:all(), Range(1,3)); // using row and column boundaries
7 Mat F = A.clone();
8 Mat G;
pyTo(G); //使⽤函数 clone() 或者 copyTo() 来拷贝⼀副图像的矩阵。
2、图像基本操作(Mat操作)
2.1 滤波器掩码
滤波器在图像处理中的应⽤⼴泛,OpenCV也有个⽤到了滤波器掩码(也称作核)的函数。使⽤这个函数,你必须先定义⼀个表⽰掩码的 Mat 对象:
1 Mat kern = (Mat_<char>(3,3) << 0, -1, 0,
2 -1, 5, -1,
30, -1, 0);
4 filter2D(I, K, I.depth(), kern );
2.2 图像混合(addWeighted函数)
线性混合操作也是⼀种典型的⼆元(两个输⼊)的像素操作:
通过在范围内改变,这个操可以⽤来对两幅图像或两段视频产⽣时间上的画⾯叠化(cross-dissolve)效果。
1 alpha = 0.3;
2 beta = ( 1.0 - alpha );
3 addWeighted( src1, alpha, src2, beta, 0.0, dst);
2.3 改变图像的对⽐度和亮度
两种常⽤的点过程(即点算⼦),是⽤常数对点进⾏乘法和加法运算:
两个参数和⼀般称作增益和偏置参数。我们往往⽤这两个参数来分别控制对⽐度和亮度。
你可以把看成源图像像素,把看成输出图像像素。这样⼀来,上⾯的式⼦就能写得更清楚些:
其中,和表⽰像素位于第i⾏和第j列。
1double alpha;
2int beta;
3 Mat image = imread( argv[1] );
4 Mat new_image = Mat::zeros( image.size(), pe() );
5for( int y = 0; y < ws; y++ )
6 {
7for( int x = 0; x < ls; x++ )
8 {
9for( int c = 0; c < 3; c++ )
10 {
11 new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
12 }
13 }
14 }
2.4 离散傅⽴叶变换
对⼀张图像使⽤傅⽴叶变换就是将它分解成正弦和余弦两部分。也就是将图像从空间域(spatial domain)转换到频域(frequency domain)。 2维图像的傅⽴叶变换可以⽤以下数学公式表达:
式中 f 是空间域(spatial domain)值, F 则是频域(frequency domain)值。
1 Mat padded; //将输⼊图像延扩到最佳的尺⼨
2int m = getOptimalDFTSize( I.rows );
3int n = getOptimalDFTSize( I.cols ); // 在边缘添加0
4 copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));
5 Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
6 Mat complexI;
7 merge(planes, 2, complexI); // 为延扩后的图像增添⼀个初始化为0的通道
8 dft(complexI, complexI); // 变换结果很好的保存在原始矩阵中
9 split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
10 magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude
11 Mat magI = planes[0];
2.5 基本绘图
1 Point:
2 Point pt;
3 pt.x = 10;
4 pt.y = 8;
5或者
6 Point pt = Point(10, 8);
7
8 Scalar:
9 Scalar( B, G, R ) //定义的RGB颜⾊值为:Blue,Green, Red
10
11 line 绘直线:
12 line( img, //输出图像
13 start, //起始点
14 end, //结束点
rows函数的使用方法及实例
15 Scalar( 0, 0, 0 ), //颜⾊
16 thickness=2, //线条粗细
17 lineType=8 ); //线条类型
18
19 ellipse 绘椭圆:
20 ellipse( img, //输出图像
21 Point( w/2.0, w/2.0 ), //中⼼为点 (w/2.0, w/2.0)
22 Size( w/4.0, w/16.0 ), //⼤⼩位于矩形 (w/4.0, w/16.0) 内
23 angle, //旋转⾓度为 angle
240,
25360, //扩展的弧度从 0 度到 360 度
26 Scalar( 255, 0, 0 ), //颜⾊
27 thickness, //线条粗细
28 lineType ); //线条类型
29
30 circle 绘圆:
31 circle( img, //输出图像
32 center, //圆⼼由点 center 定义
33 w/32.0, /圆的半径为: w/32.0
34 Scalar( 0, 0, 255 ), //颜⾊
35 thickness, //线条粗细
36 lineType ); //线条类型
37
38 rectangle 绘矩形:
39 rectangle( rook_image,
40 Point( 0, 7*w/8.0 ),
41 Point( w, w), //矩形两个对⾓顶点为 Point( 0, 7*w/8.0 ) 和 Point( w, w)
42 Scalar( 0, 255, 255 ),
43 thickness = -1,
44 lineType = 8 );
45
46 fillPoly 绘填充的多边形:
47 fillPoly( img,
48 ppt, //多边形的顶点集为 ppt
49 npt, //要绘制的多边形顶点数⽬为 npt
501, //要绘制的多边形数量仅为 1
51 Scalar( 255, 255, 255 ),
52 lineType );
2.6 随机数发⽣器
RNG的实现了⼀个随机数发⽣器。在上⾯的例⼦中, rng 是⽤数值 0xFFFFFFFF 来实例化的⼀个RNG对象。
RNG rng( 0xFFFFFFFF );
⼆、imgproc模块
1、图像平滑处理
平滑也称模糊, 平滑处理时需要⽤到⼀个滤波器。最常⽤的滤波器是线性滤波器,线性滤波处理的输出像素值 (i.e. ) 是
输⼊像素值 (i.e. )的加权和 :
称为核, 它仅仅是⼀个加权系数。
不妨把滤波器想象成⼀个包含加权系数的窗⼝,当使⽤这个滤波器平滑处理图像时,就把这个窗⼝滑过图像。
1.1 归⼀化块滤波器 (Normalized Box Filter)
1 blur( src, //输⼊图像
2 dst, //输出图像
3 Size( i, i ), //定义内核⼤⼩( w 像素宽度, h 像素⾼度)
4 Point(-1,-1)) //指定锚点位置(被平滑点),如果是负值,取核的中⼼为锚点。
1.2 ⾼斯滤波器 (Gaussian Filter)
1 GaussianBlur( src, //输⼊图像
2 dst, //输出图像
3 Size( i, i ), //定义内核的⼤⼩(需要考虑的邻域范围)。 w 和 h 必须是正奇数,否则将使⽤和参数来计算内核⼤⼩。40, //: x ⽅向标准⽅差,如果是 0 则使⽤内核⼤⼩计算得到。
50 ) //: y ⽅向标准⽅差,如果是 0 则使⽤内核⼤⼩计算得到。
1.3 中值滤波器 (Median Filter)
1 medianBlur ( src, //输⼊图像
2 dst, //输出图像
3 i ); //内核⼤⼩ (只需⼀个值,因为我们使⽤正⽅形窗⼝),必须为奇数。
1.4 双边滤波 (Bilateral Filter)
1 bilateralFilter ( src, //输⼊图像
2 dst, //输出图像
3 i, //像素的邻域直径
4 i*2, //: 颜⾊空间的标准⽅差
5 i/2 ); //: 坐标空间的标准⽅差(像素单位)
2、形态学变换
形态学操作就是基于形状的⼀系列图像处理操作。最基本的形态学操作有⼆:腐蚀与膨胀(Erosion 与 Dilation)。他们的运⽤⼴泛:
消除噪声
分割(isolate)独⽴的图像元素,以及连接(join)相邻的元素。
寻图像中的明显的极⼤值区域或极⼩值区域。
2.1 腐蚀(Erosion)
此操作将图像 A 与任意形状的内核 B(通常为正⽅形或圆形)进⾏卷积,将内核 B 覆盖区域的最⼩相素值提取,并代替锚点位置的相素。这⼀操作将会导致图像中的亮区开始“收缩”。
1 erode( src, //原图像
2 erosion_dst, //输出图像
3 element ); //腐蚀操作的内核,默认为⼀个简单的 3x3 矩阵。也可以使⽤函数 getStructuringElement。
4 Mat element = getStructuringElement( erosion_type,
5 Size( 2*erosion_size + 1, 2*erosion_size+1 ),
6 Point( erosion_size, erosion_size ) );
2.2 膨胀 (Dilation)
此操作将图像 A 与任意形状的内核 B(通常为正⽅形或圆形)进⾏卷积,将内核 B 覆盖区域的最⼤相素
值提取,并代替锚点位置的相素。这⼀操作将会导致图像中的亮区开始“扩展”。
1 ditale( src, //原图像
2 dilate_dst, //输出图像
3 element ); //腐蚀操作的内核,默认为⼀个简单的 3x3 矩阵。也可以使⽤函数 getStructuringElement。
4 Mat element = getStructuringElement( dilation_type,
5 Size( 2*dilation_size + 1, 2*dilation_size+1 ),
6 Point( dilation_size, dilation_size ) );
2.3 开运算 (Opening)
开运算是通过先对图像腐蚀再膨胀实现的。能够排除⼩团块物体(假设物体较背景明亮)。
2.4 闭运算(Closing)
闭运算是通过先对图像膨胀再腐蚀实现的。能够排除⼩型⿊洞(⿊⾊区域)。
2.5 形态梯度(Morphological Gradient)
膨胀图与腐蚀图之差。能够保留物体的边缘轮廓。
2.6 顶帽(Top Hat)
原图像与开运算结果图之差。
2.7 ⿊帽(Black Hat)
闭运算结果图与原图像之差
3、图像⾦字塔
⼀个图像⾦字塔是⼀系列图像的集合 - 所有图像来源于同⼀张原始图像 - 通过梯次向下采样获得,直到达到某个终⽌条件才停⽌采样。有两种类型的图像⾦字塔常常出现在⽂献和应⽤中:
⾼斯⾦字塔(Gaussian pyramid): ⽤来向下采样
拉普拉斯⾦字塔(Laplacian pyramid): ⽤来从⾦字塔低层图像重建上层未采样图像
⽤如下⽅法向上采样:
将与⾼斯内核卷积:
将所有偶数⾏和列去除。
pyrUp( tmp, dst, Size( ls*2, ws*2 ) );
对图像的向下采样:
将图像在每个⽅向扩⼤为原来的两倍,新增的⾏和列以0填充()
使⽤先前同样的内核(乘以4)与放⼤后的图像卷积,获得 “新增像素” 的近似值。
pyrDown( tmp, dst, Size( ls/2, ws/2 ) );
4、阈值操作
最简单的图像分割的⽅法。例如:可以将该物体的像素点的灰度值设定为:‘0’(⿊⾊),其他的像素点的灰度值为:‘255’(⽩⾊);当然像素点的灰度值可以任意,但最好设定的两种颜⾊对⽐度较强,⽅便观察结果
1 threshold( src_gray, //输⼊的灰度图像
2 dst, //输出图像
3 threshold_value, //进⾏阈值操作时阈值的⼤⼩
4 max_BINARY_value, //设定的最⼤灰度值
5 threshold_type ); // 阈值的类型。
6 0: ⼆进制阈值
7 1: 反⼆进制阈值
8 2: 截断阈值
9 3: 0阈值
10 4: 反0阈值
5、给图像添加边界
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论