在图像处理领域,有一个非常重要的名词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学习笔记5:感兴趣区域ROI

    ROI ROI 感兴趣区域 从被处理的图像以方框,圆,不规则多边形等勾勒出我们感兴趣的区域. 可以通过各种算子(Operator)和函数来求得感兴趣的区域. 本次通过下标的形式获取ROI ROI 下标 ...

  2. 【OpenCV】OpenCV函数精讲之 -- 感兴趣区域ROI

    定义ROI区域有两种方法: 第一种:使用表示矩形区域的Rect.指定矩形的左上角坐标(构造函数的前两个参数)和矩形的长宽(构造函数的后两个参数). imageROI = image(Rect(500, ...

  3. python+opencv 获取图像属性,获取图像感兴趣区域ROI

    1.获取图像属性 1.1获取图像形状 img.shape:灰度图像返回高.宽两个参数,彩色图像返回高.宽.通道数三个参数 读取彩色图片: # -*- coding:utf-8 -*- import c ...

  4. python二值化 感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法

    方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域RO ...

  5. C/C++ OpenCV设置感兴趣区域ROI

    设置感兴趣区域(ROI,region of interest),来专注或者简化工作过程,也就是从图像中选择一个图像区域,这个区域是 图像分析所关注的重点.我们圈定的这个区域,以便进行进一步处理 定义R ...

  6. python提取图片感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法

    方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域RO ...

  7. ITK:在一幅图像中提取感兴趣区域ROI

    ITK:在一幅图像中提取感兴趣区域ROI 内容提要 输出结果 C++实现代码 内容提要 在给定图像中提取给定的关注区域(ROI) 输出结果 C++实现代码 #include "itkImag ...

  8. Python-OpenCV选择、提取感兴趣区域(ROI区域)

    Python-OpenCV选择.提取感兴趣区域(ROI区域) 在图像处理中,我们常常要对某个区域进行选择.提取,然后对这个区域进行单独分析.处理.显示. 这样的区域我们称为叫ROI区域,英文全称为Re ...

  9. C# opencvSharp实现鼠标移动选择感兴趣区域(ROI)

    C# opencvSharp实现鼠标移动选择感兴趣区域(ROI)主要通过鼠标响应事件来实现. 1.鼠标按下响应 MouseDown() 获取鼠标按下的开始坐标. private void pictur ...

最新文章

  1. 读书笔记之: 计算机网络(第4版)- 第6章 传输层
  2. Java 时期格式 星期显示英文
  3. Linux下配置tomcat+apr+native应对高并发
  4. Unity Pixel 人物设计(1)
  5. java http2_探索HTTP/2: HTTP 2协议简述(原)
  6. ROS中阶笔记(四):机器人仿真—Gazebo物理仿真环境搭建(重点)
  7. 电脑静音工作,又听不到12306的来票音乐,纠结啊 !但春节前工作多任务重,不能安心工作,就动手做个“无声购票弹窗”工具吧!...
  8. ASP.NET对验证控件的一些整理(一)
  9. charles安卓抓包步骤详解
  10. node下运行js文件实时更新文件变化
  11. 怎么禁止计算机安装程序,解决方案:如何禁止计算机随意安装软件?
  12. 2021年N1叉车司机新版试题及N1叉车司机考试试卷
  13. 在腾讯云上申请一个免费的centos系统,将编好的python程序和c程序上载到centos系统,
  14. Python实现飞机大战
  15. C#Application.DoEvents();的作用。
  16. 计算机18个专业方向
  17. JVM之一:GC垃圾回收原理及算法分析
  18. ArcGIS基础:快速批量删除线要素上多余的折点
  19. Autodesk全系列下载,Autodesk全版本下载
  20. C#学习之操作excel表格

热门文章

  1. linux ssh 推送文件_通过SSH实现Windows与linux之间传输文件
  2. 三维点云学习(5)1-introduction on to Deep learning
  3. 计算机逻辑判断函数,Excel函数:逻辑判断IF函数如何使用,涨知识了
  4. 传感器 倾斜角 android,android – 如何使用sensor / s获得手机的角度/度数?
  5. Java基础----泛型
  6. surfaceflinger类图
  7. Java客户端开发是什么_客户端桌面应用一般是用什么技术开发的?
  8. 聚宽macd底背离_很多散户可能永远都不会知道:MACD月线金叉,每一次MACD月金叉都会带来一波牛市...
  9. GDAL源码剖析(三)之Swig编译和帮助文档生成
  10. 微信小程序开发资料汇总