OpenCV-图像无缝克隆函数演示(c++)

一: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

#include

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

#include

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源计算机视觉库,提供了许多用于图像处理的函数和工具。下面是使用OpenCV C++实现图像处理基本操作的步骤: 1. 首先,需要在C++程序中包含OpenCV的头文件: ```c++ #include <opencv2/core/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream> ``` 2. 读取图像文件并显示图像: ```c++ cv::Mat image = cv::imread("example.jpg"); // 读取图像文件 cv::imshow("Image", image); // 显示图像 cv::waitKey(0); // 等待用户输入任意键继续 ``` 3. 转换图像的颜色空间: ```c++ cv::Mat gray_image; cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY); // 将图像从BGR色彩空间转换为灰度色彩空间 cv::imshow("Gray Image", gray_image); cv::waitKey(0); ``` 4. 图像的平滑滤波: ```c++ cv::Mat blur_image; cv::GaussianBlur(image, blur_image, cv::Size(5, 5), 0); // 高斯滤波 cv::imshow("Blur Image", blur_image); cv::waitKey(0); ``` 5. 图像的边缘检测: ```c++ cv::Mat canny_image; cv::Canny(image, canny_image, 100, 200, 3); // Canny边缘检测 cv::imshow("Canny Image", canny_image); cv::waitKey(0); ``` 6. 识别图像中的轮廓: ```c++ cv::Mat contour_image = image.clone(); // 克隆原始图像,以便在上面绘制轮廓 cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY); // 首先将图像从BGR色彩空间转换为灰度色彩空间 cv::threshold(gray_image, gray_image, 100, 255, cv::THRESH_BINARY); // 二值化图像 std::vector<std::vector<cv::Point>> contours; // 存储轮廓点的向量 std::vector<cv::Vec4i> hierarchy; // 存储轮廓层次结构的向量 cv::findContours(gray_image, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // 查找轮廓 for (int i = 0; i < contours.size(); i++) // 遍历所有轮廓并绘制 { cv::Scalar color = cv::Scalar(0, 0, 255); // 定义轮廓颜色(红色) cv::drawContours(contour_image, contours, i, color, 2, cv::LINE_8, hierarchy, 0); // 在图像上绘制每个轮廓 } cv::imshow("Contour Image", contour_image); cv::waitKey(0); ``` 引用: opencv(c++)实现图像处理基本操作。常见头文件 #include<opencv2/core/core.hpp> #include<opencv2/imgcodecs.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include<iostream> [^1]。引用:Opencv c++图像处理)。openCV 中 cv::Rect 矩形类用法_sinat_38102206的博客-CSDN博客_cv rect [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值