OpenCV实现照片换底色处理

news2024/11/27 16:31:27

目录

1.导言

2.引言

3.代码分析

4.优化改进

5.总结


1.导言

在图像处理领域,OpenCV是一款强大而广泛应用的开源库,能够提供丰富的图像处理和计算机视觉功能。本篇博客将介绍如何利用Qt 编辑器调用OpenCV库对照片进行换底色处理,实现更加独特和吸引人的效果

最终的实现效果如下图

2.引言

OpenCV是一个跨平台的计算机视觉库,其中包含了大量用于图像处理的函数和算法。照片换底色处理是一种常见的图像处理技术,可应用于广告设计、摄影后期处理等领域,为照片增添更多的艺术表现力。本次博客将使用OpenCV库中的函数和方法,在一张照片中将指定颜色范围内的背景替换为自定义的颜色。

3.代码分析

照片换底色处理是一种图像处理技术,通过选择并替换背景颜色,改变照片的整体视觉效果。OpenCV库提供了丰富的函数和方法,可以实现对图像的读取、处理和显示等操作。通过利用OpenCV的颜色转换、颜色范围选择和图像复制等函数,我们可以方便地实现照片换底色处理。

1.首先,需要在程序中引入OpenCV库的头文件,这样才能使用OpenCV的函数和数据结构。先下载好OpenCV然后把OpenCv的头文件包含到pro文件中去 注意要找到include文件地址

然后在x86中bin文件下所以形如 libopencv_*,dll 的文件 包含进去同时复制粘贴到C:\Windows\SysWOW64

 添加好库以后头文件也要包含进去(可以在添加OpenCV头文件之前运行一遍,不然电脑可能没有运行找不到库,让电脑反应过来)

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

 2.对图片进行处理

本次使用的代码中,我们首先将输入图像转换为HSV格式,以便更好地处理颜色信息。然后,通过指定颜色范围,创建一个掩膜(mask),将在范围内的像素设置为白色,不在范围内的像素设置为黑色。接下来,通过取反操作,我们可以从原始图像中抠出人像区域。创建一个新的背景图像,并将其设置为自定义的背景颜色。最后,通过将原始图像复制到新的背景图像中,仅保留人像区域,实现照片换底色的效果。

代码实现

    //1.显示一张图片
    Mat image = imread("d:/test.png");
    imshow("1",image);

    //2.图片转hsv格式
    Mat hsv;
    cvtColor(image,hsv,COLOR_BGR2HSV);
    imshow("2",hsv);

    //3.截取颜色区域的范围 inRang   在hsv取值范围内 呈白色  不在范围内 呈黑色
    Mat mask;//模板
    inRange(hsv,Scalar(100,43,46),Scalar(124,255,255),mask);
    imshow("3",mask);//现在的mask 就是可以抠出蓝色的底色

    //4.取反操作  但是我们需要抠出的是人像
    bitwise_not(mask,mask);
    imshow("4",mask);

 对图片进行hsv  ,取色  , 取反 创建新背景效果如下

Scalar可以选择颜色范围,三元素RGB颜色范围,针对选取的颜色可以参考hsv表

 3.实现照片换底色,选取红色背景

红色背景RGB选择 为 40,40,200,也可以根据自己需要调整范围

 //5.做一张红色背景图   大小?类型? 参考image原始图片
    Mat redBack = Mat::zeros(image.size(),image.type());
    redBack = Scalar(40,40,200);
    imshow("5",redBack);

    //6.实现图片的拷贝操作
    image.copyTo(redBack,mask);
    imshow("6",redBack);

4.优化改进

对于原始代码,我们可以进行一些优化和改进,以提高代码的可读性和扩展性。例如,可以将换底色处理的功能封装成一个独立的函数,方便重复调用。同时,可以通过参数化的方式,使得函数可以根据不同的需求进行自定义设置。此外,还可以添加错误检查和异常处理机制,提高代码的健壮性和容错性。此外优化后还增加了对图像的保存流程

优化后完整代码

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

void changeBackground(const Mat& inputImage, const Scalar& backgroundColor, const Scalar& lowerBound, const Scalar& upperBound)
{


    // 图片转为hsv格式
    Mat hsv;
    cvtColor(inputImage, hsv, COLOR_BGR2HSV);
    // 在指定范围内的变为白色,不在范围内的变为黑色
    Mat mask;
    inRange(hsv, lowerBound, upperBound, mask);
    imwrite("D:/QtProject/mask1.png", mask);

    // 取反操作,抠出人像
    bitwise_not(mask, mask);


    // 创建新的背景图像
    Mat newBackground = Mat::zeros(inputImage.size(), inputImage.type());
    newBackground = backgroundColor;

    // 将原始图像复制到新背景图像中,只保留前景(人像)区域
    inputImage.copyTo(newBackground, mask);

    imshow("New Background Image", newBackground);


    //保存图片
    imwrite("D:/QtProject/new_background.png", newBackground);


}

int main(int argc, char* argv[])
{
    // 显示一张图片
    Mat image = imread("D:/QtProject/gege.jpg");
    imshow("1",image);
    // 检查图像是否成功加载
    if (image.empty())
    {
        cout << "Failed to load image." << endl;
        return -1;
    }

    // 定义背景颜色、颜色范围
    Scalar backgroundColor(60,60,220);
    Scalar lowerBound(100, 43, 46);
    Scalar upperBound(124, 255, 255);

    // 更换背景
    changeBackground(image, backgroundColor, lowerBound, upperBound);

    // 等待用户按下任意键
    waitKey(0);

    return 0;
}

5.总结

通过本篇博客,我们了解了OpenCV实现照片换底色处理的方法和步骤。OpenCV库提供了丰富的图像处理函数和算法,可以帮助我们实现各种各样的图像处理任务。照片换底色处理是其中的一种,通过选择并替换背景颜色,可以为照片增添独特的艺术效果。希望本篇博客能够对读者理解和应用OpenCV库进行图像处理有所帮助。如果有需要Qt和OpenCV下载的同学可以私聊我,欢迎大家共同进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Promise 讲解,js知识,es6

文章目录 一、Promise的三种状态1. 初始态pending2. 成功态fulfilled&#xff0c;调用resolve方法3. 失败态rejected&#xff0c;调用reject方法 二、Promise的方法then方法catch方法 三、async和awaitasync 函数await 表达式 四、代码举例帮助理解1、Promise的值通过then方法获…

【idea】编译热部署

项目场景&#xff1a; 实际工作中&#xff0c;用到了idea&#xff0c;发现idea不编译代码&#xff0c;热部署什么的都不行 问题描述 在实际的工作中idea遇到了各种问题&#xff0c;之前一直用的2022版的&#xff0c;公司用的jboss起的项目&#xff0c;启动过程极其痛苦&#…

电子档案管理系统

电子文档 登陆成功后点击左上角“”选择“档案管理”跳转到“档案管理首页”如下图: 该界面列出用户被授权查看的可视化数据图形,柱图、饼图、线图、雷达图等,并结合数据仓库里的动态数据进行数据展现。 图形所展示的数据可根据企业需求定制,点击图形即可查看关联内容,方…

C++类与对象(上部曲)

目录 面向过程和面向对象初步认识 类的引入 类的定义 类的两种定义方式&#xff1a; 1. 声明和定义全部放在类体中 2. 类声明放在.h文件中&#xff0c;成员函数定义放在.cpp文件中 类的访问限定符及封装 1 访问限定符 2 封装 类的实例化 类对象的存储方式 this指针 …

IDEA快速创建SpringBoot

文件具有错误的版本 61.0, 应为 52.0报错可以看看是不是Springboot的版本比较高 和jdk版本不匹配 package com.qf.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframewor…

黑马 pink h5+css3+移动端前端

网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari…

从Vue2到Vue3【四】——Composition API(第四章)

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介从Vue2到Vue3【一】Composition API&#xff08;第一章&#xff09;从Vue2到Vue3【二】Composition API&#xff08;第二章&#xff09;从Vue2到Vue3【三】Composition API&#xff08;第三章&#xff09;从Vue2到Vue3【四】C…

os.environ[“CUDA_VISIBLE_DEVICES“]学习总结

今天发现一个很有意思的东西 import torch import os # Specify the GPU device os.environ["CUDA_VISIBLE_DEVICES"] "1" print(torch.cuda.is_available())但是如果修改下面的设置后&#xff0c;结果就变成了 import torch import os # Specify the…

【100天精通python】Day7:数据结构_列表 List的创建、删除、访问、遍历、统计、排序、推导等使用

目录 1 列表的创建 2 列表的删除 3 访问列表元素 4 遍历列表 5 添加修改删除列表元素 6 对列表进行统计和计算 7 对列表进行排序 8 列表推导式 9 多维列表 在Python中&#xff0c;列表是一种有序的可变数据类型&#xff0c;用于存储一组元素。 列表使用方括号“[] ”来…

汇编习题1-100和

.text .globl _start_start:mov r0,#0MOV r1,#0stop:cmp r1,#0x64addcc r1,r1,#0x1addcc r0,r0,r1b stop .end运行结果&#xff1a; 寄存器R0就为16进制的结果

K8S初级入门系列之四-Namespace/ConfigMap/Secret

一、前言 本章节我们继续学习Namespace、ConfigMap、Secret基础概念&#xff0c;了解他们基本用法和操作。NameSpace为命名空间&#xff0c;在同一集群中试下资源隔离。ConfigMap通过key-value的方式实现明文配置数据的保存&#xff0c;Secret与ConfigMap类似&#xff0c;不过是…

Windows下使用rocketMq

1、下载&#xff08;下载zip后解压即可&#xff09; 下载地址&#xff1a;下载 | RocketMQ 2、配置环境变量&#xff08;注意&#xff1a;该目录的下一级是bin&#xff09; 3、启动 在bin目录下使用cmd 分别输入 3.1 启动name server (下图是启动成功的显示&#xff0c;窗口…

CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、CPU密集型与IO密集型3.1、CPU密集型3.2、I/O密…

dp算法 力扣978、力扣139、力扣467

目录 一、力扣978978. 最长湍流子数组 - 力扣&#xff08;LeetCode&#xff09; &#xff08;一&#xff09;题目详情 &#xff08;二&#xff09;算法讲解 &#xff08;三&#xff09;代码 二、力扣139139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; &#xff0…

计网学习笔记 wireless mobile networks

无线局域网的组成 无线网络在近些年来一直是个非常流行的东西。现在的移动用户数量已经大大超过了有线用户数量&#xff0c;比例大于5:1。 实现无线网络的挑战性 从有线到无线是网络构建上一个伟大的设想&#xff0c;挑战性主要集中在wireless和mobility两个点上。 这两个是…

Express 框架的基本操作

目录 1、应用生成器 2、基本路由 2.1、在跟路由下配置 GET请求&#xff0c;返回对应相应内容。 2.2、在跟路由下配置 POST请求&#xff0c;返回对应相应内容。 2.3、在跟路由下配置 PUT请求&#xff0c;返回对应相应内容。 2.4、在根路由下配置DELETE请求&#xff0c;返回对…

【剑指offer】学习计划day4

目录 一. 前言 二.数组中重复的数字 a.题目 b.题解分析 c.AC代码 三.在排序数组中查找数字 I a.题目 b.题解分析 c.AC代码 四.0&#xff5e;n-1中缺失的数字 a.题目 b.题解分析 c.AC代码 一. 前言 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下…

学习系统编程No.32【线程互斥实战】

引言&#xff1a; 北京时间&#xff1a;2023/7/19/15:22&#xff0c;昨天更新完博客&#xff0c;和舍友下了一会棋&#xff0c;快乐就是这么简单&#xff0c;哈哈哈&#xff01;总体来说&#xff0c;摆烂程度得到一定的改善&#xff0c;想要达到以前的水准&#xff0c;需要一定…

分布式 - 消息队列Kafka:Kafka分区常见问题总结

文章目录 01. Kafka 的分区是什么&#xff1f;02. Kafka 为什么需要分区&#xff1f;03. Kafka 分区有什么作用&#xff1f;03. Kafka 为什么使用分区的概念而不是直接使用多个主题呢&#xff1f;04. Kafka 分区的数量有什么限制&#xff1f;05. Kafka 分区的副本有什么作用&am…

[内网渗透]XXE-vulnhub

文章目录 [内网渗透]XXE-vulnhub环境安装信息收集解题步骤总结 [内网渗透]XXE-vulnhub 环境安装 首先在 vulnhub 下载文件&#xff1a; 将其解压为ovf格式&#xff1a; 使用vmware打开&#xff0c;新建一个虚拟机&#xff0c;然后开机&#xff0c;环境就搭好了 信息收集 由于…