当前位置: 首页 > news >正文

【图像处理】使用 OpenCV 将您的照片变成卡通

图像到卡通

一、说明

        在当今世界,我们被图像和视频所包围。从社交媒体到广告,图像已成为一种强大的交流媒介。但是你有没有想过,如果你能把你的照片变成卡通会发生什么?想象一下,为您最喜欢的照片创建动画版本,或者将肖像转换为异想天开的插图。

        在本文中,我们将探讨如何使用 Python 中的 OpenCV 库将图像转换为卡通。OpenCV 是一个功能强大的计算机视觉库,为图像和视频处理提供了广泛的功能,包括边缘检测、颜色转换和过滤。我们将使用这些工具在给定的图像上创建卡通效果。

        为此,我们将首先导入必要的模块并加载输入图像。接下来,我们将对图像应用一系列转换,包括边缘检测、颜色量化和双边滤波。最后,我们将结合这些转换,在输入图像上创建卡通效果。在整篇文章中,我们将提供有关如何使用 OpenCV 实现每个转换的分步说明。在本文结束时,您将清楚地了解如何使用 OpenCV 在任何输入图像上创建卡通效果。因此,让我们深入了解如何使用OpenCV将图像转换为卡通!

二、导入必要的库 

import cv2
import numpy as np
import os

2.1 代码说明:

  • import cv2导入 OpenCV 库,该库为图像和视频处理提供了广泛的功能。
  • import numpy as np导入 NumPy 库,这是一个流行的库,用于在 Python 中处理数组和矩阵。
  • import os导入操作系统模块,该模块提供了一种与文件系统交互的方法。

总的来说,这段代码导入了在 Python 中使用 OpenCV 执行图像处理的必要模块。

2.2 在 Python 中使用 OpenCV 显示输入图像:

img = cv2.imread('original_picture.jpg')
cv2.imshow("original", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

原始图片

2.3 代码说明:

  • cv2.imread('original_picture.jpg')将名为“original_picture.jpg”的输入图像加载到名为 的变量中。这是您想要的图片的名称。img
  • cv2.imshow("original", img) 在标题为“原始”的窗口中显示输入图像。
  • cv2.waitKey(0)等待按键。参数 0 表示程序将无限期等待,直到按下某个键。
  • cv2.destroyAllWindows() 关闭所有打开的窗口。

三、使用 K 均值聚类进行颜色量化:

def color_quantization(img, k):
# Transform the imagedata = np.float32(img).reshape((-1, 3))# Determine criteriacriteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)# Implementing K-Meansret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)center = np.uint8(center)result = center[label.flatten()]result = result.reshape(img.shape)return result

3.1 功能说明:

  • 该函数采用两个参数 — 输入图像和聚类数。imgk
  • 输入图像首先使用 NumPy 库转换为像素值的二维数组。
  • 为 K-Means 聚类分析算法确定一组条件,包括聚类中心的最大迭代次数和最小变化。
  • K 均值聚类分析算法使用 cv2.kmeans() 函数应用于数据,具有指定数量的聚类和条件。如果变量发生变化,该函数将生成具有不同数量颜色簇的新量化图像。较小的值 将导致具有较少颜色的量化图像,而较大的值 将导致具有更多颜色的量化图像。kkk
  • 生成的聚类中心使用 NumPy 函数转换为 8 位整数。np.uint8()
  • 原始图像被展平为像素值的一维数组,每个像素被分配到其最近的聚类中心。
  • 然后将生成的像素值数组重新塑造回原始输入图像的形状。
  • 生成的量化图像作为函数的输出返回。

3.2 创建边缘遮罩:

def edge_mask(img, line_size, blur_value):gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)gray_blur = cv2.medianBlur(gray, blur_value)edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size, blur_value)return edges

3.3 功能说明:

  • 该函数有三个参数——输入图像、蒙版中线条的大小和应用于灰度图像的模糊程度。如果变量发生变化,掩码中线条的大小也会相应更改。较小的值将导致更细的线条,而较大的值将导致较粗的线条。imgline_sizeblur_valueline_size
  • 首先使用该函数将输入图像转换为灰度。cv2.cvtColor()
  • 然后使用具有指定 .如果变量发生变化,应用于灰度图像的模糊级别将发生变化。较小的值将导致较少的模糊,而较大的值将导致更多的模糊。cv2.medianBlur()blur_valueblur_value
  • 通过使用该功能对模糊的灰度图像应用自适应阈值来创建边缘遮罩。这种自适应阈值方法根据每个像素周围局部邻域中像素值的平均值计算每个像素的阈值。cv2.adaptiveThreshold()
  • 生成的边缘掩码作为函数的输出返回。

四、从图像生成铅笔素描:

line_size = 7
blur_value = 7edges = edge_mask(img, line_size, blur_value)
cv2.imwrite('pencil_sketch.jpg', edges)
cv2.imshow('pencil sketch', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

铅笔素描

4.1 代码说明:

  • 代码首先将 和 的值设置为 7。如果 和 的值发生变化,则生成的铅笔素描将受到影响。较小的 值将导致线条越细,而较大的值将导致线条变粗。同样,较小的 值将导致较少的模糊,而较大的值将导致更多的模糊,这可能会影响铅笔草图的整体外观。line_sizeblur_valueline_sizeblur_valueline_sizeblur_value
  • 使用具有指定和 的函数从输入图像生成边缘掩码。imgedge_mask()line_sizeblur_value
  • 生成的边缘遮罩使用该函数保存为名为“pencil_sketch.jpg”的新图像文件。cv2.imwrite()
  • 然后使用该函数显示铅笔素描图像。cv2.imshow()
  • 程序等待使用该函数的用户按键。cv2.waitKey(0)
  • 最后,使用该功能关闭所有打开的窗口。cv2.destroyAllWindows()

4.2 从图像生成卡通:

total_color = 9
img = color_quantization(img, total_color)
cv2.imwrite('cartoonize.jpg', img)
cv2.imshow('Cartoonize', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

卡通化图片

4.3 代码说明:

  • 代码首先将值设置为 9。如果值发生变化,则生成的卡通图像将受到影响。较小的 值将导致较少的颜色,而较大的值将导致更多的颜色,这可能会影响卡通图像的整体外观。total_colortotal_colortotal_color
  • 调用该函数以将输入图像中的颜色数减少到指定的 。color_quantization()imgtotal_color
  • 生成的图像被保存为一个名为“cartoonize.jpg”的新图像文件使用该功能。cv2.imwrite()
  • 然后使用该功能显示卡通图像。cv2.imshow()
  • 程序等待使用该函数的用户按键。cv2.waitKey(0)
  • 最后,使用该功能关闭所有打开的窗口。cv2.destroyAllWindows()

五、对图像应用双边滤镜:

bilateral = cv2.bilateralFilter(img, 15, 75, 75)
# Save the output.
cv2.imwrite('blur.jpg', bilateral)
img = cv2.imread('blur.jpg')
cv2.imshow("Blur", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

双边滤波

5.1 代码说明:

  • 代码首先使用该函数将双边筛选器应用于输入图像。筛选器大小设置为 15,西格玛颜色和西格玛空间的值均设置为 75。imgcv2.bilateralFilter()
  • 更改双边滤镜的内核大小、西格玛颜色和西格玛空间的值将影响应用于图像的模糊级别。较小的内核大小和 sigma 值将导致较少的模糊,而较大的值将导致更多的模糊。更改这些值可能会更改生成的模糊图像的整体外观。
  • 生成的模糊图像被保存为一个名为“blur.jpg”的新图像文件,使用该功能。cv2.imwrite()
  • 然后使用该函数将模糊的图像加载回内存并分配给变量。cv2.imread()img

5.2 总输出:

5.3 另一种方式:

import cv2
import numpy as np# Load the input image
img = cv2.imread('input_image.jpg')# Apply bilateral filter to smooth the image
img_smooth = cv2.bilateralFilter(img, 9, 75, 75)# Convert the image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Apply edge detection to the grayscale image
edges = cv2.Canny(gray, 100, 200)# Apply color quantization to the smoothed image
img_quant = cv2.cvtColor(img_smooth, cv2.COLOR_BGR2RGB)
Z = img_quant.reshape((-1,3))
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img_quant.shape))# Combine the edges and color quantization to create the cartoon effect
cartoon = cv2.bitwise_and(res2, res2, mask=edges)# Display the output image and save it
cv2.imshow('Cartoon', cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()

        总之,使用 OpenCV 将图像转换为卡通是一种有趣且创造性的方式,可以为您的照片赋予新的生命。在本文中,我们讨论了如何使用 OpenCV 通过应用各种图像处理技术(如颜色量化、边缘检测和双边过滤)将图像转换为卡通。通过结合这些技术,我们能够从普通照片中制作出风格化的卡通图像。

        虽然本文中提供的代码是一个很好的起点,但有很多方法可以自定义转换过程以获得不同的结果。尝试不同的参数值或应用其他图像处理技术有助于创建独特且个性化的卡通风格图像。有了一点创造力和一些图像处理技术的知识,可能性是无穷无尽的。

相关文章:

【图像处理】使用 OpenCV 将您的照片变成卡通

图像到卡通 一、说明 在当今世界,我们被图像和视频所包围。从社交媒体到广告,图像已成为一种强大的交流媒介。但是你有没有想过,如果你能把你的照片变成卡通会发生什么?想象一下,为您最喜欢的照片创建动画版本&#xf…...

暖手宝UL认证 亚马逊UL测试报告 UL499测试项目

UL499测试内容:1、 漏电流测试 2、 输入测试 3、 潮态下漏电流测试4、正常温升测试 5、 耐高压测试 6、 稳定性测试7、异常测试(DRY)8、 异常测试  9、 静压及强度测试10、 烧熔断器测试、 电源线拉力测试11、 电源线推力测试12、 塑件变…...

ES6模块化与异步编程高级用法

1. ES6模块化 1.1 回顾:node.js 中如何实现模块化 node.js 遵循了 CommonJS 的模块化规范。其中: 导入其它模块使用 require() 方法模块对外共享成员使用 module.exports 对象 模块化的好处: 大家都遵守同样的模块化规范写代码&#xff0…...

spring-cloud-starter-gateway 4.0.6负载均衡失败

spring:application:name: gatewaycloud:gateway:routes:- id: memberuri: lb://memberpredicates:- Path/member/**需要引入下面负载均衡依赖否则503找不到服务 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-s…...

Tomcat注册为Windows服务

要将Tomcat注册为Windows服务&#xff0c;可以使用Tomcat提供的实用工具service.bat。以下是注册和配置Tomcat作为Windows服务的步骤&#xff1a; 打开命令提示符&#xff08;Command Prompt&#xff09;或 PowerShell&#xff0c;然后进入Tomcat安装目录的"bin"文件…...

【Maven】Maven 中 pom.xml 文件

文章目录 前言什么是 pom&#xff1f;pom配置一览 1. dependencies2.scope3.properties4.plugin参考 前言 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建和管理依赖。 本文&#xff0c;我们认识下 pom.xml 文件。POM(Project Object Model&#xff0c; 项目…...

2、Linux驱动开发:模块_引用符号

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…...

Python web实战 | Docker+Nginx部署python Django Web项目详细步骤【干货】

概要 在这篇文章中&#xff0c;我将介绍如何使用 Docker 和 Nginx 部署 Django Web 项目。一步步讲解如何构建 Docker 镜像、如何编写 Docker Compose 文件和如何配置 Nginx。 1. Docker 构建 Django Web 项目 1.1 配置 Django 项目 在开始之前&#xff0c;我们需要有一个 D…...

【uniapp】实现买定离手小游戏

前言 最近玩了一个小游戏&#xff0c;感觉挺有意思&#xff0c;打算放进我的小程序【自动化小助手】里面&#xff0c;“三张押一张&#xff0c;专押花姑娘&#xff01;”&#xff0c;从三张卡牌&#xff0c;挑选一张&#xff0c;中奖后将奖励进行发放&#xff0c;并且创建下一…...

【vim 学习系列文章 3 - vim 选中、删除、复制、修改引号或括号内的内容】

文章目录 vim 快捷命令vim 操作符vim 文本对象vim 动作 上篇文章: vim 学习系列文章 2 - vim 常用插件配置 vim 快捷命令 Vim 有一个模块化的结构&#xff0c;允许你使用各种命令的组合操作。大多数命令有两个、三个或四个部分。三部分结构的一个版本是这样的&#xff1a;操作…...

webpack联邦模块介绍及在dumi中使用问题整理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ModuleFederationPlugin参数含义&#xff1f;二、如何在dumi中使用及问题整理1. 如何在dumi中使用(这个配置是好使的)2.相关问题整理2.1 问题12.2 问题2 总…...

记录一下Kotlin: Module was compiled with an incompatible version of Kotlin.的问题

我遇到的整个报错是这样的&#xff1a; Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.1.16. 大概意思就是不匹配&#xff0c;但是我这是个不太能随便改代码的项目&#x…...

html中使用Vue+element UI动态创建表单数据不显示问题

直接上代码&#xff1a;html代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&…...

CentOS下 Docker、Docker Compose 的安装教程

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 Docker Compose是用于定义…...

[OnWork.Tools]系列 02-安装

下载地址 百度网盘 历史版本连接各种版本都有,请下载版本号最高的版本 链接&#xff1a;https://pan.baidu.com/s/1aOT0oUhiRO_L8sBCGomXdQ?pwdn159提取码&#xff1a;n159 个人链接 http://on8.top:5000/share.cgi?ssiddb2012fa6b224cd1b7f87ff5f5214910 软件安装 双…...

【外键合并python】

外键合并&#xff08;Foreign Key Merge&#xff09; 外键合并是指在数据库或者数据表中&#xff0c;通过共同的外键将多个数据表合并在一起的操作。在 Excel 表格中&#xff0c;我们可以使用外键来将多个表格合并&#xff0c;类似于数据库中的关联操作。 步骤一&#xff1a;…...

Mongodb SQL 到聚合映射快速参考

SQL 映射 聚合管道允许MongoDB 提供原生聚合功能&#xff0c;对应于 SQL 中许多常见的数据聚合操作。比如&#xff1a;GROUP BY、COUNT()、UNION ALL 测试数据 For MySQL rootlocalhost 14:40:40 [test]> select * from orders; -------------------------------------…...

腾讯云标准型S6/SA3/SR1/S5/SA2服务器CPU处理器大全

腾讯云服务器CVM标准型CPU处理器大全&#xff0c;包括标准型S6、SA3、SR1、S5、S5se、SA2、S4、SN3ne、S3、SA1、S2ne实例CPU处理器型号大全&#xff0c;标准型S6云服务器CPU采用Intel Ice Lake(2.7GHz/3.3GHz)&#xff0c;标准型S5采用Intel Xeon Cascade Lake 8255C/Intel Xe…...

idea 关于高亮显示与选中字符串相同的内容

dea 关于高亮显示与选中字符串相同的内容&#xff0c;本文作为个人备忘的同时也希望可以作为大家的参考。 依次修改File-settings-Editor-Color Scheme-General菜单下的Code-Identifier under caret和Identifier under caret(write)的Backgroud色值&#xff0c;可以参考下图。…...

【重点:单例模式】特殊类设计

请设计一个类&#xff0c;只能在堆上创建对象 方式如下&#xff1a; 将构造函数设置为私有&#xff0c;防止外部直接调用构造函数在栈上创建对象。向外部提供一个获取对象的static接口&#xff0c;该接口在堆上创建一个对象并返回。将拷贝构造函数设置为私有&#xff0c;并且…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...