1 感兴趣区域: ROI

在图像处理领域,我们常常需要设置感兴趣区域 ( ROI. region of interest) ,来专注或者简化工作过程 。 也就是从图像中选择的一个图像区域,这个区域是图像分析所关注的重点 。 我们圈定这个区域,以便进行进一步处理 。 而且,使用 ROI指定想读入的目标,可以减少处理时间,增加精度,给图像处理来带不小的便利 。

定义 ROI 区域有两种方法 :

第一种是使用表示矩形区域的 Rect。 它指定矩形的左上角坐标 ( 构造函数的前两个参数)和矩形的长宽(构造函数的后两个参数)以定义一个矩形区域 。

其中, image 为已经载入好的图片 。

//定义一个 Mat 类型并给其设定 ROI 区域
Mat imageROI ;
//方法一
imageROI =image(Rect( 500 , 250 , logo.cols , logo.rows ));

另 一种定义 ROI 的方式是指定感兴趣行或列的范围 ( Range ) 。 Range 是指从起始索引到终止索引(不包括终止索引)的一连段连续序列 。 cRange 可以用来定义 Range 。 如果使用 Range 来定义 ROI, 那么前例中定义 ROI 的代码可以重写为 :

//方法二
imageROI = image(Range(250 , 250+logoimage.rows) , Range (200 , 200+logoimage.cols )) ;

下面我们来看一个实例,显示如何利用 ROI 将一幅图加到另一幅图的指定位置 。

大家如果需要复制以下函数中的代码直接运行, 可以自已建一个基于 console的程序,然后把函数体中的内容复制到 main 函数中 ,然后找两幅大小合适的附片,加入到工程目录下,并和代码中读取的文件名 一致即可 。

//描述:利用感兴趣区域ROI实现图像叠加
bool  ROI_AddImage()
{// 【1】读入图像Mat srcImage1= imread("D:\\QT\\project\\opencv_qtcreaor\\image\\dota_pa.jpg");Mat logoImage= imread("D:\\QT\\project\\opencv_qtcreaor\\image\\dota_logo.jpg");if( !srcImage1.data ) { qDebug()<<"读取srcImage1错误~! \n"<<endl; return false; }if( !logoImage.data ) { qDebug()<<"读取logoImage错误~! \n"<<endl; return false; }// 【2】定义一个Mat类型并给其设定ROI区域Mat imageROI= srcImage1(Rect(200,250,logoImage.cols,logoImage.rows));// 【3】加载掩模(必须是灰度图)Mat mask= imread("dota_logo.jpg",0);//【4】将掩膜拷贝到ROIlogoImage.copyTo(imageROI,mask);// 【5】显示结果namedWindow("<1>利用ROI实现图像叠加示例窗口");imshow("<1>利用ROI实现图像叠加示例窗口",srcImage1);return true;
}

这个函数首先是载入了两张 jpg 图片到 srclmage1和 logolmage 中,然后定义了 一个 Mat 类型 的 imageROI , 并使用 Rect 设置其感兴趣区域为 srcimage1中的一块区域 , 将 imageROI 和 srclmage1关联起来。接着定义了 一个 Mat 类型的 的 mask并读入 dota_ logo.jpg, 顺势使用 Mat: : copyTo 把 mask 中的内容复制到 imageROI中, 于是就得到了最终 的效果图 。 namedWindow 和 imshow 配合使用,显示出最终的结果 。

2 线性混合操作

线性混合操作是一种典型的二元(两个输入)的像素操作,它的理论公式如下 :

我们通过在范围 0 到 1 之间改变 alpha 值,来对两幅图像 ( f0(x)和 f1(x)) 或两段视频(同样为 f0(x)和 f1(x) ) 产生时间上的画面叠化 ( cross-dissolve ) 效果 ,就像幻灯片放映和电影制作中的那样 ,也就是在幻灯片翻页 时设置的前后页缓慢过渡叠加效果,以及电影情节过渡时经常出现的画面叠加效果。
实现方面 , 主要运用了 OpeoCV 中 addWeighted 函数 , 下面来一起全面地 了解它 。

3 计算数组加权和: addWeigbted()函数

void addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma, OutputArray dst, int dtype = -1);
  • 第一个参数 , lnputArray 类型的 src1, 表示需要加权的第一个数组 , 常常填一个 Mat ;
  • 第二个参数 , double 类型的 alpha, 表示第一个数组的权重 ;
  • 第三个参数 , InputArray 类型的 src2, 表示第二个数组 , 它需要和第一个数组拥有相同的尺寸和通道数 :
  • 第四个参数 , double 类型的 beta, 表示第二个数组的权重值 ;
  • 第五个参数, double 类型的 gamma , 一个加到权重总和上的标量值 。 其含义通过接下来列出的式子自然会理解 ;
  • 第六个参数 , OutputArray 类型的 dst, 输出 的数组 , 它和输入的两个数组拥有相同的尺寸和通道数 ;
  • 第七个参数, int 类型的 dtype, 输出阵列的可选深度 , 有默认值- I 。当两个输入数组具有相同的深度时 , 这个参数设笠为 - 1. (默认值) , 即等同千src1.depth() 。

下面的数学公式表示 : 用 addWeighted 函数计算 以 下 两个数组 ( src1 和 src2 )

dst = srcl[I] * alpha + src2[I] * beta + gamma;

的加权和 , 得到结果输出给第四个参数 ,也就是 addWeighted 函数的作用 的矩阵表达式。

其中 l 是多维数组元素的索引值 。 而且 , 在遇到多通道数组的时候 , 每个通道都需要独立地进行处理。另外需要注意的是 , 当输出数组的深度为 CY_32S 时 ,这个函数就不适用了 , 这时候就会内存溢出或者算出的结果压根不对。理论和函数的讲解就是上面这些 , 接着我们来看代码实例 , 以融会贯通 。

//描述:利用cv::addWeighted()函数实现图像线性混合
bool  LinearBlending()
{//【0】定义一些局部变量double alphaValue = 0.5;double betaValue;Mat srcImage2, srcImage3, dstImage;// 【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )srcImage2 = imread("D:\\QT\\project\\opencv_qtcreaor\\image\\mogu.jpg");srcImage3 = imread("D:\\QT\\project\\opencv_qtcreaor\\image\\rain.jpg");if( !srcImage2.data ) { qDebug()<<"读取srcImage2错误! \n"<<endl; return false; }if( !srcImage3.data ) { qDebug()<<"读取srcImage3错误! \n"<<endl; return false; }// 【2】进行图像混合加权操作betaValue = ( 1.0 - alphaValue );addWeighted( srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);// 【3】显示原图窗口namedWindow("<2>线性混合示例窗口【原图】");namedWindow("<3>线性混合示例窗口【效果图】");imshow( "<2>线性混合示例窗口【原图】", srcImage2 );imshow( "<3>线性混合示例窗口【效果图】", dstImage );return true;
}

下面对以上代码进行解析。
( 0 ) 首先当然是定义一 些局部变量、 alpha 值、 beta 值 , 以及三个 Mat 类型 的变量,在这里我们设置 alpha 值为 0.5 。

    //【0】定义一些局部变量double alphaValue = 0.5;double betaValue;Mat srcImage2, srcImage3, dstImage;

( 1 ) 读取两幅图像并作错误处理这步很简单,直接看代码 。

    // 【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )srcImage2 = imread("mogu.jpg");srcImage3 = imread("rain.jpg");

在这里需要注意的是 , 因为我们是对 srclmage1和 srclmage2 求和,所以它们必须要有相同的尺寸(宽度和高度)和类型,不然多余的部分没有对应的"伴",肯定会出问题。

( 2 ) 进行图像混合加权操作
载入图像后,我们就可以来生成混合图像,也就是之前公式中的 g(x) 。 为此目的,使用函数 addWeighted 可以很方便地实现。代码其实很简单 , 就是这样 :

    // 【2】进行图像混合加权操作betaValue = ( 1.0 - alphaValue );addWeighted( srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);
//其中对应 于 addWeighted 的参数中的 beta 值为 1 -alpha, gamma 值为 0

运行结果:

原图:

效果图:

ROI区域和线性混合

//描述:线性混合实现函数,指定区域线性图像混合.利用cv::addWeighted()函数结合定义
//感兴趣区域ROI,实现自定义区域的线性混合
bool  ROI_LinearBlending()
{//【1】读取图像Mat srcImage4= imread("D:\\QT\\project\\opencv_qtcreaor\\image\\dota_pa.jpg",1);Mat logoImage= imread("D:\\QT\\project\\opencv_qtcreaor\\image\\image1.jpg");if( !srcImage4.data ) { printf("读取srcImage4错误~! \n"); return false; }if( !logoImage.data ) { printf("读取logoImage错误~! \n"); return false; }//【2】定义一个Mat类型并给其设定ROI区域Mat imageROI;//方法一imageROI= srcImage4(Rect(200,250,logoImage.cols,logoImage.rows));//方法二//imageROI= srcImage4(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));//【3】将logo加到原图上addWeighted(imageROI,0.5,logoImage,0.3,0.,imageROI);//【4】显示结果namedWindow("<4>区域线性图像混合示例窗口");imshow("<4>区域线性图像混合示例窗口",srcImage4);return true;
}

运行结果:

原图:

效果图:

(OpenCV — 7)ROI 区域图像叠加&图像混合相关推荐

  1. 《OpenCV3编程入门》学习笔记5 Core组件进阶(二) ROI区域图像叠加图像混合

    第5章 Core组件进阶 5.2 ROI区域图像叠加&图像混合 5.2.1 感兴趣区域ROI(region of interest) 1.定义ROI区域两种方法: (1)定义矩形区域Rect: ...

  2. opencv 手选roi区域_【OpenCV】选择ROI区域

    问题描述:在测试目标跟踪算法时,需要选择不同区域作为目标,进行目标跟踪,测试目标跟踪的效果. 解决思路: 1.OpenCV中提供了鼠标交互控制,利用setMouseCallback()给固定的窗口设置 ...

  3. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  4. python opencv图像叠加/图像融合/mask掩模

    目录 1.图像叠加 2.图像融合 3.图像mask掩模(包括按位AND,OR,NOT和XOR运算) 1.图像叠加 可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res ...

  5. python opencv 图像叠加,python opencv图像叠加/图像融合/mask掩模

    目录python 一.图像叠加 能够经过OpenCV函数cv.add()或简单地经过numpy操做添加两个图像,res = img1 + img2.两个图像应该具备相同的深度和类型,或者第二个图像能够 ...

  6. opencv 手选roi区域_如何用opencv实现感兴趣区域ROI的选取

    OpenCV中感兴趣区域的选取与检测 感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置:2)ROI在图像中的位置未知. 1)第一种情形 ...

  7. opencv 手选roi区域_利用opencv进行眼动检测

  8. [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. 【opencv】(1) 基础操作:图像视频读取、图像截取、颜色通道

    主要内容有:图像及视频的读取和保存.图像显示.转换灰度图.图像截取.颜色通道提取和组合 那我们开始吧. 1. 图像操作 首先我们导入opencv库,彩色图像一般都是由RGB(红绿蓝)三颜色通道构成,灰 ...

最新文章

  1. MYSQL:explain分析
  2. Android: 生成安卓可使用的Tflite文件
  3. test of ui5 duplicate control id
  4. SM30 - SMOFOBJECT
  5. 计算机组成原理实验 组装实验报告,计算机组成原理实验一实验报告..doc
  6. 史上最牛的文科生:法学出身,却发明出十进制计算器,折磨无数人的微积分符号,跨界40多个领域惊艳学术圈
  7. SpringMVC 返回值分类
  8. 软件加入使用时间_Mac实用菜单栏管理小工具 Bartender 3 | Mac软件天堂
  9. Windows下memcached.exe的安装与配置
  10. 《基于ArcGIS的Python编程秘笈(第2版)》——第1章 面向ArcGIS的Python语言基础
  11. 功能和界面哪个更重要
  12. java题库组卷系统_基于java的题库管理系统.doc
  13. 使用Python实战反欺诈模型
  14. 深度deepin文件管理上锁无法正常新建和保存文件的解决办法
  15. tablepc是什么平板电脑_Tablet PC,这是什么意思?
  16. Cloudera Manager详细安装教程
  17. 2018中国开源开发者调查问卷
  18. MarkDown常用使用技巧---字体颜色、大小、背景色、表格、图片大小修改---CSDN篇
  19. 信号类型(雷达)——雷达波形认识(一)
  20. jQuery下(2nd)

热门文章

  1. 合肥工业大学计算机学院专业排名,2019合肥工业大学专业排名
  2. Linux找出某所有者的所有文件
  3. 设计模式 - Prototype 原型模式
  4. 翻译简历中所需的英文词汇
  5. 自动批改c语言作业,C语言 选择题功课批改
  6. Battery Historian分析手机耗电神器
  7. AE平面跟踪和视觉效果插件mocha pro mac破解版
  8. C++标准模板库笔记
  9. iOS 股票K线图、分时图
  10. FPGA零基础学习:数字电路中的时序逻辑