掩模Mask_一幅图进行抠图

来源:互联网 发布:阿里云机顶盒破解 编辑:程序博客网 时间:2024/05/22 15:38

源http://www.cnblogs.com/skyfsm/p/6894685.html


                                               详解掩膜mask

对一幅图进行抠图操作


#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
    Mat image, mask;
    Rect r1(100, 100, 250, 300);
    Mat img1, img2, img3, img4;
    image = imread("1.jpg");
    mask = Mat::zeros(image.size(), CV_8UC1);//第一步
    mask(r1).setTo(255);//r1是设置好的感兴趣区域 第二步
/*
第一步建立与原图一样大小的mask图像,并将所有像素初始化为0,因此全图成了一张全黑色图。
    第二步将mask图中的r1区域的所有像素值设置为255,也就是整个r1区域变成了白色。
得到mask图像
*/
 
    image.copyTo(img2, mask);//原始图image拷贝到目的图img2
/*
其实拷贝的动作完整版本是这样的:
       原图(image)与掩膜(mask)进行与运算后得到了结果图(img2)。
       何为图与掩膜的与运算?
      其实就是原图中的每个像素和掩膜中的每个对应像素进行与运算。
    比如1 & 1 = 1;1 & 0 = 0;

    比如一个3 * 3的图像与3 * 3的掩膜进行运算,得到的结果图像就是image2图像


    说白了:
    mask就是位图啊,来选择哪个像素允许拷贝,哪个像素不允许拷贝。
    如果mask像素的值是非0的,我就拷贝它,否则不拷贝。
    因为我们上面得到的mask中,感兴趣的区域是白色的,表明感兴趣区域的像素都是非0,
    而非感兴趣区域都是黑色,表明那些区域的像素都是0。一旦原图与mask图进行与运算后,
    得到的结果图只留下原始图感兴趣区域的图像了。

*/
    image.copyTo(img3);
    img3.setTo(0, mask);
/*
首先将原始图image拷贝一份给img3,
然后img3将mask白色区域设置为0(黑色),
好比如果mask中像素非0的,我就把我图像对应的那个点的像素值设置为0,
否则啥也不做。伪代码是if mask(i,j)>0 then img3(i,j)=0。
*/
    img1 = image(r1);


imshow("源图像", image);//""里是窗口名 原始图
imshow("mask_Roi内白外黑", mask);//黑白图
        imshow("Roi外是黑色", img2);//image2和3是效果图
        imshow("Roi是黑色", img3);//
imshow("抠图结果", img1);
  


    waitKey();
    return 0;
}
原创粉丝点击