实现步骤:
1、获取原始图像1的ROI区域,ROI区域与原始图像2大小相同;
2、将两张大小和通道数相同的图像(ROI和原始图像2)进行加权,加权后图像为透明状;
3、将加权后的图像转换为灰度图作为掩模;
4、将加权后的透明图像和掩模进行处理,然后拷贝到原始图像的ROI区域上。
示例代码:
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#define WINDOW_NAME "主窗口"
int main()
{
cv::Mat dstImage, grayImage, maskImage;
//图像文件名称
const std::string fileName = "琴女.jpg";
//两图像的权值
double alphaValue = 0.3;
double betaValue = 1 - alphaValue;
//创建一张粉色图像
cv::Mat pinkImage = cv::Mat(200, 250, CV_8UC3, cv::Scalar(230, 130, 255));
cv::imshow("pinkImage", pinkImage);
//创建窗口
cv::namedWindow(WINDOW_NAME,cv::WINDOW_AUTOSIZE);
//加载图像
cv::Mat srcImage = cv::imread(fileName,1);
//判断是否加载成功
if (srcImage.empty())
{
std::cout << "load image failed !";
return -1;
}
//获取ROI图像
cv::Mat roiImage = srcImage(cv::Rect(50,50, pinkImage.cols,pinkImage.rows));
cv::imshow("roiImage", roiImage);
//加权处理
cv::addWeighted(pinkImage, alphaValue, roiImage, betaValue, 0.0, dstImage);
cv::imshow("dstImage", dstImage);
//转换为灰度图
cv::cvtColor(dstImage, grayImage,CV_BGR2GRAY);
//掩模
maskImage = grayImage.clone();
//将dstImage和maskImage处理后拷贝给roiImage
dstImage.copyTo(roiImage, maskImage);
cv::imshow(WINDOW_NAME, srcImage);
cv::waitKey();
//销毁所有窗口
cv::destroyAllWindows();
return 0;
}
显示结果: