返回顶部
首页 > 资讯 > 精选 >OpenCV如何实现无缝克隆算法
  • 705
分享到

OpenCV如何实现无缝克隆算法

2023-07-02 11:07:30 705人浏览 安东尼
摘要

这篇“OpenCV如何实现无缝克隆算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV如何实现无缝克隆算法”文章吧

这篇“OpenCV如何实现无缝克隆算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV如何实现无缝克隆算法”文章吧。

    一、概述

    借助无缝克隆算法,您可以从一张图像中复制一个对象,然后将其粘贴到另一张图像中,从而形成一个看起来无缝且自然的构图。

    二、函数原型

    给定一个原始彩色图像,可以无缝混合该图像的两个不同颜色版本。

    void     cv::colorChange (InputArray src, InputArray mask, OutputArray dst, float red_mul=1.0f, float green_mul=1.0f, float blue_mul=1.0f)
    src输入 8 位 3 通道图像
    mask输入 8 位 1 或 3 通道图像
    dst输出与 src 大小和类型相同的图像
    red_mulR 通道倍增因子
    green_mulG 通道倍增因子
    blue_mulB 通道倍增因子

    对选区内部的梯度场应用适当的非线性变换,然后用泊松求解器积分,局部修改图像的表观照明。

    void     cv::illuminationChange (InputArray src, InputArray mask, OutputArray dst, float alpha=0.2f, float beta=0.4f)
    src输入 8 位 3 通道图像
    mask输入 8 位 1 或 3 通道图像
    dst输出与 src 大小和类型相同的图像
    alpha值范围在 0-2 之间
    beta值范围在 0-2 之间

    图像编辑任务涉及全局变化(颜色/强度校正、过滤器、变形)或与选择有关的局部变化。 在这里,我们有兴趣以无缝且轻松的方式实现局部更改,这些更改仅限于手动选择的区域 (ROI)。 变化的程度从轻微的扭曲到完全被新颖的内容替代。

    void     cv::seamlessClone (InputArray src, InputArray dst, InputArray mask, Point p, OutputArray blend, int flags)
    src输入 8 位 3 通道图像
    dst输入 8 位 3 通道图像
    mask输入 8 位 1 或 3 通道图像
    p在 dst 图像中指向放置对象的位置
    blend输出与 dst 大小和类型相同的图像
    flags可以是 cv::NORMAL_CLONE、cv::MIXED_CLONE 或 cv::MONOCHROME_TRANSFER 的克隆方法

    通过仅保留边缘位置的梯度,在与泊松求解器集成之前,可以洗掉所选区域的纹理,使其内容具有平坦的外观。 这里使用 Canny 边缘检测器。

    void     cv::textureFlattening (InputArray src, InputArray mask, OutputArray dst, float low_threshold=30, float high_threshold=45, int kernel_size=3)
    src输入 8 位 3 通道图像
    mask输入 8 位 1 或 3 通道图像
    dst输出与 src 大小和类型相同的图像
    low_threshold范围从 0 到 100
    high_threshold值 > 100
    kernel_size要使用的 Sobel 内核的大小

    三、OpenCV源码

    1、源码路径

    opencv\modules\photo\src\seamless_cloning.cpp

    2、源码代码

    #include "precomp.hpp"#include "opencv2/photo.hpp" #include "seamless_cloning.hpp" using namespace std;using namespace cv; static Mat checkMask(InputArray _mask, Size size){    Mat mask = _mask.getMat();    Mat gray;    if (mask.channels() > 1)        cvtColor(mask, gray, COLOR_BGRA2GRAY);    else    {        if (mask.empty())            gray = Mat(size.height, size.width, CV_8UC1, Scalar(255));        else            mask.copyTo(gray);    }     return gray;} void cv::seamlessClone(InputArray _src, InputArray _dst, InputArray _mask, Point p, OutputArray _blend, int flags){    CV_INSTRUMENT_REGION();     const Mat src  = _src.getMat();    const Mat dest = _dst.getMat();    Mat mask = checkMask(_mask, src.size());    dest.copyTo(_blend);    Mat blend = _blend.getMat();     Mat mask_inner = mask(Rect(1, 1, mask.cols - 2, mask.rows - 2));    copyMakeBorder(mask_inner, mask, 1, 1, 1, 1, BORDER_ISOLATED | BORDER_CONSTANT, Scalar(0));     Rect roi_s = boundingRect(mask);    if (roi_s.empty()) return;    Rect roi_d(p.x - roi_s.width / 2, p.y - roi_s.height / 2, roi_s.width, roi_s.height);     Mat destinationROI = dest(roi_d).clone();     Mat sourceROI = Mat::zeros(roi_s.height, roi_s.width, src.type());    src(roi_s).copyTo(sourceROI,mask(roi_s));     Mat maskROI = mask(roi_s);    Mat recoveredROI = blend(roi_d);     Cloning obj;    obj.normalClone(destinationROI,sourceROI,maskROI,recoveredROI,flags);} void cv::colorChange(InputArray _src, InputArray _mask, OutputArray _dst, float red, float green, float blue){    CV_INSTRUMENT_REGION();     Mat src  = _src.getMat();    Mat mask = checkMask(_mask, src.size());    _dst.create(src.size(), src.type());    Mat blend = _dst.getMat();     Mat cs_mask = Mat::zeros(src.size(), src.type());    src.copyTo(cs_mask, mask);     Cloning obj;    obj.localColorChange(src, cs_mask, mask, blend, red, green, blue);} void cv::illuminationChange(InputArray _src, InputArray _mask, OutputArray _dst, float alpha, float beta){    CV_INSTRUMENT_REGION();     Mat src  = _src.getMat();    Mat mask = checkMask(_mask, src.size());    _dst.create(src.size(), src.type());    Mat blend = _dst.getMat();     Mat cs_mask = Mat::zeros(src.size(), src.type());    src.copyTo(cs_mask, mask);     Cloning obj;    obj.illuminationChange(src, cs_mask, mask, blend, alpha, beta); } void cv::textureFlattening(InputArray _src, InputArray _mask, OutputArray _dst,                           float low_threshold, float high_threshold, int kernel_size){    CV_INSTRUMENT_REGION();     Mat src  = _src.getMat();    Mat mask = checkMask(_mask, src.size());    _dst.create(src.size(), src.type());    Mat blend = _dst.getMat();     Mat cs_mask = Mat::zeros(src.size(), src.type());    src.copyTo(cs_mask, mask);     Cloning obj;    obj.textureFlatten(src, cs_mask, mask, low_threshold, high_threshold, kernel_size, blend);}

    四、效果图像示例

    OpenCV如何实现无缝克隆算法

    OpenCV如何实现无缝克隆算法

    OpenCV如何实现无缝克隆算法

    以上就是关于“OpenCV如何实现无缝克隆算法”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

    --结束END--

    本文标题: OpenCV如何实现无缝克隆算法

    本文链接: https://lsjlt.com/news/341564.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • OpenCV如何实现无缝克隆算法
      这篇“OpenCV如何实现无缝克隆算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV如何实现无缝克隆算法”文章吧...
      99+
      2023-07-02
    • OpenCV实现无缝克隆算法的步骤详解
      目录一、概述二、函数原型三、OpenCV源码1、源码路径2、源码代码四、效果图像示例一、概述 借助无缝克隆算法,您可以从一张图像中复制一个对象,然后将其粘贴到另一张图像中,从而形成一...
      99+
      2024-04-02
    • git无法克隆如何解决
      今天小编给大家分享一下git无法克隆如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。网络问题第一个造成Git无法克隆的...
      99+
      2023-07-05
    • javascript如何实现深克隆
      小编给大家分享一下javascript如何实现深克隆,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
      99+
      2024-04-02
    • php中如何实现克隆
      小编给大家分享一下php中如何实现克隆,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!定义:克隆对象clone,即通过已有的对象复制一个新的同样的对象,但是两者之间...
      99+
      2023-06-14
    • C++实现LeetCode(133.克隆无向图)
      [LeetCode] 133. Clone Graph 克隆无向图 Given a reference of a node in a connected ...
      99+
      2024-04-02
    • 如何解决虚拟机无法克隆的问题
      确保虚拟机的硬件和软件配置是允许克隆的,例如确保虚拟机的操作系统是支持克隆的。 尝试重新启动虚拟机,有时候虚拟机无法克隆是因为虚拟机处于某种特殊状态下。 检查虚拟机的存储空间是否足够克隆,如果存储空间不足可能会导致无法克隆。 确...
      99+
      2024-06-11
      virtualbox
    • 如何实现centos复制克隆改网卡
      这篇文章主要讲解了“如何实现centos复制克隆改网卡”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现centos复制克隆改网卡”吧!备份etc/udev/rules.d/70-per...
      99+
      2023-06-10
    • JavaScript如何实现多级对象的深度克隆
      这篇文章给大家分享的是有关JavaScript如何实现多级对象的深度克隆的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。多级对象的深度克隆要深度克隆多级对象,可以遍历每个属性,并检查当前属性是否包含对象。如果是,则...
      99+
      2023-06-27
    • java克隆对象实现的方法有哪些
      在Java中,有以下几种方法可以实现对象的克隆:1. 实现Cloneable接口并重写clone()方法:这是最常见和最简单的方式。...
      99+
      2023-08-24
      java
    • js如何实现无缝滚动图
      小编给大家分享一下js如何实现无缝滚动图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图:代码如下:<!DOCTYPE...
      99+
      2024-04-02
    • JavaScript如何实现无缝轮播图
      这篇文章主要讲解了“JavaScript如何实现无缝轮播图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript如何实现无缝轮播图”吧!效果一、实现过程1)首先实现基本布局&nb...
      99+
      2023-07-02
    • vue如何实现无缝轮播图
      目录vue实现无缝轮播图轮播图的思路无缝轮播(跑马灯效果)vue实现无缝轮播图 轮播图的思路 一组图片进行不停地循环,如果循环到最后一张图片,就从第一张开始,不停循环,我们可以设置图...
      99+
      2024-04-02
    • OpenCV如何实现图像去噪算法
      今天小编给大家分享一下OpenCV如何实现图像去噪算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、函数参考1、Prim...
      99+
      2023-07-02
    • vue.js如何实现无缝滚动效果
      这篇文章将为大家详细讲解有关vue.js如何实现无缝滚动效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一个简单的基于vue.js的无缝滚动 :feet:在线...
      99+
      2024-04-02
    • jQuery如何实现无缝轮播效果
      这篇文章将为大家详细讲解有关jQuery如何实现无缝轮播效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。这个无缝轮播和那个图片平滑滚动的原理差不多。原理:ul向左滚动,...
      99+
      2024-04-02
    • Vue如何实现无缝轮播效果
      这篇文章主要介绍Vue如何实现无缝轮播效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下代码1.子组件代码代码如下(示例):<template>  <div>&...
      99+
      2023-06-14
    • js如何实现文字无缝轮播
      这篇“js如何实现文字无缝轮播”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“js如何实现文字无缝轮播”文章吧。所用到的知识点...
      99+
      2023-07-02
    • flex布局如何实现无缝滚动
      这篇文章将为大家详细讲解有关flex布局如何实现无缝滚动,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。案例的演示flex布局所谓flex布局就是弹性盒布局,这种布局在移动端比较常用,但随着浏览器的版本更新...
      99+
      2023-06-08
    • Css3如何实现无缝滚动防抖
      这篇“Css3如何实现无缝滚动防抖”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Css3如何实现无缝滚动防抖”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入...
      99+
      2023-06-08
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作