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);
效果如下: