OpenCV学习笔记 02

OpenCV学习笔记 02


三、基本图像变换

3.1 图像拼接

opencv提供两种拼接的方式

①将存放于一个Mat类矩阵中的对象进行拼接

②将两个Mat类对象进行拼接
//纵向拼接
void cv::vconcat(const Mat * input,   //数组的指针
                 size_t numof_Input,  //所输入的数组中Mat类型的数目
                 OutputArray output   
                )
void cv::vconcat(InputArray input1,   //数组的指针  //所输入的数组中Mat类型的数目
                 InputArray input2,
                 OutputArray output   
                 )
//横向拼接仅举例,参数与纵向一致
void cv::hconcat()

3.2 图像尺寸变换 resize()

void cv::resize(InputArray input,
                OutputArray output,
                Size dsize,                        //指定输出图像尺寸
                double fx,                         //x,y方向缩放比例
                double fy,
                int interpolation = INTER_LINEAR   //插值算法标志
               )

dsize和fx/fy在使用时只需要使用一类即可,两者同时使用时以dsize为准

3.3 图像翻转 flip()

void cv::flip(InputArray input,
              OutputArray output,
              int flipCode         //>0绕y轴翻转,=0绕x轴翻转,<0绕x,y都翻转
             )

3.4 极坐标变换 warpPolar()

圆形图像转变为矩形图像,用于处理钟表、圆盘等图像。将圆形图像的边缘文字排列在新的矩形图像的边缘

void cv::warpPolar(InputAray input,OutputArray output,Size dsize,
                   Point2f center,        //极坐标图的原点
                   double maxRadius,      //极坐标图半径
                   int flag               //插值方法
                  )  

四、使用变换矩阵的图像变换

4.1 图像仿射变换 warpAffine()

4.1.1 图像的旋转

getRotationMatrix2D()函数通过输入旋转中心、旋转角度、旋转过程两轴的比例因子,获得一个Mat类型的旋转矩阵对象:

Mat cv::getRotationMatrix2D(Point2f center,
                            double angle,
                            double scale   //两轴的比例因子,输入1则不缩放
                           )    

旋转变换是仿射变换的一个特殊情况,将此矩阵用于仿射变换函数即可仅作图像旋转

4.1.2 仿射变换

仿射变换又称为三点变换。如果知道目标变换前后的三个像素点坐标之间的关系,即可求出仿射变换矩阵M

opencv提供了getAffineTransform函数用于计算仿射变换矩阵:

Mat cv::getAffineTransform(const Point2f src[],
                           const Point2f dst[]   //输入点类数组
                          )
void cv::warpAffine(InputArray src,
                    OutputArray dst,
                    InputArray M,        //仿射变换矩阵M
                    Size dsize,
                    int flags = INTER_LINEAR,    //插值方法
                    int borderMode = BORDER_CONSTANT,    //像素边界外推方法
                    const Scalar & nprderValue = Scalar()
                   )

仿射变换的矩阵M是2×3的矩阵

4.2 透视变换 warpPerspective()

透视变换:按照物体的成像投影规律将图像重新投影。常见用例是修正镜头与拍摄目标存在斜角时产生的图像畸变。

使用getPerspectiveTransform()函数获取变换矩阵

Mat cv::getPerspectiveTransform(const Point2f src[],
                                const Point2f dst[],
                                int solveMethod = DECOMP_LU //求解方法                             
                               )

使用warpPerspective()函数应用透视变换

void cv::warpPerspective(InputArray src,
                         OutputArray dst,
                         InputArray M,        //变换矩阵M
                         Size dsize,
                         int flags = INTER_LINEAR,    //插值方法
                         int borderMode = BORDER_CONSTANT,    //像素边界外推方法
                         const Scalar & nprderValue = Scalar()
                        )

五、深拷贝与浅拷贝

5.1 感兴趣区域 ROI

为了减轻内存负担,通常会从原始图中截取一部分区域后再进行处理,所截取的这一部分成为感兴趣区域(Region of Interest)。

OpenCV提供两种截取ROI的方式

Mat img,ROI1,ROI2;

//截图方式1
//首先需要定义ROI区域
Rect_(_Tp _x,_Tp _y,_Tp _width,_Tp _height)//_Tp为模板类型,可用int,double, float类型替换
Rect rect(300,300,500,500);
ROI1 = img(rect);

//截图方式2
ROI2 = img(Range(300,500),Range(300,500)); //img(行范围,列范围)

5.2 浅拷贝深拷贝

浅拷贝:创建了一个能够访问数据的变量,原始数据改变后浅拷贝对象也会改变

深拷贝:创建变量的同时,在内存中分配新的地址存储该变量

//浅拷贝方式
Mat img1 = img2;

//深拷贝1
void cv::Mat::copyTo(OutputArray m)const
//例如 img1.copyTo(img2)  将img1深拷贝进入img2中
void cv::Mat::copyTo(OutputArray m,InputArray mask)const
//带遮罩选择的版本

//深拷贝2
void cv::copyTo(InputArray src,OutputArray dst,InputArray mask)
//例如 copyTo(img1,img2,img1) 应用img1作为遮罩范围将img1深拷贝到img2

六、图像金字塔

6.1 上采样pyrUp(),下采样pyrDown()

功能上与resize()函数相同,均为改变原始图片的尺寸,但是内部的算法不同

void cv::pyrUp(InputArray src,OutputArray dst,
               const Size & dst_size = Size(), //可指定,默认为原始的两倍
               int borderType = BORDER_DEFAULT 
              )
void cv::pyrDown(InputArray src,OutputArray dst,
                 const Size & dst_size = Size(), //可指定,默认为原始的1/2
                 int borderType = BORDER_DEFAULT 
                )

6.2 高斯金字塔

构建高斯金字塔是通过下采样不断的将图像缩小,包含多个尺寸的金字塔排列图像。底层为图像的原图,每往上一层就会通过下采样缩小一次图像的尺寸,默认为缩小为当前的1/2。

6.3 拉普拉斯金字塔

    **拉普拉斯金字塔具有预测残差的作用**

拉普拉斯金字塔通过上层小尺寸的图像构建下层大尺寸的图像,需要与高斯金字塔联合使用。

第i层拉普拉斯图像的计算方法:

Created with Raphaël 2.3.0 start 第i层高斯图像 下采样 上采样 求插值 第i层拉普拉斯图像

Ps:临时看的flowchart.js的使用方法,参考:

flowchart.js使用总结_qq_38852248的博客-CSDN博客_flowchart.js

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值