opencv4 图像无缝融合
一:API函数介绍
OpenCV3.x的图像计算模块多了新算法API-无缝克隆(Seamless Cloning),主要是针对图像编辑,局部修改等应用场景实现迁移对象与原图像场景的无缝克隆。相关函数与参数说明如下:
-
seamlessClone(
-
InputArray src, // 输入的待克隆的图像,三通道
-
InputArray dst, // 输入的克隆目标图像,三通道
-
InputArray mask, // 遮罩层,大小跟src图像一样大
-
Point p, // 克隆图像在dst图像上的中心位置
-
OutputArray blend, // 克隆完成输出图像
-
int flags // 克隆方法选择
-
)
支持的克隆方法有三种分别如下
- NORMAL_CLONE
把待克隆的src对象完整的插入到dst目标图像图像中去,不改变其轮廓特征与结构
- MIXED_CLONE
混合克隆跟正常克隆相比,它会把背景颜色与纹理考虑进去,对轮廓特征与背景实现透明通道混合。
- MONOCHROME_TRANSFER
基于特征的迁移融合,只会把特征融合到背景图像当中。
二:代码演示
一般我们使用无缝克隆时候最常用设置就是正常克隆,都是想无缝替换或者融合特定对象到场景中去。演示程序主要是基于图像二值化实现自动遮罩层提取生成,然后基于遮罩图像,原图像、目标图像使用无缝克隆算法生成混合之后的输出图像。
案例一:文字融合
文字信息
目标图像
融合效果
遮罩层
演示源码
-
#include <opencv2/opencv.hpp>
-
#include <iostream>
-
using namespace cv;
-
using namespace std;
-
int main(int argc, char** argv) {
-
Mat dst = imread("D:/javaopencv/test.png");
-
Mat image = imread("D:/javaopencv/text_opencv.png");
-
if (dst.empty() || image.empty()) {
-
printf("could not load image...\n");
-
return -1;
-
}
-
Mat gray, mask;
-
cvtColor(image, gray, COLOR_BGR2GRAY);
-
threshold(gray, mask, 0, 255, THRESH_BINARY | THRESH_OTSU);
-
Mat k = getStructuringElement(MORPH_RECT, Size(10, 10), Point(-1, -1));
-
dilate(mask, mask, k);
-
imshow("mask", mask);
-
imshow("input", image);
-
imshow("target", dst);
-
imwrite("D:/mask.png", mask);
-
Mat blend;
-
seamlessClone(image, dst, mask, Point(dst.cols/2, dst.rows/2), blend, NORMAL_CLONE);
-
imshow("blend-image", blend);
-
imwrite("D:/blend.png", blend);
-
waitKey(0);
-
return 0;
-
}
案例二:对象融合
对象信息
目标图像
融合效果
遮罩层
演示源码
-
#include <opencv2/opencv.hpp>
-
#include <iostream>
-
using namespace cv;
-
using namespace std;
-
int main(int argc, char** argv) {
-
Mat dst = imread("D:/javaopencv/landscape.png");
-
Mat image = imread("D:/javaopencv/myapple.png");
-
if (dst.empty() || image.empty()) {
-
printf("could not load image...\n");
-
return -1;
-
}
-
Mat gray, mask;
-
cvtColor(image, gray, COLOR_BGR2GRAY);
-
threshold(gray, mask, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
-
Mat k = getStructuringElement(MORPH_RECT, Size(10, 10), Point(-1, -1));
-
dilate(mask, mask, k);
-
imshow("mask", mask);
-
imshow("input", image);
-
imshow("target", dst);
-
imwrite("D:/mask.png", mask);
-
add(image, Scalar(100, 100, 100), image, mask);
-
Mat blend;
-
seamlessClone(image, dst, mask, Point(dst.cols*0.7, dst.rows/2), blend, NORMAL_CLONE);
-
imshow("blend-image", blend);
-
imwrite("D:/blend.png", blend);
-
waitKey(0);
-
return 0;
-
}
注意点:
上述代码中,我使用了add来提升输入图像的亮度,这样做的好处是可以让融合之后的图像跟原图更加相似,感兴趣可以尝试注释掉看看会出来什么结果。另外还可以尝试本文中提到另外两种融合方法,这里就不再一一举例说明。
文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/122465875
- 点赞
- 收藏
- 关注作者
评论(0)