opencv笔记2:图像ROI

简介: time:2015年 10月 03日 星期六 12:03:45 CST# opencv笔记2:图像ROIROIROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区域。

time:2015年 10月 03日 星期六 12:03:45 CST

# opencv笔记2:图像ROI

ROI

ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区域。
OpenCV中定义的ROI是矩形的。
ROI的用处包括而不限于:提取出ROI区域做进一步处理(比如人脸识别、车牌识别);将另一张图片贴放到ROI区域。
这里以第二种用处为例,将一个logo图像添加到一张大图上指定的ROI区域。

图像贴放

粗略想想,包括这四个步骤

  • 定义大图和小图
  • 在大图上定义ROI区域
  • 小图贴放到ROI区域
  • 显示新的大图

这里在fedora22下使用dnf(yum)安装了opencv3.0,如下代码可以运行良好

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    //【1】定义大图和小图
    //【2】在大图上定义ROI区域
    //【3】小图贴放到ROI区域
    //【4】显示新的大图

    //【1】定义大图和小图
    Mat srcImage = imread("/home/chris/workspace/clion/dota_pa.jpg");
    Mat logoImage = imread("/home/chris/workspace/clion/dota_ss.png");
    if(!srcImage.data){
        cerr << "读取srcImage错误!" << endl;
        exit;
    }
    if(!logoImage.data){
        cerr << "读取logoImage错误!" << endl;
        exit;
    }

    //【2】在大图上定义ROI区域
    Mat imageROI = srcImage(Rect(20, 25, logoImage.cols, logoImage.rows));

    //【3】小图贴放到ROI区域
    logoImage.copyTo(imageROI);

    //【4】显示新的大图
    imshow("利用ROI实现图像叠加示例窗口", srcImage);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

这里copyTo()函数中只用到一个参数,浅墨的教程上有第二个参数:图像掩模(mask),我尝试了下,发现不用mask也没关系,mask的定义也不一定要是灰度图(即imread第二个参数设定为0)。对此,我表示不理解,反正能用就好了。

图像线性混合

直接把logo图替换掉ROI区域的做法通常不是很好,如果能把两者各按一定比例进行混合就显得更好些,这需要用到图像混合技术。
图像线性混合,其实就是不同图片(这里以两张图为例),各自按照一定比例系数进行相加,没什么神奇的地方:

result = alpha*src1 + beta*src2 + gamma

使用函数addWeighted(src1, alpha, src2, beta, gamma, dstImage, dtype=-1)
这里dtype参数,是输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。

OK,粗略想下线性混合的步骤:

  • 定义两幅图像
  • 定义权重和偏置量等参数
  • 按参数做图像混合
  • 显示结果

上代码:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    //【1】定义两幅图像
    //【2】定义权重和偏置量等参数
    //【3】按参数做图像混合
    //【4】显示结果

    //【1】定义两幅图像
    Mat srcImage1 = imread("/home/chris/workspace/clion/mogu.jpg");
    Mat srcImage2 = imread("/home/chris/workspace/clion/rain.jpg");

    //【2】定义权重和偏置量等参数
    double alpha = 0.5; //第一幅图的权重
    double beta = 1- alpha; //第二幅图的权重
    double gamma = 0.0; //偏置量

    //【3】按参数做图像混合
    Mat dstImage; //目标图像,存放结果
    addWeighted(srcImage1, alpha, srcImage2, beta, gamma, dstImage);

    //【4】显示结果
    imshow("线性混合结果", dstImage);
    waitKey(0);
    destroyAllWindows();

    return 0;

}

好吧,其实这东西很简单。应用到ROI区域,对应的代码为:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    //【1】定义两幅图像
    //【2】定义ROI区域
    //【3】定义权重和偏置量等参数
    //【4】按参数做图像混合
    //【5】显示结果

    //【1】定义两幅图像
    Mat srcImage1 = imread("/home/chris/workspace/clion/dota_pa.jpg");
    Mat srcImage2 = imread("/home/chris/workspace/clion/dota_ss.png");

    //【2】定义ROI区域
    Mat imageROI = srcImage1(Rect(20, 25, srcImage2.cols, srcImage2.rows));

    //【3】定义权重和偏置量等参数
    double alpha = 0.5; //第一幅图的权重
    double beta = 1- alpha; //第二幅图的权重
    double gamma = 0.0; //偏置量

    //【4】按参数做图像混合
    addWeighted(imageROI, alpha, srcImage2, beta, gamma, imageROI);

    //【5】显示结果
    imshow("线性混合结果", srcImage1);
    waitKey(0);
    destroyAllWindows();

    return 0;

}

多通道的分离和混合

既然前面把图像混合讲到了,那么按照通道进行混合也就可以做了!比如要把看起来是白色的logo图,和指定背景图上ROI区域混合,并且希望logo图显示为红色。这就需要ROI图本身为红色通道,logo图读取为灰度图像(保证都是单通道),然后混合,这之后由于ROI区域就是原图中的一个通道上的一个区域,原图像的红色通道变化了,现在把三个通道重新合并回去,就能够得到想要的效果图了。

粗略想下,步骤为:

  • 定义义两幅图像
  • 分离通道
  • 在通道图上定义ROI区域
  • 定义权重和偏置量等参数
  • 按参数做图像混合
  • 合并通道
  • 显示结果

对应的代码为:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    //义两幅图像
    //【2】分离通道
    //【3】在通道图上定义ROI区域
    //【4】定义权重和偏置量等参数
    //【5】按参数做图像混合
    //【6】合并通道
    //【7】显示结果

    //【1】定义两幅图像
    Mat srcImage = imread("/home/chris/workspace/clion/dota_pa.jpg");
    Mat logoImage = imread("/home/chris/workspace/clion/dota_logo.jpg", 0);

    //【2】分离通道
    vector<Mat> channels;
    split(srcImage, channels);

    //【3】在通道图上定义ROI区域
    Mat redChannelImage = channels.at(2);
    Mat imageROI = redChannelImage(Rect(50, 25, logoImage.cols, logoImage.rows));

    //【4】定义权重和偏置量等参数
    double alpha = 1.0;
    double beta = 0.5;
    double gamma = 0.0;

    //【5】按参数做图像混合
    addWeighted(imageROI, alpha, logoImage, beta, gamma, imageROI);

    //【6】合并通道
    merge(channels, srcImage);

    //【7】显示结果
    imshow("0通道", srcImage);
    waitKey(0);
    destroyAllWindows();

    return 0;

}
目录
相关文章
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
11100 4
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
605 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
3250 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
173 4
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
806 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
345 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
Ubuntu Linux C语言
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
本文介绍了在Ubuntu 18.04系统上编译安装OpenCV 3.4.0及其扩展包opencv_contrib 3.4.0的详细步骤,包括下载源码、安装依赖、配置CMake和编译安装,以及常见问题的解决方法。
1206 1
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
缓存 监控 计算机视觉
视频监控笔记(三):opencv结合ffmpeg获取rtsp摄像头相关信息
本文介绍了如何使用OpenCV结合FFmpeg获取RTSP摄像头信息,包括网络架构、视频监控系统组成、以及如何读取和显示网络摄像头视频流。
446 1
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)