前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV4 新特性 - 图像无缝克隆函数演示

OpenCV4 新特性 - 图像无缝克隆函数演示

作者头像
OpenCV学堂
发布2022-06-06 16:11:11
7830
发布2022-06-06 16:11:11
举报

点击上方蓝字关注我们

微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识

一:API函数介绍

OpenCV3.x的图像计算模块多了新算法API-无缝克隆(Seamless Cloning),主要是针对图像编辑,局部修改等应用场景实现迁移对象与原图像场景的无缝克隆。相关函数与参数说明如下:

代码语言:javascript
复制
seamlessClone(InputArray src, // 输入的待克隆的图像,三通道InputArray dst, // 输入的克隆目标图像,三通道InputArray mask, // 遮罩层,大小跟src图像一样大Point p, // 克隆图像在dst图像上的中心位置OutputArray blend, // 克隆完成输出图像int flags // 克隆方法选择)

支持的克隆方法有三种分别如下

- NORMAL_CLONE

把待克隆的src对象完整的插入到dst目标图像图像中去,不改变其轮廓特征与结构

- MIXED_CLONE

混合克隆跟正常克隆相比,它会把背景颜色与纹理考虑进去,对轮廓特征与背景实现透明通道混合。

- MONOCHROME_TRANSFER

基于特征的迁移融合,只会把特征融合到背景图像当中。

二:代码演示

一般我们使用无缝克隆时候最常用设置就是正常克隆,都是想无缝替换或者融合特定对象到场景中去。演示程序主要是基于图像二值化实现自动遮罩层提取生成,然后基于遮罩图像,原图像、目标图像使用无缝克隆算法生成混合之后的输出图像。

案例一:文字融合

文字信息

目标图像

融合效果

遮罩层

演示源码

代码语言:javascript
复制
#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;}

案例二:对象融合

对象信息

目标图像

融合效果

遮罩层

演示源码

代码语言:javascript
复制
#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来提升输入图像的亮度,这样做的好处是可以让融合之后的图像跟原图更加相似,感兴趣可以尝试注释掉看看会出来什么结果。另外还可以尝试本文中提到另外两种融合方法,这里就不再一一举例说明。

扫码查看OpenCV+OpenVIO+Pytorch系统化学习路线图

 推荐阅读 

CV全栈开发者说 - 从传统算法到深度学习怎么修炼

2022入坑深度学习,我选择Pytorch框架!

Pytorch轻松实现经典视觉任务

教程推荐 | Pytorch框架CV开发-从入门到实战

OpenCV4 C++学习 必备基础语法知识三

OpenCV4 C++学习 必备基础语法知识二

OpenCV4.5.4 人脸检测+五点landmark新功能测试

OpenCV4.5.4人脸识别详解与代码演示

OpenCV二值图象分析之Blob分析找圆

OpenCV4.5.x DNN + YOLOv5 C++推理

OpenCV4.5.4 直接支持YOLOv5 6.1版本模型推理

OpenVINO2021.4+YOLOX目标检测模型部署测试

比YOLOv5还厉害的YOLOX来了,官方支持OpenVINO推理

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二:代码演示
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档