【opencv学习之二十一】ROI和mask

ROI是选择感兴趣的区域并截取保存在内存中,一般俗称抠图;

mask是掩码或者掩膜,掩码的位置如果为0,则在这个位置上不做修改;如果不为0,则做与运算;

直接看源码

1.简单融合

//初级融合(定义图像中的ROI,将logo拷贝到ROI)
    Mat img = imread("D:/2.jpg",CV_LOAD_IMAGE_COLOR);//读入原始图片
    Mat logo = imread("D:/ImageTest/1.jpg",CV_LOAD_IMAGE_COLOR);//读入logo图片
    // 两种方式定义ROI
    Mat imgROI = img(Rect(20, 20, logo.cols, logo.rows));  //Rect方法定义ROI,注意宽是:cols;高是rows。
    Mat imgROI2 = img(Rect(20, 20, logo.cols, logo.rows));  //Rect方法定义ROI,注意宽是:cols;高是rows。
    //    Mat imgROI2 = img(Range(20, 220), Range(20, 220));  //Range方法定义ROI
    imshow("ROI2", imgROI2);
    logo.copyTo(imgROI);//将logo图片拷贝到img的ROI上(注意copyTo函数要求两图像大小和类型都相同,否则无效)
    //1、image.copyTo(imageROI),作用是把image的内容粘贴到imageROI;
    // 2、image.copyTo(imageROI,mask),作用是把mask和image重叠以后
    //把mask中像素值为0(black)的点对应的image中的点变为透明,而保留其他点。
    imshow("ROI", imgROI);
    imshow("dst", img);
    waitKey(0);
效果如下:


2.圆形ROI

  //圆形ROI(定义图像中的ROI,将新建纯黑的mask,在mask中画一个白色圆形,将logo拷贝到ROI)
    Mat img = imread("D:/2.jpg",CV_LOAD_IMAGE_COLOR);//读入原始图片
    Mat logo = imread("D:/ImageTest/1.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);
效果如下:

3.由于mask的性质,为0的不做处理效果如下:

  //mask融合(定义图像中的ROI,将mask初始化为logo的灰度类型,针对性处理,背景部分置黑,图标部分置白,再将logo拷贝到ROI)
    Mat img = imread("D:/2.jpg",CV_LOAD_IMAGE_COLOR);//读入原始图片
    Mat mask = imread("D:/ImageTest/1.jpg", CV_LOAD_IMAGE_COLOR);//将mask初始化为logo的灰度类型
    Mat logo = imread("D:/ImageTest/1.jpg",CV_LOAD_IMAGE_COLOR);//读入logo图片
    //         Mat mask = imread("D:/ImageTest/test.jpg", CV_LOAD_IMAGE_COLOR);//读取灰度阶级图
    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
    //    cv::cvtColor(mask,mask,COLOR_RGB2GRAY);//进行,灰度处理
    //         imwrite("D:/mask3.jpg", mask); //保存结果图片
    threshold(mask,mask, 100, 255, THRESH_BINARY);//对mask进行二值化,threshold处理彩色图是将rgb3值分别按照灰度值分割,只保留纯色
    imshow("threshold", mask);
    logo.copyTo(imgROI, mask);//将logo拷贝到imgROI上,rgb为不为0的部分保留,为0的被置换为目标图的rgb
    imshow("dst",img);
    //    imwrite("D:/mask4.jpg", mask); //保存结果图片
    waitKey(0);
效果如下:



4.加入add运算

///演示了图像基本运算中图像加法的掩码操作(add函数加上了mask,要求mask的大小同src1的大小相同,否则报错)
    Mat img1 = imread("D:/ImageTest/logo.png",CV_LOAD_IMAGE_COLOR);
    Mat img2 = imread("D:/ImageTest/pic2.png",CV_LOAD_IMAGE_COLOR);
    imshow("img1", img1);
    imshow("img2", img2);
    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);
效果如下:





  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值