博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV——使用ROI进行图像切割
阅读量:6982 次
发布时间:2019-06-27

本文共 4386 字,大约阅读时间需要 14 分钟。

ROI(region of interest)——感兴趣区域。

1.用途

这个区域是图像分析所关注的重点。圈定这个区域,以便进行进一步的处理。而且,使用ROI指定

想读入的目标,可以减少处理时间,增加精度,给图像处理带来不小的便利。

2.定义ROI方法

  • 使用表示矩阵区域的Rect。

它指定矩阵的左上角坐标(构造函数的前两个参数)和矩阵的长宽(构造函数的后两个参数)以定义一个矩阵区域。

// 定义一个Mat类型并给定其设定的区域Mat imageROI;// 方法一imageROI = image(Rect(500, 250, logo.cols, logo.rows));
  • 指定感兴趣行或列的范围(Range)。

Range是指从起索引到终止索引(不包括终止索引)的一连串连续序列。cRange可以用来定义Range。如果使用Range来定义ROI,那么前例中定义ROI的代码可以重写为:

// 方法二imageROI = image( Range(250, 250+logoImage.rows),                                         Range(200, 200+logoImage.cols));

 3.切割具体步骤

  • 将要切割下的图像区域局部设置为ROI
void cvSetImageROI(IplImage* image,CvRect rect);
  • 创建一个与切割图像大小相同的新图像
IplImage* cvCreateImage( CvSize size, int depth, int channels );
    depth 图像元素的位深度,可以是下面的其中之一:
   
IPL_DEPTH_8U 无符号8位整型
IPL_DEPTH_8S 有符号8位整型
IPL_DEPTH_16U 无符号16位整型
IPL_DEPTH_16S 有符号16位整型
IPL_DEPTH_32F 单精度浮点数
IPL_DEPTH_64F 双精度浮点数
   

 

    channels 每个元素(像素)通道数.可以是 1, 2, 3 或 4.通道是交叉存取的
  • 将原图像复制到新图像中
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );

     操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。函数cvCopy从输入数组中复制选定的成分到输出数组:

    如果mask(I)!=0,则dst(I)=src(I)。

    如果输入输出数组中的一个IplImage类型的话,其ROI和COI将被使用。输入输出数组须是同样的类型、维数和大小。函数也可以用来复制散列数组(这种情况下不支持mask)。

  • 释放ROI区域
cvResetIamgeROI(src);

4.实例

  如何利用ROI将一幅图加到另一幅图的指定位置。

  通过一个图像掩码,直接将插入处的像素设置为插入图像的像素值,这样效果会很逼真。

#include 
#include
#include
using namespace cv;using namespace std;bool ROI_AddImage();bool LinearBlending();bool ROI_LinearBlending();void ShowHelpText();int main( ){ system("color 6F"); if(ROI_AddImage( )&& LinearBlending( )&&ROI_LinearBlending( )) { cout<
<<"\n运行成功,得出了需要的图像"; } waitKey(0); return 0;}//----------------------------------【ROI_AddImage( )函数】----------------------------------// 函数名:ROI_AddImage()// 描述:利用感兴趣区域ROI实现图像叠加//----------------------------------------------------------------------------------------------bool ROI_AddImage(){ // 【1】读入图像 Mat srcImage1= imread("dota_pa.jpg"); Mat logoImage= imread("dota_logo.jpg"); if( !srcImage1.data ) { printf("读取srcImage1错误~! \n"); return false; } if( !logoImage.data ) { printf("读取logoImage错误~! \n"); return false; } // 【2】定义一个Mat类型并给其设定ROI区域 Mat imageROI= srcImage1(Rect(200,250,logoImage.cols,logoImage.rows)); // 【3】加载掩模(必须是灰度图) Mat mask= imread("dota_logo.jpg",0); //【4】将掩膜拷贝到ROI logoImage.copyTo(imageROI,mask); // 【5】显示结果 namedWindow("<1>利用ROI实现图像叠加示例窗口"); imshow("<1>利用ROI实现图像叠加示例窗口",srcImage1); return true;}//---------------------------------【LinearBlending()函数】-------------------------------------// 函数名:LinearBlending()// 描述:利用cv::addWeighted()函数实现图像线性混合//--------------------------------------------------------------------------------------------bool LinearBlending(){ //【0】定义一些局部变量 double alphaValue = 0.5; double betaValue; Mat srcImage2, srcImage3, dstImage; // 【1】读取图像 ( 两幅图片需为同样的类型和尺寸 ) srcImage2 = imread("mogu.jpg"); srcImage3 = imread("rain.jpg"); if( !srcImage2.data ) { printf("读取srcImage2错误! \n"); return false; } if( !srcImage3.data ) { printf("读取srcImage3错误! \n"); return false; } // 【2】进行图像混合加权操作 betaValue = ( 1.0 - alphaValue ); addWeighted( srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage); // 【3】显示原图窗口 imshow( "<2>线性混合示例窗口【原图】", srcImage2 ); imshow( "<3>线性混合示例窗口【效果图】", dstImage ); return true;}//---------------------------------【ROI_LinearBlending()】-------------------------------------// 函数名:ROI_LinearBlending()// 描述:线性混合实现函数,指定区域线性图像混合.利用cv::addWeighted()函数结合定义// 感兴趣区域ROI,实现自定义区域的线性混合//--------------------------------------------------------------------------------------------bool ROI_LinearBlending(){ //【1】读取图像 Mat srcImage4= imread("dota_pa.jpg",1); Mat logoImage= imread("dota_logo.jpg"); if( !srcImage4.data ) { printf("读取srcImage4错误~! \n"); return false; } if( !logoImage.data ) { printf("读取logoImage错误~! \n"); return false; } //【2】定义一个Mat类型并给其设定ROI区域 Mat imageROI; //方法一 imageROI= srcImage4(Rect(200,250,logoImage.cols,logoImage.rows)); //方法二 //imageROI= srcImage4(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols)); //【3】将logo加到原图上 addWeighted(imageROI,0.5,logoImage,0.3,0.,imageROI); //【4】显示结果 imshow("<4>区域线性图像混合示例窗口",srcImage4); return true;}

 

 

参考:《OpenCV3编程入门》  毛星云 著

转载于:https://www.cnblogs.com/farewell-farewell/p/5905107.html

你可能感兴趣的文章
Function类型
查看>>
Python学习
查看>>
ES6之let和const
查看>>
关于跨域
查看>>
一个半路出家的前端工程师的2018 | 掘金年度征文
查看>>
Fork/Join 框架介绍
查看>>
5.6 前端开发日报
查看>>
面试官:聊一下你对MySQL索引实现原理?
查看>>
[译]Go如何优雅的处理异常
查看>>
数据格式校验
查看>>
Django搭建个人博客:上传头像图片
查看>>
Docker与自动化测试及其测试实践
查看>>
Java-集合的简单介绍
查看>>
分布式架构发展
查看>>
针对不同的系统的宏定义
查看>>
十分钟熟练Dockerfile指令
查看>>
ES6新特征总结与介绍——声明与表达式
查看>>
python3实现抓取网页资源的 N 种方法(内附200GPython学习资料)
查看>>
不用软件,手动修复双系统引导进win7,xp的多种方法
查看>>
python 访问需要HTTP Basic Authentication认证的资源
查看>>