摘要
感兴趣区域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;
}