OpenCV计算摄影学(17)两个图像之间执行无缝克隆操作函数 seamlessClone()
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
图像编辑任务涉及全局更改(如颜色/强度校正、滤镜应用、变形)或针对选定区域的局部更改。在这里,我们关注的是实现局部更改,即那些限制在手动选择的区域(ROI)内的更改,并且是以无缝且 effortless(轻松的,不费力的)方式进行的。更改的程度从轻微的扭曲到由全新内容完全替换不等。
cv::seamlessClone 是 OpenCV 库中用于图像处理的一个函数,它可以在两个图像之间执行无缝克隆操作。这种技术通常用于将一个图像的一部分(源图像)无缝地复制到另一个图像(目标图像)的指定位置上。
函数原型
oid cv::seamlessClone
(
InputArray src,
InputArray dst,
InputArray mask,
Point p,
OutputArray blend,
int flags
)
参数
- 参数src 输入8位3通道图像。
- 参数 dst 输入8位3通道图像。
- 参数 mask 输入8位1或3通道图像。
- 参数 p 目标图像dst中放置对象的点。
- 参数 blend 输出图像,与dst具有相同的大小和类型。
- 参数 flags 克隆方法,可以是cv::NORMAL_CLONE、cv::MIXED_CLONE或cv::MONOCHROME_TRANSFER。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// 读取源图像和目标图像
Mat src = imread( "/media/dingxin/data/study/OpenCV/sources/images/jiangnan.jpg" );
Mat dst = imread( "/media/dingxin/data/study/OpenCV/sources/images/mask.png" );
if ( src.empty() || dst.empty() )
{
cout << "图像加载失败,请检查图像路径是否正确。\n";
return -1;
}
// 创建掩模,大小与源图像相同,类型为CV_8UC1
Mat mask = Mat::ones( src.size(), CV_8UC1 ) * 255;
// 定义在目标图像中的位置点p(即源图像中心放置的位置)
Point p( dst.cols / 2, dst.rows / 2 );
// 输出图像
Mat blend;
// 执行无缝克隆
seamlessClone( src, dst, mask, p, blend, NORMAL_CLONE );
// 显示结果
imshow( "Source Image", src );
imshow( "Destination Image", dst );
imshow( "Blended Image", blend );
waitKey( 0 );
return 0;
}
运行结果