【OpenCV学习笔记】十三、ROI与mask掩码

内容简介:

1.感兴趣区域(ROI)

2.掩码(mask)

3.例程:

初级融合(直接将logo复制到图像的感兴趣区域)

圆形ROI(首先新建一个掩码图像,再将logo复制到图像的感兴趣区域,只有掩码中非0部分有效)

高级融合(对掩码进行针对性处理)

图像基本运算中图像加法的掩码操作。

先上ppt:

【OpenCV学习笔记】十三、ROI与mask掩码_第1张图片


【OpenCV学习笔记】十三、ROI与mask掩码_第2张图片


【OpenCV学习笔记】十三、ROI与mask掩码_第3张图片


【OpenCV学习笔记】十三、ROI与mask掩码_第4张图片

代码:见注释

#include "opencv2/opencv.hpp"

using namespace cv;

void main()
{
	///初级融合(定义图像中的ROI,将logo拷贝到ROI)
    	// Mat img = imread("1.jpg",CV_LOAD_IMAGE_COLOR);//读入原始图片
    	// Mat logo = imread("opencv.jpg",CV_LOAD_IMAGE_COLOR);//读入logo图片
    	// 两种方式定义ROI
	// Mat imgROI = img(Rect(20, 20, logo.cols, logo.rows));  //Rect方法定义ROI,注意宽是:cols;高是rows。
	// Mat imgROI = img(Range(20, 220), Range(20, 220));  //Range方法定义ROI
    	// 初级融合
    	// logo.copyTo(imgROI);//将logo图片拷贝到img的ROI上(注意copyTo函数要求两图像大小和类型都相同,否则无效)
    	// imshow("ROI", imgROI);   
	// imshow("dst", img);
    	// waitKey(0);
    
   	///圆形ROI(定义图像中的ROI,将新建纯黑的mask,在mask中画一个白色圆形,将logo拷贝到ROI)
	// Mat img = imread("1.jpg",CV_LOAD_IMAGE_COLOR);//读入原始图片
	// Mat logo = imread("lena.jpg",CV_LOAD_IMAGE_COLOR);
	// Mat imgROI = img(Rect(20, 20, logo.cols, logo.rows));  //Rect方法定义ROI,注意宽是:cols;高是rows。
	// Mat mask = Mat::zeros(logo.size(), CV_8UC1);  //注意这一句,创建一个同logo一样大的纯黑的mask
	// circle(mask, Point(mask.rows/2, mask.cols/2), 100, Scalar(255), -1, 8);  //在mask中画一个向内填充的白色圆
	// imwrite("mask.jpg", mask);
	// logo.copyTo(imgROI, mask);//将logo拷贝到imgROI上,掩码为不为0的部分起作用,为0的部分不起作用
	// imshow("dst",img);	
	// waitKey(0);
    
   	///高级融合(定义图像中的ROI,将mask初始化为logo的灰度类型,针对性处理,背景部分置黑,图标部分置白,再将logo拷贝到ROI)
	// Mat img = imread("1.jpg",CV_LOAD_IMAGE_COLOR);//读入原始图片
	// Mat mask = imread("opencv.jpg", CV_LOAD_IMAGE_COLOR);//将mask初始化为logo的灰度类型
	// Mat logo = imread("opencv.jpg",CV_LOAD_IMAGE_COLOR);//读入logo图片
	// Mat imgROI = img(Rect(20, 20, logo.cols, logo.rows));  //Rect方法定义ROI,注意宽是:cols;高是rows。
	// bitwise_not(mask, mask);//对mask图像取反,白色(255)变成黑色(0)
	// imshow("mask", mask);//显示mask
	// threshold(mask, mask, 100, 255, THRESH_BINARY);//对mask进行二值化,将mask进一步处理
	// imshow("threshold", mask);
	// logo.copyTo(imgROI, mask);//将logo拷贝到imgROI上,掩码为不为0的部分起作用,为0的部分不起作用
	// imshow("dst",img);	
	// waitKey(0);
    
   	///演示了图像基本运算中图像加法的掩码操作(add函数加上了mask,要求mask的大小同src1的大小相同,否则报错)
	Mat img1 = imread("3.jpg",CV_LOAD_IMAGE_COLOR);
	Mat img2 = imread("4.jpg",CV_LOAD_IMAGE_COLOR);
	Mat mask =Mat::zeros(img1.size(), CV_8UC1);  //建一个纯黑图像(mask的大小同src1的大小相同)
	circle(mask , Point(mask.cols/2, mask.rows/2), 100, Scalar(100), -1, 8);//画一个白色填充的圆
	Mat dst = img2.clone();//先将img2深拷贝给dst
	add(img1, img2, dst, mask);//注意,要求mask的大小同src1的大小相同,否则报错
	imshow("dst", dst);
	waitKey(0);
}
运行结果:

初级融合:

【OpenCV学习笔记】十三、ROI与mask掩码_第5张图片

圆形ROI:

【OpenCV学习笔记】十三、ROI与mask掩码_第6张图片

高级融合:

【OpenCV学习笔记】十三、ROI与mask掩码_第7张图片

图像基本运算中图像加法的掩码操作:

【OpenCV学习笔记】十三、ROI与mask掩码_第8张图片




你可能感兴趣的:(OpenCV,图像处理,OpenCV学习笔记)