专栏首页贾志刚-OpenCV学堂OpenCV3 新特性 - 图像无缝克隆函数演示

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

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

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL),作者:gloomyfish

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenCV中保存不同深度图像的技巧

    很多人开始学习OpenCV之后,接触前面几个API就包括imwrite函数,而且很快知道了如何去保存Mat对象为图像,常规代码如下:

    OpenCV学堂
  • 手撕OpenCV源码之filter2D(一)

    在上篇的GaussianBlur中提到,gaussianBlur使用的是filter2D的实现,因此上篇仅仅描述了高斯滤波器的生成细节,并没有针对滤波的计算细节...

    OpenCV学堂
  • 轻松学Pytorch-使用卷积神经网络实现图像分类

    大家好,本篇教程的贡献者来自社区投稿作者【陨星落云】,使用CIFAR-10数据集进行图像分类。该数据集中的图像是彩色小图像,其中被分为了十类。一些示例图像,如下...

    OpenCV学堂
  • 【自然框架】QuickPager分页控件的总体介绍和在线演示

    QuickPager分页控件的特点  两种运行方式:自动运行、手动运行。前者便捷,后者灵活。  多种分页方式:Postback、Postback伪URL、URL...

    用户1174620
  • 微信小程序Ⅰ [关于微信支付的一点思路]

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT
  • “provide your license server administrator with the following information:Error code=-42”Invalid par

    “provide your license server administrator with the following information:Error ...

    acoolgiser
  • mybatis show sql 打印 SQL 语句到控制台

    微风-- 轻许--
  • Tensorflow入门教程(八)——构建原型内核和高级可视化

    上一篇我介绍了Tensorflow中常用的控制流程操作。这一篇我会说一说用Python来构建原型内核和常用可视化方法。

    用户7498388
  • Node.js批量去除BOM文件

    之前的同事写了一个工具,但有bug,就是在替换文件后原文件的格式变成utf8 BOM了,这种带BOM的XML在Mac下可能读取不出来,所以就需要写个工具处理一下...

    meteoric
  • 谷歌Up主自制秃头生成器张东升躺枪,而这款生发GAN让你发际线前进一公里!

    想必最近看过《隐秘的角落》的小伙伴们对「张东升」这个人再熟悉不过了。而他洗完澡戴假发的样子成为了不少观众的心理阴影。

    新智元

扫码关注云+社区

领取腾讯云代金券