内容简介:
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深拷贝给dst
add(img1, img2, dst, mask);//注意,要求mask的大小同src1的大小相同,否则报错
imshow("dst", dst);
waitKey(0);
}
运行结果:
初级融合:
圆形ROI:
高级融合:
图像基本运算中图像加法的掩码操作: