[OpenCV实战]25 使用OpenCV进行泊松克隆
目录
1 Seamless Cloning实现
1.1 Seamless Cloning实例
1.2 正常克隆(NORMAL_CLONE)与混合克隆(MIXED_CLONE)
1.2.1 Normal Cloning Result
1.2.2 Mixed Cloning Result
1.2.3 MONOCHROME TRANSFER Result
2 Seamless Cloning相关介绍
3 参考
OpenCV3中引入的令人兴奋的新功能之一称为泊松克隆Seamless cloning (有人也叫无缝克隆)。使用此新功能,您可以从一个图像复制对象,并将其粘贴到另一个图像中,使组合看起来无缝且自然。上面的图像是使用天空和飞机的场景创建的。如果我简单地将飞机图像覆盖在天空图像的顶部,结果将显得荒谬见下图。
当然,没有人会做那样的组合。你显然会小心地掩盖图像,也许在Photoshop中花了半天之后会得到一幅下图所示的图像。
如果你是一名艺术家,你将花费另外半天时间,仔细调整飞机上的颜色,使其与天空背景融为一体,并创造出美丽的构图。但是有两个问题。首先,你没有半天的时间。其次,你可能不是艺术家!
如果您可以在飞机周围制作一个非常粗糙的掩膜,并创建一个类似于第一张图的漂亮组合,这不是很酷吗?如果只需要10行代码呢?这不仅很酷,而且很厉害!
现在让我们看看我用来生成上面图像的代码。本文所有代码见:
https://github.com/luohenyueji/OpenCV-Practical-Exercise
1 Seamless Cloning 实现
1.1 Seamless Cloning 实例
快速浏览一下Seamless Cloning的用法
C++:
seamlessClone(Mat src, Mat dst, Mat mask, Point center, Mat output, int flags)
Python:
output = cv2.seamlessClone(src, dst, mask, center, flags)
详细参数介绍如下:
1)src目标图像,在本次给出的示例中是飞机。
2)dst背景图像,在本次示例中是天空。
3)mask目标图像上的掩模,表示目标图像上那些区域是感兴趣区域。如果只对飞机感兴趣,那么mask上就只有飞机所在的区域。
4)center 目标图像的中心在背景图像上的坐标!注意是目标图像的中心!
5)flags 选择融合的方式,目前有NORMAL_CLONE、MIXED_CLONE和MONOCHROME_TRANSFER三种方法。
6)output 输出图像。
现在让我们看看我用来生成上面图像的代码。
C++:
// OpenCV_SeamlessCloning.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// Read images : src image will be cloned into dst
//目标图像
Mat src = imread("image/airplane.jpg");
//背景图像
Mat dst = imread("image/sky.jpg");
// Create a rough mask around the airplane. 创建掩模
Mat src_mask = Mat::zeros(src.rows, src.cols, src.depth());
// Define the mask as a closed polygon 定义轮廓类似目标物体的多边形
Point poly[1][7];
poly[0][0] = Point(4, 80);
poly[0][1] = Point(30, 54);
poly[0][2] = Point(151, 63);
poly[0][3] = Point(254, 37);
poly[0][4] = Point(298, 90);
poly[0][5] = Point(272, 134);
poly[0][6] = Point(43, 122);
const Point* polygons[1] = { poly[0] };
int num_points[] = { 7 };
// Create mask by filling the polygon 填充多边形
fillPoly(src_mask, polygons, num_points, 1, Scalar(255, 255, 255));
// The location of the center of the src in the dst 目标图像在背景图像中心点左边
Point center(800, 100);
// Seamlessly clone src into dst and put the results in output
Mat output;
seamlessClone(src, dst, src_mask, center, output, NORMAL_CLONE);
// Write result
imwrite("opencv-seamless-cloning-example.jpg", output);
imshow("result", output);
waitKey(0);
return 0;
}
Python:
import cv2
import numpy as np
# Read images
src = cv2.imread("image/airplane.jpg")
dst = cv2.imread("image/sky.jpg")
# Create a rough mask around the airplane.
src_mask = np.zeros(src.shape, src.dtype)
poly = np.array([ [4,80], [30,54], [151,63], [254,37], [298,90], [272,134], [43,122] ], np.int32)
cv2.fillPoly(src_mask, [poly], (255, 255, 255))
# This is where the CENTER of the airplane will be placed
center = (800,100)
# Clone seamlessly.
output = cv2.seamlessClone(src, dst, src_mask, center, cv2.NORMAL_CLONE)
# Write result
cv2.imwrite("opencv-seamless-cloning-example.jpg", output);
在上面的例子中,我使用的克隆类型(标志)是NORMAL_CLONE。还有另一种类型MIXED_CLONE,与NORMAL_CLONE略有不同。让我们看看这两种类型在细节上有何不同。
1.2正常克隆((NORMAL_CLONE)与混合克隆(MIXED_CLONE)
我有一个5岁的儿子,如果我善待他,他会给我一张“I love you”的纸条,如下图所示。曾经有一段时间,孩子们渴望得到父母的认可,但现在父母必须尽最大努力去赢得“I love you”的纸条。不管怎样,回到克隆。我将使用其中一个“I love you”的纸条来说明不同融合方式的区别。
让我们尝试将这个图像克隆到下图所示的木质纹理图像上。我们将是使用全白的掩模将源图像克隆在木质纹理图像的中心。
代码如下:
C++:
#include "pch.h"
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// Read images : src image will be cloned into dst
//目标图像
Mat src = imread("image/iloveyouticket.jpg");
//背景图像
Mat dst = imread("image/wood-texture.jpg");
// Create an all white mask 白色掩模
Mat src_mask = 255 * Mat::ones(src.rows, src.cols, src.depth());
// The location of the center of the src in the dst 图像中心
Point center(dst.cols/2,dst.rows/2);
// Seamlessly clone src into dst and put the results in output
Mat normal_clone;
Mat mixed_clone;
Mat nonochrome_clone;
seamlessClone(src, dst, src_mask, center, normal_clone, NORMAL_CLONE);
seamlessClone(src, dst, src_mask, center, mixed_clone, MIXED_CLONE);
seamlessClone(src, dst, src_mask, center, nonochrome_clone, MONOCHROME_TRANSFER);
// Write results
imwrite("opencv-normal-clone-example.jpg", normal_clone);
imwrite("opencv-mixed-clone-example.jpg", mixed_clone);
imwrite("opencv-nonochrome-clone-example.jpg", nonochrome_clone);
return 0;
}
Python:
import cv2
import numpy as np
# Read images : src image will be cloned into dst
im = cv2.imread("image/wood-texture.jpg")
obj= cv2.imread("image/iloveyouticket.jpg")
# Create an all white mask
mask = 255 * np.ones(obj.shape, obj.dtype)
# The location of the center of the src in the dst
width, height, channels = im.shape
center = (int(height/2), int(width/2))
# Seamlessly clone src into dst and put the results in output
normal_clone = cv2.seamlessClone(obj, im, mask, center, cv2.NORMAL_CLONE)
mixed_clone = cv2.seamlessClone(obj, im, mask, center, cv2.MIXED_CLONE)
monochrome_clone = cv2.seamlessClone(obj, im, mask, center, cv2.MONOCHROME_TRANSFER)
# Write results
cv2.imwrite("opencv-normal-clone-example.jpg", normal_clone)
cv2.imwrite("opencv-mixed-clone-example.jpg", mixed_clone)
cv2.imwrite("opencv-monochrome-clone-example.jpg", monochrome_clone)
1.2.1 Normal Cloning Result
如果我们使用NORMAL_CLONE标志使用Normal
Cloning,我们将得到下图所示的结果。现在我们没有使用好的掩码,你可以看到单词“I”和“Love”之间以及“you”之间的过度平滑“和”Paa“。也就是这些字之间没有纹理背景。当然我们很懒。我们可以创建一个粗糙的掩码并改进结果。但如果你懒惰而聪明,你会使用混合克隆。
1.2.2 Mixed Cloning Result
在“正常克隆”中,源图像的纹理(渐变)将保留在克隆区域中。在混合克隆中,克隆区域的纹理(梯度)由源图像和目标图像的组合确定。混合克隆不会产生平滑区域,因为它会选择源图像和目标图像之间的主要纹理(渐变)。混合克隆的结果下图所示。请注意,“I”和“Love”,“you”和“Paa”之间的纹理不再平滑。懒人欢呼!
1.2.3 MONOCHROME TRANSFER Result
MONOCHROME_TRANSFER融合方式类似于NORMAL_CLONE,只是用单色融合。结果下图所示。
2 Seamless Cloning 相关介绍
OpenCV中的泊松克隆是由Patrick Perez,Michel Gangnet和Andrew Blake撰写的具有影响力的SIGGRAPH
2003论文题为Poisson Image Editing的实现。论文见:
http://www.irisa.fr/vista/Papers/2003_siggraph_perez.pdf
该论文的理论和实现细节实际上非常酷,但超出了本文的范围。详细可见:
https://blog.csdn.net/hjimce/article/details/45716603
3 参考
https://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/
[OpenCV实战]25 使用OpenCV进行泊松克隆的更多相关文章
- [OpenCV实战]50 用OpenCV制作低成本立体相机
本文主要讲述利用OpenCV制作低成本立体相机以及如何使用OpenCV创建3D视频,准确来说是模仿双目立体相机,我们通常说立体相机一般是指双目立体相机,就是带两个摄像头的那种(目就是指眼睛,双目就是两 ...
- [OpenCV实战]48 基于OpenCV实现图像质量评价
本文主要介绍基于OpenCV contrib中的quality模块实现图像质量评价.图像质量评估Image Quality Analysis简称IQA,主要通过数学度量方法来评价图像质量的好坏. 本文 ...
- [OpenCV实战]44 使用OpenCV进行图像超分放大
图像超分辨率(Image Super Resolution)是指从低分辨率图像或图像序列得到高分辨率图像.图像超分辨率是计算机视觉领域中一个非常重要的研究问题,广泛应用于医学图像分析.生物识别.视频监 ...
- [OpenCV实战]45 基于OpenCV实现图像哈希算法
目前有许多算法来衡量两幅图像的相似性,本文主要介绍在工程领域最常用的图像相似性算法评价算法:图像哈希算法(img hash).图像哈希算法通过获取图像的哈希值并比较两幅图像的哈希值的汉明距离来衡量两幅 ...
- [OpenCV实战]47 基于OpenCV实现视觉显著性检测
人类具有一种视觉注意机制,即当面对一个场景时,会选择性地忽略不感兴趣的区域,聚焦于感兴趣的区域.这些感兴趣的区域称为显著性区域.视觉显著性检测(Visual Saliency Detection,VS ...
- [OpenCV实战]46 在OpenCV下应用图像强度变换实现图像对比度均衡
本文主要介绍基于图像强度变换算法来实现图像对比度均衡.通过图像对比度均衡能够抑制图像中的无效信息,使图像转换为更符合计算机或人处理分析的形式,以提高图像的视觉价值和使用价值.本文主要通过OpenCV ...
- [OpenCV实战]36 使用OpenCV在视频中实现简单背景估计
目录 1 时间中值滤波 2 使用中值进行背景估计 3 帧差分 4 总结和代码 5 参考 许多计算机视觉应用中,硬件配置往往较低.在这种情况下,我们必须使用简单而有效的技术.在这篇文章中,我们将介绍一种 ...
- [OpenCV实战]33 使用OpenCV进行Hough变换
目录 1 什么是霍夫变换 1.1 应用霍夫变换以检测图像中的线条 1.2 累加器 1.3 线条检测 1.4 圆环的检测 2 代码 3 参考 1 什么是霍夫变换 霍夫变换是用于检测图像中的简单形状(诸如 ...
- [OpenCV实战]26 基于OpenCV实现选择性搜索算法
目录 1 背景 1.1 目标检测与目标识别 1.2 滑动窗口算法 1.3 候选区域选择算法 2 选择性搜索算法 2.1 什么是选择性搜索? 2.2 选择性搜索相似性度量 2.3 结果 3 代码 4 参 ...
随机推荐
- .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法
一.简述 本文简要的介绍.NET Framework中System.AppDomain.AssemblyResolve事件的用法.使用注意事项,以及复杂场景下AssemblyResolve事件的污染问 ...
- 驱动开发:内核枚举Minifilter微过滤驱动
Minifilter 是一种文件过滤驱动,该驱动简称为微过滤驱动,相对于传统的sfilter文件过滤驱动来说,微过滤驱动编写时更简单,其不需要考虑底层RIP如何派发且无需要考虑兼容性问题,微过滤驱动使 ...
- 方法的重写(override / overwrite)
1.重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作 2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法. 重写的规 ...
- Vue学习之--------列表渲染、v-for中key的原理、列表过滤的实现(2022/7/13)
文章目录 1.基本列表 1.1 基本知识 1.2 代码实例 1.3 测试效果 2.key的原理 2.1基本知识 2.2 代码实例 2.3 测试效果 2.4 原理图解 3.列表过滤 3.1 代码实例 3 ...
- 6.channels 配置websocket
Django默认不支持websockey,需要Django支持的话需要安装第三方组件 django channels 是django支持websocket的一个模块. 1.安装 pip3 in ...
- 7.pyagem-游戏背景
背景交替滚动 游戏启动后,背景图像不断的向下移动 在视觉上产生角色不断向上移动的错觉 游戏背景不断变化,游戏主角的位置报错不变 实现方案 创建两张背景图 第一张完全和屏幕重合,第二章在屏幕的正上方 ...
- Docker在windows系统以及Linux系统的安装
Docker简介和安装 Docker是什么 Docker 是一个应用打包.分发.部署的工具 你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要, 而普通虚拟机则是一个完 ...
- 三、Go环境安装
3.1.Go编译器的下载 官网:https://golang.google.cn/go中文网:https://studygolang.com/dl 3.2.安装 for Mac 3.2.1. mac ...
- iptables综合实验: 两个私有网络的互相通迅
环境准备: 主机A IP:192.168.0.6/24 网关改为192.168.0.8 firewallA IP:eth1 192.168.0.8/24 eth0 10.0.0.8/24 删除默认路由 ...
- Java集合精选常见面试题
前言 博主只是这篇文章的搬运工,为了加强记忆自己梳理了一遍并扩展了部分内容. 集合拓展链接:集合概述&集合之Collection接口 - 至安 - 博客园 (cnblogs.com) Java ...