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

在开始之前我们还是先来看一下Mat类型的数据存储方式以及对Mat类型变量赋值的方式。Mat类型的图像在内存中包含两部分的内容:矩阵头与图像数据矩阵的指针。矩阵头包含了图像的基本信息(如矩阵尺寸、存储方式、存储地址等),而数据指针则指向图像所有像素值的矩阵。通常复制Mat类型数据有两种方类型,一种是仅复制Mat变量的矩阵头与数据指针,但是不复制图像数据区域。第二种是不仅为复制Mat类型图像的矩阵头与数据指针,同时也把图像数据区域复制过去。这种方式处理的数据量会很大。

我们先来看第一种方式。

Mat A = imread("i.jpg");

Mat B, C;

B = A;

Mat(A);

已有图像A,新建图像B和C。我们分别通过赋值方式和构造函数初始化B和C。此时A、B、C均有各自的矩阵头与指针,并且其指针指向统一个图像数据区域。即可以理解为A、B、C三个指针均指向同一片内存地址。使用这种方法后,对A、B、C中任意一个图像操作后另外两个也会同时变化,因为他们指向同一片图像数据区域。示意图如下:

再来看第二种方式:

Mat A = imread("i.jpg");

Mat B, C;

B = A.clone();

A.copyTo(C);

同样已有图像A,新建图像B和C。我们分别通过clone函数与copyTo函数复制图像。此时A、B、C三个图像不仅有着各自的矩阵头与指针,并且三个图像的数据区域地质也是不同的,对其中一个操作不会影响另外两个。示意图如下:

接线来我们来看一下选择图像ROI区域的方法。同样有两种方法。

Rect(x,y,width,height)//矩形框

Rect是一个矩形框。

x为起始列;

y为起始行;

width为宽度;

height为高度;

Range(start,end)//感兴趣行列范围

Range是感兴趣起始行/列与终点行/列。

分别用上面两种方法表示图像img从(100,100)到(200,200)的区域为:

img(Rect(100, 100, 100, 100));

img(Range(100, 200), Range(100,200));

实例

下面放出一个例子,读取图片img1"1.jpg"将原图拷贝到img4中,选取并显示img1中(200,200)到(300,300)区域的子图片,将该子图片保存到img3中,设定img5为img1中(100,100)到(200,200)的区域。将img1中img5区域的内容替换为img3.

//************头文件包含*************

#include "stdafx.h"

#include

#include//包含opencv的头文件

//***********************************

//************命名空间***************

using namespace cv;//使用opencv命名空间

using namespace std;

//***********************************

//************主函数*****************

int main()

{

int c;

Mat img1 = imread("1.jpg");

Mat img2,img3,img4,img5;

img4 = img1.clone();//将img1图像复制到img4中,此复制连同数据区域一起复制

namedWindow("原图");//创建窗口

namedWindow("ROI区域图");//创建窗口

namedWindow("复制图");//创建窗口

while ()

{

img2 = img1(Rect(,,,));//选取img1中从(200,200)到(300,300)的ROI区域

img5 = img1(Range(,+img2.rows),Range(,+img2.cols));//选取img1中从(100,100)开始与img2同样大小的ROI区域

img3 = img2.clone();//将img2图像复制到img3中,此复制连同数据区域一起复制

img3.copyTo(img5);//将img3图像复制到img5中,此时img1中相应的ROI区域数据也一起发生了变化

imshow("原图", img4);//显示图像

imshow("ROI区域图", img2);//ROI区域图像

imshow("复制图", img1);//显示合并后的图像

c = waitKey();//等待按键按下

if (c == ||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序

break;

}

return ;

}

以下是结果:

下载

功能很简单,代码很少,建议自己写一下或者在博文中复制一下,当然实在是懒的不要不要的土豪可以去下面的连接直接下载。

图像的ROI区域选择与复制

[opencv学习笔记六]图像的ROI区域选择与复制 孜然   7 人赞同了该文章 图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感 ...

opencv学习笔记(六)---图像梯度

图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

[OpenCV学习笔记3][图像的加载+修改+显示+保存]

正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

OpenCV学习笔记(3)——图像的基本操作

获取图像的像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 1.获取并修改像素值 先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信 ...

OpenCV学习笔记(10)——图像梯度

学习图像梯度,图像边界等 梯度简单来说就是求导. OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian.Sobel,Scharr其实就是求一阶或二阶导. ...

OpenCV学习笔记(7)——图像阈值

简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...

opencv学习笔记(04)——ROI

ROI的用法:1.直接相加:2.掩码法 #include #include

opencv学习笔记(七)---图像金字塔

图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...

opencv学习笔记(五)----图像的形态学操作

图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...

随机推荐

Winform菜单和工具栏控件

1.ContextMenuStrip--右键菜单 可以绑定在任何一个控件上,添加操作快捷键,并可以设置多层 每行相当于一个按钮,输入-可添加分割线 2.MenuStrip--菜单 优先级最高,一定会出 ...

JS限制input输入的为数字并且有小数的时候最多保留两位小数

JS限制input用户输入的为数字并且有小数的时候最多保留两位小数,代码如下: html部分:

opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制相关推荐

  1. opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

  2. matlab 增加图像对比度_计算机视觉学习笔记6 图像直方图与直方图均衡化

    图像的直方图 图像直方图表示图像中每一种像素的个数,反映了图像中每种像素值出现的频率,是图像的基本统计特征之一,具有平移,旋转,缩放不变性,广泛应用于图像处理的各个领域.比如灰度图像的阈值分割,基于颜 ...

  3. matlab 图像读取长宽_计算机视觉学习笔记1 图像读取显示和尺寸变换

    第一天,图像的读取,显示和尺寸变换 c++,python,MATLAB各实现一遍,以这个头骨图像为例吧 c++调用OpenCv实现图像显示和尺寸变换 c++用的编译器为clion,因此需要先配置cma ...

  4. java 图像梯度检测_opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 下面是我的一些理解: sabel算子: sobel算子主要用于获得数字图像的一 ...

  5. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  6. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  7. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  8. python半径为3圆形区域边界曲线_OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓...

    本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...

  9. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    http://blog.jobbole.com/85008/ ASP.Net MVC开发基础学习笔记(5):区域.模板页与WebAPI初步 2015/03/17 · IT技术 · .Net, Asp. ...

最新文章

  1. 用了5年的旧笔记本不要丢,1/4新机价格升级机器学习战斗本,隔壁研究员都馋哭了...
  2. Modbus设备调试工具Winform(包括SRC0001、海康威视、TTS以及各种类型LED的测试)...
  3. python日志模块的封装
  4. 【音视频安卓开发 (一)】AndroidStudio项目配置权限、jni库路径、ABI、Cmake
  5. 海南大学计算机原理,海南大学微机原理课件 第一章 计算机基础知识
  6. 前端转行大数据?没必要
  7. mysql存储过程 try_mysql存储过程之异常处理篇
  8. Ajax请求成功后页面跳转
  9. solr核心概念、配置文件
  10. iOS蓝牙4.0(BLE)-LightBlue与cc2540开发板通信
  11. TensorFlow 莫烦python
  12. acer台式计算机如何拆硬盘,原件 Acer V5471G拆卸与更换固态硬盘的详细说明
  13. 认识和理解计算机语言,如何理解所有的编程语言和语言
  14. 数据分析师简历缺商业项目经历怎么破?
  15. 基础图像处理 python+opencv
  16. 怎么保存ppt到计算机,怎么把ppt保存到u盘
  17. [SDOI2009][BZOJ 1226]学校食堂
  18. SAP: ZSD012 Send Billing Document to Customer with PDF Attachment
  19. PHP支付-Stripe支付对接支付宝
  20. 把资料放在网盘的风险有多大?MEGA网盘87GB数据遭泄露

热门文章

  1. Android之Surface 与 SurfaceFlinger关系
  2. 小程序开发余额提现功能,用户申请提现,后台财务审核
  3. 【算法特训总结】计算机经典算法的核心思想及独特角度的解读
  4. IDEA 修改单行的注释格式
  5. jeesite 之上传图片
  6. 浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术
  7. jQuery WeUI v0.1.0 发布了 - 微信公众账号开发者的福音
  8. [LCT刷题][连通性维护] P3950 部落冲突
  9. openstack的部署与云主机实例
  10. 南邮-云计算技术与大数据期末考试(知识点总结二)