OpenCV:seamlessClone泊松融合(C++/Python)

翻译

https://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/
本文仅仅介绍seamlessClone函数的使用,暂时并不会对其细节加以研究。

前言

OpenCV3中有许多让人激动的新特性,今天我们介绍关于图像融合相关的函数 。
下图1展示了使用OpenCV图像融合的一个示例,其中的目标(飞机)是通过图像融合的方式合成到背景图像上。与图2中的直接贴图到背景上想比,不难发现图像融合的神奇之处。
OpenCV:seamlessClone泊松融合(C++/Python)_第1张图片
图1 完美融合的背景与目标
OpenCV:seamlessClone泊松融合(C++/Python)_第2张图片
图2 贴图式将背景月目标放在一起
并且,在给予一定程度的人工干预后,OpenCV的图像融合还能得到更加真实的效果。图3中展示了给目标一个精细的mask的效果,飞机的颜色显得更加真实了!
OpenCV:seamlessClone泊松融合(C++/Python)_第3张图片
图2 给予目标精细的MASK后的融合结果

API解释

Python

output = cv2.seamlessClone(src, dst, mask, center, flags)

C++

seamlessClone(Mat src, Mat dst, Mat mask, Point center, Mat output, int flags)

src 目标影像,在本次给出的示例中是飞机。


dst 背景图像,在本次示例中是天空。


mask 目标影像上的mask,表示目标影像上那些区域是感兴趣区域。如果只对飞机感兴趣,那么mask上就只有飞机所在的区域。


center 目标影像的中心在背景图像上的坐标!注意是目标影像的中心!


flags 选择融合的方式,目前有NORMAL_CLONE、MIXED_CLONE和MONOCHROME_TRANSFER三种方法。


output 输出图像


示例代码

以下的代码都可以直接运行,可以下载下边给出的示例影像进行实验。
背景影像
OpenCV:seamlessClone泊松融合(C++/Python)_第4张图片
目标影像
OpenCV:seamlessClone泊松融合(C++/Python)_第5张图片

Python

# 注意修改路径!
import cv2
import numpy as np

# Read images : src image will be cloned into dst
im = cv2.imread("images/wood-texture.jpg")
obj= cv2.imread("images/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 = (height/2, 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)

# Write results
cv2.imwrite("images/opencv-normal-clone-example.jpg", normal_clone)
cv2.imwrite("images/opencv-mixed-clone-example.jpg", mixed_clone)

C++

//注意修改路径!
#include 
#include 
#include 
#include 

#include 

int main()
{
  using namespace cv;
  Mat src = imread("images/iloveyouticket.jpg");
  Mat dst = imread("images/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;

  seamlessClone(src, dst, src_mask, center, normal_clone, NORMAL_CLONE);
  seamlessClone(src, dst, src_mask, center, mixed_clone, MIXED_CLONE);

  // Save results
  imwrite("images/opencv-normal-clone-example.jpg", normal_clone);
  imwrite("images/opencv-mixed-clone-example.jpg", mixed_clone);
}

结果
OpenCV:seamlessClone泊松融合(C++/Python)_第6张图片

版权声明

本文章为学习之余翻译,仅供学习使用。
文中图片都来自被翻译网站,仅供学习使用。
飞机图片:
https://commons.wikimedia.org/wiki/File:Japan.airlines.b777-300.ja733j.arp.jpg
天空图片:
https://commons.wikimedia.org/wiki/File:Big_Tree_with_Red_Sky_in_the_Winter_Night.jpg

你可能感兴趣的:(Opencv)