OpenCV+选定图中感兴趣区域ROI

摘要

感兴趣区域ROI

  • ROI(region of interest),这个区域是图像分析所关注的重点。我们圈定这个区域,以便进行进一步处理。
  • 优点:使用ROI定想读入的目标,可以减少处理时间,增加精度,给图像处理来带不小的便利。

定义ROI区域

  • 注意:图像坐标是先说列(长),再说行(宽),原点在窗口左上角

方法一:利用 Range 指定感兴趣的行和列的范围

  • Range 是从起始索引到终止索引(不包括终止索引)的一段连续序列,cRange 用来定义 Range 。
//定义一个 Mat 类型并设定 Range 区域
Mat imageROI;
imageROI = srcImage(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));
//Range(250,250+logoImage.rows)指定行的范围,Range(200,200+logoImage.cols)指定列的范围
//logoImage 是已加载的图像的列(长)和行(宽)

方法二: 利用矩形 Rect 框定,指定其左上角坐标(构造函数前两个参数)和矩形的 长宽(后两个参数)

//源码
//定义一个 Mat 类型并设定 ROI 区域
Mat imageROI;
imageROI = srcImage(Rect(200,250,logoImage.cols,logoImage.rows));
//200是列,250是行
//logoImage 是已加载的图像的列(长)和行(宽)

//srcImage 可以读入矩形区域???

ROI_AddImage()函数

  • 模块化(积木三)

//--------------------------------------【ROI_AddImage()函数】--------------------------------------
//		描述:利用感兴趣区域 ROI 实现图像叠加
//-----------------------------------------------------------------------------------------------

bool ROI_AddImage()
{
	//加载两张原图,检测是否读取成功 查看积木一
	//链接
	//获得 srcImage,logoImage,mask 要求logoImage和mask大小尺寸一致
	
	//方法一:
	//定义一个 Mat 类型并设定 Range 区域
	Mat imageROI;
	imageROI = srcImage(Range(250, 250 + logoImage.rows), Range(200, 200 + logoImage.cols));
	//Range(250,250+logoImage.rows)指定行的范围,Range(200,200+logoImage.cols)指定列的范围
	//logoImage 是已加载的图像的列(长)和行(宽)

	//方法二:
	//与方法一异曲同工
	/*Mat imageROI;
	imageROI = srcImage(Rect(200,250,logoImage.cols,logoImage.rows));
	*/

	//将掩膜复制到ROI
	logoImage.copyTo(imageROI,mask);

	//显示结果
	//namedWindow("利用ROI实现图像叠加");
	imshow("利用ROI实现图像叠加", srcImage);

	return true;
}

示例程序

  • 注意事项:掩膜的大小要和 ROI 感兴趣区域一样大
  • 思考:
    • 为啥出来的是彩色图像而不是灰度图像

//---------------------------------【头文件、命名空间包含部分】-----------------------------
//		描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;


//--------------------------------------【ROI_AddImage()函数】--------------------------------------
//		描述:利用感兴趣区域 ROI 实现图像叠加
//-----------------------------------------------------------------------------------------------

bool ROI_AddImage()
{
	//加载两张原图
	Mat srcImage = imread("albums/2.jpg");
	Mat logoImage = imread("albums/little4.jpg");
	//加载掩膜mask(必须是灰度图)
	Mat mask = imread("albums/gray06.jpg");

	//检测是否读取成功
	if (!srcImage.data || !logoImage.data || !mask.data)
	{
		printf("读取 srcImage 或 logoImage 或 mask 错误! \n");
		getchar();
		return false;
	}
	
	//测试使用
	imshow("srcImage", srcImage);
	imshow("logoImage ", logoImage);
	imshow("mask", mask);
	
	//方法一:
	//定义一个 Mat 类型并设定 Range 区域
	Mat imageROI;
	imageROI = srcImage(Range(250, 250 + logoImage.rows), Range(200, 200 + logoImage.cols));
	//Range(250,250+logoImage.rows)指定行的范围,Range(200,200+logoImage.cols)指定列的范围
	//logoImage 是已加载的图像的列(长)和行(宽)

	方法二:
	//与方法一异曲同工
	//Mat imageROI;
	//imageROI = srcImage(Rect(200,250,logoImage.cols,logoImage.rows));

	//将掩膜复制到ROI
	logoImage.copyTo(imageROI, mask);

	//显示结果
	//namedWindow("利用ROI实现图像叠加");
	imshow("利用ROI实现图像叠加", srcImage);

	return true;
}

-----------------------------------【main()函数】--------------------------------------------
		描述:控制台应用程序的入口函数,程序从这里开始执行
---------------------------------------------------------------------------------------------

int main()
{
	cout << ROI_AddImage() << endl;

	//为了一直观赏win窗口,必须这么干
	waitKey();

	return 0;
}

原图

原图

方法一显示结果

在这里插入图片描述

方法二显示结果

在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值