ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

图像的ROI区域选择与复制

2019-08-16 12:52:54  阅读:264  来源: 互联网

标签:ROI Mat 200 复制 图像 100 img1


【opencv学习笔记六】图像的ROI区域选择与复制

孜然 孜然  

图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域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<iostream>
#include<opencv.hpp>//包含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 (1)
	{
		img2 = img1(Rect(200,200,100,100));//选取img1中从(200,200)到(300,300)的ROI区域
		img5 = img1(Range(100,100+img2.rows),Range(100,100+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(0);//等待按键按下
		if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
			break;
	}
	
	return 0;
}

 

以下是结果:

 

 

 

 

 

 

 

 

下载

 

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

 

【opencv学习笔记六】图像的ROI区域选择与复制

标签:ROI,Mat,200,复制,图像,100,img1
来源: https://www.cnblogs.com/adong7639/p/11363168.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有