在图像处理领域,有一个非常重要的名词ROI。

什么是ROI?

它的英文全称是Region Of Interest,对应的中文解释就是感兴趣区域。

感兴趣区域,就是我们从图像中选择一个图像区域,这个区域就是图像分析所关注的焦点。我们圈定这个区域,那么我们要处理的图像就从大图像变为一个小图像区域了,这样以便进行进一步处理,可以大大减小处理时间。

定义ROI区域有两种方法:

第一种,指定矩形的坐标,并且规定好他的长宽。

Mat img = imread("1.jpg");
Mat roi = img(Rect(500, 200, 100, 300));//Rect四个形参分别是:x坐标,y坐标,长,高;注意(x,y)指的是矩形的左上角点

第二种,指定感兴趣的行或列的范围。

Mat img = imread("1.jpg");
Mat roi = img(Range(250, 250 + 100), Range(200, 200 + 100));//Range两个形参分别是:起始行或列,起始行或列+偏移量

简单看一下ROI区域的使用方法,下面的程序定义了ROI,并且我用绿框标记出来。

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp> using namespace std;
using namespace cv; int main()
{
Mat srcImage = imread("lol0.jpg");
if (!srcImage.data)
{
cout << "读取原始图失败!" << endl;
return -1;
} rectangle(srcImage, Rect(0, 0, 600, 200), Scalar(0, 255, 0),2); //将感兴趣区域框出来
imshow("ROI", srcImage);
waitKey(); return 0; }

绿框位置就是我们选的感兴趣区域。

有时候我们不仅想把ROI标记出来,还想把ROI提取出来,成为一幅单独图片,那我们代码可以这么写:

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp> using namespace std;
using namespace cv; int main()
{
//导入图像
Mat img1 = imread("lol0.jpg", 1);
Mat img2(img1.rows, img1.cols, CV_8UC3); //设置感兴趣区域,拷贝
img1(Rect(500, 31, 200, 250)).copyTo(img2); //当然也可以这样
//Mat roi = img1(Rect(0,0,100,100));
//imshow("roi",roi); //显示
imshow("img1", img1);
imshow("img2", img2);
waitKey(0); }

这样子,ROI就被提取出来了。

现在开始说怎么为图像加上LOGO。

现在我想在一幅好看的图像上在给定的一个位置上加上下面这个酷炫的LOGO,有什么方法吗?

有两种方法。

方法一:

先定义好ROI区域(也就是你要在哪里加这个LOGO),然后进行线性叠加,使用addWeigthed函数。

这里有必要介绍一下线性混合操作。

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

我们通过在范围0到1之间改变alpha值,来对两幅图像(如上述公式中的fa和f3)进行画面迭代效果。OpenCV的相关操作如下:

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp> using namespace std;
using namespace cv; int main()
{
Mat srcImage = imread("lol.jpg");
if (!srcImage.data)
{
cout << "读取原始图失败!" << endl;
return -1;
}
namedWindow("srcImage", WINDOW_NORMAL);// 注意这个宏,使用WINDOW_NORMAL可以允许用户自由伸缩窗口大小
imshow("srcImage", srcImage); Mat logo = imread("dota2.jpg");
if (!logo.data)
{
cout << "读取原始logo图失败!" << endl;
return -1;
}
Mat imageROI = srcImage(Rect(28, 41, logo.cols, logo.rows)); //从原图中抠出矩形区域,Rect第一二参数表示矩形左上角定点的坐标,用于定位,后两个参数表示举行的宽和高
imshow("ROI", imageROI);
addWeighted(imageROI, 0.2, logo, 0.8, 0., imageROI);//dst = src1[I]*alpha+ src2[I]*beta + gamma;第一第四个参数就是各自权重,第5个参数就是公式中的偏执因子gamma。 namedWindow("原图加logo", WINDOW_NORMAL);
imshow("原图加logo", srcImage);
waitKey(); return 0; }

效果如下,可以看出,我们的logo变得模糊了,也可以认为我们logo跟原图水乳交融在一起了,我们可以不断调整上面addWeighted()的参数,来获得自己喜欢的效果。

方法二:

定义ROI区域,使用copyTo实现直接拷贝覆盖

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp> using namespace std;
using namespace cv; int main()
{
Mat srcImage = imread("lol.jpg");
if (!srcImage.data)
{
cout << "读取原始图失败!" << endl;
return -1;
}
namedWindow("srcImage", WINDOW_NORMAL);// 注意这个宏,使用WINDOW_NORMAL可以允许用户自由伸缩窗口大小
imshow("srcImage", srcImage); Mat logo = imread("dota2.jpg");
Mat mask = imread("dota2.jpg",0); // 加载掩模(必须是灰度图)
if (!logo.data)
{
cout << "读取原始logo图失败!" << endl;
return -1;
}
Mat imageROI = srcImage(Rect(28, 41, logo.cols, logo.rows)); //从原图中抠出矩形区域,Rect第一二参数表示矩形左上角定点的坐标,用于定位,后两个参数表示举行的宽和高
imshow("ROI", imageROI); logo.copyTo(imageROI,mask);//注意两个参数,一个是ROI,一个是掩模
namedWindow("原图加logo", WINDOW_NORMAL);
imshow("原图加logo", srcImage);
waitKey(); return 0; }

从效果看出,logo被原汁原味地拷贝到原图上了。

opencv探索之路(十二):感兴趣区域ROI和logo添加技术的更多相关文章

  1. opencv——感兴趣区域(ROI)的分析和选取[详细总结]

    引言 在利用OpenCV对图像进行处理时,通常会遇到一个情况,就是只需要对部分感兴趣区域进行处理.因此,如何选取感兴趣区域呢?(其实就是"抠图"). 在学习opencv的掩码运算后 ...

  2. opencv感兴趣区域ROI

    addWeighted //显示原图 Mat src = imread("data/img/1.jpg"); imshow("src",src); //显示lo ...

  3. opencv —— copyTo 设置与操作感兴趣区域(ROI)

    感兴趣区域:ROI 对感兴趣区域进行的一系列操作,相当于直接在原图相应部分进行操作. Mat imageROI = srcImage(Rect(0,0,dstImage.cols, dstImage. ...

  4. 例3-12opencv设置ROI感兴趣区域

    前面说了一堆,也不知道啥用,感觉也没说清楚,可能确实需要一些例子来显性表示一下,或者他们在当初出版书籍针对的人群已经有了对图像的基本认识,然而自己还是没有建立起来,往后看看吧,希望能比较清楚的自己处理 ...

  5. OpenCV探索之路(二十四)图像拼接和图像融合技术

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...

  6. OpenCV3编程入门笔记(2)计时函数、感兴趣区域RIO、分离/混合通道

    11     绘制直线的line函数 DrawLine(Mat img, Pont start, Point end); 绘制椭圆的ellipse函数 DrawEllipse(Mat img, dou ...

  7. 获取图片中感兴趣区域的信息(Matlab实现)

    内容提要 如果一幅图中只有一小部分图像你感兴趣(你想研究的部分),那么截图工具就可以了,但是如果你想知道这个区域在原图像中的坐标位置呢? 这可是截图工具所办不到的,前段时间我就需要这个功能,于是将其用 ...

  8. [zt] ROI (Region of Interest) 感兴趣区域 OpenCV

    在以前介绍IplImage结构的时候,有一个重要的参数——ROI.ROI全称是”Region Of Interest”,即感兴趣的区域.实际上,它是IPL/IPP(这两个是Inter的库)结构IplR ...

  9. Opencv探索之路(二十):制作一个简易手动图像配准工具

    近日在做基于sift特征点的图像配准时遇到匹配失败的情况,失败的原因在于两幅图像分辨率相差有点大,而且这两幅图是不同时间段的同一场景的图片,所以基于sift点的匹配已经找不到匹配点了.然后老师叫我尝试 ...

随机推荐

  1. 数字图像处理(MATLAB版)学习笔记(1)——第1章 绪言

    0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成 ...

  2. 你绝对想不到R文件找不到(cannot resolve symbol R)的原因

    你绝对想不到R文件找不到(cannot resolve symbol R)的原因 最近在项目开发中 Android Studio 的 R 文件突然找不到了.IDE 中出现了以下提示 cannot re ...

  3. 非负矩阵分解(4):NMF算法和聚类算法的联系与区别

    作者:桂. 时间:2017-04-14   06:22:26 链接:http://www.cnblogs.com/xingshansi/p/6685811.html 声明:欢迎被转载,不过记得注明出处 ...

  4. druid 搭建集群环境

    下载druid 下载地址 http://static.druid.io/artifacts/releases/druid-services-0.6.145-bin.tar.gz 解压 tar -zxv ...

  5. cookie和session的区别异同

    1.用于保存页面信息:如自动登录,记住用户名 2.对于同一个网站只有一套cookie,它是以域名为单位的,一个域名就是一套,数量大小有限4k-10k,同时会具有过期时间 3.JS中通过document ...

  6. 新手介绍简单一下iOS开发中几种界面传值

    首先在处理iOS-UI中,也许在很多地方需要用到两种甚至多种不同界面之间的传值,相比这也是很多iOS入门成员头疼问题,同样作为新手的我在接触这类传值时候也一脸懵然,经过一段时间的研究,对于简单的传值有 ...

  7. Spring aop切面插入事物回滚

    <!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...

  8. Devexpress 中对RedailMenu的使用

    最近项目中用到RadialMenu,效果图如下所示: 闲下来就对,devexpress中的RedialMenu的使用总结一下. 第一:假设RedialMenu中全部是BarButtonItem的情况. ...

  9. 查询sql server进程死锁方案

    SELECT a.spid , a.blocked , lastwaittype = RTRIM( a.lastwaittype ), waitresource = RTRIM( a.waitreso ...

  10. [ext4]03 磁盘布局 – Flexible group分析

    Flexible Block Groups (flex_bg),我称之为"弹性块组",是EXT4文件系统引入的一个feature. 所谓Flexible Block Groups, ...