OpenCV实战(3)——图像感兴趣区域

  • 0. 前言
  • 1. 感兴趣区域
    • 1.1 ROI 实例
    • 1.2 定义 ROI
  • 2. 使用图像掩码
  • 3. 完整代码示例
  • 小结
  • 系列链接

0. 前言

在实际应用场景下,图像处理函数有时只需要应用于图像的部分区域。OpenCV 中使用了一种优雅而简单的机制来定义图像中的子区域并将可以将其视为常规图像进行操作。本节中,我们将学习如何定义图像内的感兴趣区域 (region of interest, ROI)。

1. 感兴趣区域

为了说明如何定义感兴趣区域 (region of interest, ROI),我们将一个尺寸较小图像复制到一个更大的图像上。例如,我们要将以下 OpenCV logo 插入到测试图像中:


为了完成该目标,需要定义可以应用复制操作的 ROIROI 的位置将决定 logo 在图像中的插入位置。

1.1 ROI 实例

首先,读取 logo 图像并定义 ROI。我们可以使用 Rect 来定义 ROI

// 读取 logo
cv::Mat logo=  cv::imread("logo.png");
cv::Rect myRoi = cv::Rect(image.cols-log.cols,image.rows-logo.rowslogo.cols, logo.rows)

定义了 ROI 之后,我们可以创建一个新的 cv::Mat 实例 imageROI,将 ROI 应用到这个新的 cv::Mat 实例上,可以其作为常规的 cv::Mat 实例进行操作。此时,ROI 是一个 cv::Mat 对象,它指向与其父图像相同的数据缓冲区,并具有指定 ROI 坐标的标头。插入 logo 的方式如下:

// 定义图像感兴趣区域位于图像右下角
cv::Mat imageROI(image, myRoi);
// 插入 logo
logo.copyTo(imageROI)

在以上代码中,image 是目标图像,logologo 图像,编译并执行代码可以得到以下结果:

1.2 定义 ROI

定义 ROI 的一种方法是如上一小节所示使用 cv::Rect 实例,它通过指定左上角的位置(构造函数的前两个参数)和矩形的大小(即宽度和高度,使用后两个参数指定)来描述一个矩形区域。在示例代码中,我们使用图像的大小和 logo 大小令 logo 覆盖图像右下角的位置。需要注意的是,ROI 应该始终完全处于父图像内。
ROI 也可以使用行和列范围来描述,范围是从开始索引到结束索引(不包括两者)的连续序列,在 OpenCV 中使用 cv::Range 结构表示范围。因此,可以使用两个范围定义 ROI,上一节示例中的 ROI 也可以等效地定义如下:

// 也可以使用 cv::Range 定义感兴趣区域
imageROI= image(cv::Range(image.rows-logo.rows,image.rows), cv::Range(image.cols-logo.cols,image.cols));

在以上代码中,cv ::Matoperator() 函数会返回另一个 cv::Mat 实例,然后可以在后续调用中使用该实例。 ROI 的任何变换都会影响相应区域的原始图像,因为图像和 ROI 共享相同的图像数据。由于 ROI 的定义不需要数据的复制,因此无论 ROI 的大小如何,它都会在恒定的时间内执行。
如果要定义由图像的某些行组成的 ROI,可以使用以下代码:

cv::Mat imageROI = image.rowRange(start, end);

同样,对于由某些图像列组成的 ROI,可以使用以下代码:

cv::Mat imageROI = image.colRange(start, end);

OpenCV 方法和函数包括许多可选参数,当我们第一次使用某个函数时,应该花时间查看文档以了解有关此函数提供的可能参数的相关信息。例如,关于 ROI 的一种非常常见的可选参数是可以定义图像蒙版。

2. 使用图像掩码

有些 OpenCV 操作允许我们定义一个掩码,使用掩码可以限制给定函数或方法在图像中的应用区域(默认情况下,函数或方法会对所有图像像素进行操作)。掩码是一个 8 位图像,在希望应用操作的位置为非零值;在对应于掩码零值的像素位置,图像不受操作影响。例如,可以使用掩码调用 copyTo 方法,使用掩码仅复制显示 logo 的彩色部分:

// 定义图像的感兴趣区域
imageROI= image(cv::Rect(image.cols-logo.cols,image.rows-logo.rows,logo.cols,logo.rows));
// 也可以使用 cv::Range 定义感兴趣区域
// imageROI= image(cv::Range(image.rows-logo.rows,image.rows),
//                 cv::Range(image.cols-logo.cols,image.cols));
// 将 logo 图像作为掩码
cv::Mat mask(logo);
// 通过仅在非零掩码的位置复制插入
logo.copyTo(imageROI, mask);

执行以上代码可以得到下图:


logo 的背景是黑色的(值为 0),因此,可以很容易将其用作蒙版。当然,我们也可以在应用程序中自定义掩码;大多数基于 OpenCV 像素的操作都允许我们使用掩码进行操作。

3. 完整代码示例

完整代码如下:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
int main() {// 定义新窗口cv::namedWindow("Image"); // 读取图像cv::Mat image=  cv::imread("1.png"); // 读取 logocv::Mat logo=  cv::imread("logo.png"); // 定义图像的感兴趣区域cv::Mat imageROI(image, cv::Rect(image.cols-logo.cols, // ROI 坐标image.rows-logo.rows,logo.cols,logo.rows));// ROI 尺寸// 插入 logologo.copyTo(imageROI);cv::imshow("Image", image); // 展示图像cv::waitKey(0);// 重新读取原始图像image=  cv::imread("1.png");// 定义图像的感兴趣区域imageROI= image(cv::Rect(image.cols-logo.cols,image.rows-logo.rows,logo.cols,logo.rows));// 也可以使用 cv::Range 定义感兴趣区域// imageROI= image(cv::Range(image.rows-logo.rows,image.rows), //                 cv::Range(image.cols-logo.cols,image.cols));// 将 logo 图像作为掩码cv::Mat mask(logo);// 通过仅在非零掩码的位置复制插入logo.copyTo(imageROI, mask);cv::imshow("Image", image); // 展示图像cv::waitKey(0); return 0;
}

小结

在图像处理领域,感兴趣区域 (region of interest, ROI) 可以简单理解为从图像中选择的一个图像区域,这个区域是图像分析算法所关注的重点。使用 ROI 限定需要进行进一步处理的目标区域,可以减少图像处理时间,并增加处理精度。本节介绍了两种定义 ROI 的方法,并介绍了掩码在图像处理中的作用及用法。

系列链接

OpenCV实战(1)——OpenCV与图像处理基础
OpenCV实战(2)——OpenCV核心数据结构

OpenCV实战(3)——图像感兴趣区域相关推荐

  1. 提取图像感兴趣区域_从图像中提取感兴趣区域

    提取图像感兴趣区域 Welcome to the second post in this series where we talk about extracting regions of intere ...

  2. openCV任意几何形状感兴趣区域(ROI)提取

    图像感兴趣区域(ROI)提取主要使用掩模来进行.掩模是二值图像,感兴趣区域的掩模值设置为255,非感兴趣区域的掩模值为0 获取掩模的方法主要有两种 方法一 使用opencv中Mat函数方法,调用Mat ...

  3. 乳腺肿瘤超声图像感兴趣区域的自动识别综述

    1.  研究背景与意义 乳腺恶性肿瘤是女性最常见的恶性肿瘤之一,其死亡率已经超过宫颈癌死亡率,位居癌症死亡率的前五名 [d1]. 美国癌症协会的调查报告 [d2] 显示2008年全球新发乳腺癌病例达1 ...

  4. 基于matlab得图像感兴趣区域提取

    对于图像感兴趣区域(ROI)的提取,一般从来两个方面着手解决:一是利用图像分割技术提取ROI:二是从人眼得视觉特征出发,通过模拟人眼得视觉特点,寻找特定得视觉敏感区域,并将这些视觉敏感区域排序作为RO ...

  5. vs矩形框边框线显示被选中的区域;_如何使用OpenCV可视化的截取感兴趣区域

    OpenCV是一个著名的计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python ...

  6. 设置图像感兴趣区域(RIO)

       在图像处理区域,我么长需要设置感兴趣的区域(RIO,region of interest),来专注或简化工作.它通俗的的意思的就是从图像中选取一个区域图像,这个区域是图像分析的重点.我们圈定这个 ...

  7. LabVIEW感兴趣区域分析(实战篇—1)

    目录 1.ROI定义及实现方法 2.基础案例:图像感兴趣区域手动标记 3.进阶案例:图像颗粒自动标记 ROI(region of interest),感兴趣区域.机器视觉.图像处理中,从被处理的图像以 ...

  8. 【QtOpenCV 图像的感兴趣区域ROI】

    图像的ROI(region of interest)是指图像中感兴趣区域.在OpenCV中图像设置图像ROI区域,实现只对ROI区域操作. 文章目录 前言 一.GUI 二.实现代码 1.Rubber ...

  9. matlab如何手动选择图像目标区域,如何用MATLAB实现感兴趣区域ROI的选取

    描述 感兴趣区域 感兴趣区域(Regions of Interest,ROI)这一概念,是指图像中最能引起用户兴趣.最能表现图像内容的区域.感兴趣区域(Regions of Interest,ROI) ...

最新文章

  1. 受控组件和不受控组件的区别
  2. ubuntu12.04没有输入法。。
  3. P1462 通往奥格瑞玛的道路[最短路+二分+堆优化]
  4. switch判断条件
  5. bert模型中的[CLS]、[UNK]、[SEP]
  6. 15. 3Sum-数组
  7. java.sql.SQLException: 无法转换为内部表示之解决
  8. Google-优秀移动站点设计10招
  9. ip打包后如何加入 xilinx_科普!插上USB设备后电脑是怎么识别的呢?
  10. LeetCode算法入门- Reverse Integer-day6
  11. Unity Android 动态更新 Assembly-CSharp.dll
  12. 幻昼计算机弹奏,freepiano曲谱_Freepiano简谱
  13. 优雅降级实现IE8的transform平移属性
  14. linux4755代表什么权限,CentOS下chmod 755和4755的区别是什么?
  15. 20万赚200万,48岁创业者是这样吊打小鲜肉的!
  16. #define定义宏常量和宏函数
  17. reverse()的使用
  18. 使用备份软件快速备份VMware虚拟机
  19. 如何制作电子印章?电脑做印章最简单的方法是什么?
  20. drf jwt 认证

热门文章

  1. inpaint 9.1新版3秒去除一切图片中的无关元素
  2. hadoop-3.1.3启动HDFS时报错ERROR Attempting to operate on hdfs namenode as root的解决方法
  3. 云计算主要学些什么技术内容?零基础能学会吗?
  4. Linux命令行及各常用工具代理设置
  5. Ubuntu 文件管理器 ranger
  6. 在线破解网吧下载限制工具的制做方法。。
  7. MATLAB中AVP例子学习
  8. apple magic mouse 鼠标 windows 下如何设置滚轮方向 使其 和 mac 一致
  9. 如何从关键词库中选出核心关键词的小技巧
  10. 关于RUR040N02FRATL