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

来源:互联网 发布:ppt怎么画网络拓扑图 编辑:程序博客网 时间:2024/06/15 21:30

内容简介:

1.感兴趣区域(ROI)

2.掩码(mask)

3.例程:

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

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

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

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

先上ppt:








代码:见注释

#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深拷贝给dstadd(img1, img2, dst, mask);//注意,要求mask的大小同src1的大小相同,否则报错imshow("dst", dst);waitKey(0);}
运行结果:

初级融合:

圆形ROI:

高级融合:

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




0 0
原创粉丝点击