图像处理:使用 OpenCV-Python 卡通化你的图像(2)

在这里插入图片描述

一、说明

在图像处理领域,将图像卡通化是一种新趋势。人们使用不同的应用程序将他们的图像转换为卡通图像。如今,玩弄图像是许多人的爱好。人们通常会点击图片并添加滤镜或使用不同的东西自定义图像并将其发布到社交媒体上。但我们是程序员,我们做的不是普通人做的事。我们对将简单的 RGB 图像转换为卡通图像的过程更感兴趣。在这个图像处理部分中,我们将使用 OpenCV-Python 将图像卡通化。

二、图像到卡通的转换

好吧,将图像转换为卡通更多的是关于图像边缘的检测。如果你能很好地检测图像的边缘,那么卡通效果将对该图像更加有效。有许多算法可用于此,因此有多种方法可以做到这一点。我们将使用 OpenCV-Python 中的 BilateralFilter() 函数。

我通常在 Google Colab 中编写和运行代码。您可以在此处访问 Google Colab 中的完整代码。在这个项目中,我们将经历以下主要步骤:

导入所需的库
加载图像
初始化要使用的参数
使用高斯金字塔的下采样来减小图像尺寸
迭代应用双边滤波器
使用上采样将图像放大到原始大小
使用中值滤波器模糊图像
检测并增强边缘
将灰度边缘图像转换回 RGB 彩色图像
显示图像
我们必须完成这九个步骤才能获得所需的输出。那么,让我们开始吧。

三、代码实现

步骤1:库导入

import cv2
import numpy as np
import matplotlib.pylab as plt
from google.colab.patches import cv2_imshow
from google.colab import files

第2步:图像读入

def read_file(filename):image = cv2.imread(filename)cv2_imshow(image)return image
uploaded = files.upload()
filename = next(iter(uploaded))
image = read_file(filename)

如果您正在使用 Google Colab,那么您可以写下上述代码。但如果您使用的是Jupyter 笔记本,那么只需添加要使用的图像的路径即可。两者是同一件事。

步骤3:双边滤波

num_down = 2 
num_bilateral = 7 
w, h, _ = image.shape

初始化我们将要使用的参数。num_down 表示下采样步骤的数量。num_bilateral 表示双边滤波步骤的数量。

步骤4:金字塔处理

img_color = np.copy(image) 
for _ in range(num_down): img_color = cv2.pyrDown(img_color)

这里我们缩小了图片的尺寸。为了缩小尺寸,我们使用了高斯金字塔的下采样操作。我们缩小图片的尺寸是为了使后续操作更快。

步骤5:双边

for _ in range(num_bilateral):
img_color = cv2.bilateralFilter(img_color, d=9, sigmaColor=0.1, sigmaSpace=0.01)

这里sigmaColor表示颜色中的滤波器 sigma,sigmaSpace表示坐标空间。我们在这里迭代地应用具有较小直径值的双边滤波器。参数d表示每个像素邻域的直径。

步骤6:

for _ in range(num_down):img_color = cv2.pyrUp(img_color)

为了将图像放大到原始尺寸,我们在这里使用上采样。

步骤7:

img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
img_blur = cv2.medianBlur(img_gray, 7)

我们将步骤 6 中的输出图像转换为灰度,并使用称为中值过滤器对图像进行模糊处理。

步骤8:

img_edge = cv2.adaptiveThreshold((255*img_blur).astype(np.uint8),\
255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,\
blockSize=9,C=2)
正如我们上面所讨论的,对图像进行卡通化更多的是检测图像的边缘。因此,在这一步中,我们将检测和增强所用图像的边缘。

步骤9:

img_edge = cv2.cvtColor(img_edge,cv2.COLOR_GRAY2RGB) 
img_cartoon = cv2.bitwise_and(img_color,img_edge)

将灰度图像转换回 RGB 图像,并与 RGB 图像进行按位与运算以获得最终输出的卡通图像。

步骤10:

fig = plt.figure(figsize=(20,10)) 
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05) 
plt.subplot(121) 
plt.imshow(image) 
plt.axis('off') 
plt.title('原始图像​​', size=20) 
plt.subplot(122) 
plt.imshow(img_cartoon) 
plt.axis('off') 
plt.title('卡通化图像', size=20)
plt.显示()

最后,显示输出。
在这里插入图片描述

四、卡通图像代码背后的逻辑

在项目中,首先,我们必须去除图像的弱边缘,然后将图像转换为平面纹理,最后增强图像的突出边缘。为此,我们使用了 OpenCV-Python 中的bilateralFilter()、medianBlur()、adaptiveThreshold() 和 bitwise_and() 函数。

为了保持边缘清晰、纹理光滑,我们使用了 OpenCV-Python 中的 BilateralFilter() 函数。更改 sigmaColor 和 sigmaSpace 的值,并查看图像输出的变化。

此外,对图像进行下采样以创建图像金字塔。接下来,我们使用双边滤波器去除不重要的细节,然后使用后续的上采样将图像调整为原始大小。最后,为了使纹理平坦化,应用了中值模糊,然后用自适应阈值获得的二值图像掩盖原始图像,成功执行上述代码后,您将看到输出图像。我尝试使用小罗伯特·唐尼的图像,得到了这个输出图像。

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

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

相关文章

godis源码分析——Redis协议解析器

前言 redis这个目录下的所有代码就是为了一个事情,就是适配redis。 流程 redis下的基本流程 源码 在redis/client/client.go 主要是客户端处理 package clientconst (created iotarunningclosed )type B struct {data chan stringticker *time.Ticker }// …

Docker安装RabbitMQ(带web管理端)

1.拉取带web管理的镜像 可以拉取rabbitmq对应版本的web管理端,比如:rabbitmq:3.9.11-management,也可以直接拉取带web管理端的最新版本 rabbitmq:management. docker pull rabbitmq:3.9.11-management 注意:如果docker pull ra…

jenkins系列-06.harbor

https://github.com/goharbor/harbor/releases?page2 https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz harbor官网:https://goharbor.io/ 点击 Download now 链接,会自动跳转到上述github页面&am…

C++ | Leetcode C++题解之第233题数字1的个数

题目: 题解: class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中,可以发现 k 并没有被直接使用到(都是使用 10^k)// 但为了让代码看起来更加直观,这里保留了 klong l…

Redis系列命令更新--Redis哈希命令

一、设置密码验证: 使用文本编辑器,这里使用Notepad,打开Redis服务配置文件。 注意:不要找错了,通常为redis.windows-service.conf,而不是redis.windows.conf。后者是以非系统服务方式启动程序使用的配置…

《BASeg: Boundary aware semantic segmentation for autonomous driving》论文解读

期刊:Neural Networks | Journal | ScienceDirect.com by Elsevier 年份:2023 代码:https://github.com/Lature-Yang/BASeg 摘要 语义分割是自动驾驶领域街道理解任务的重要组成部分。现有的各种方法要么专注于通过聚合全局或多尺度上下文…

旷野之间20 - Google 研究的推测 RAG

为什么选择 RAG 新兴能力 直到最近,人们发现 LLM 具有新兴能力,即在与用户或任务交互过程中出现的意外功能。 这些功能的示例包括: 解决问题: LLM 可以利用其语言理解和推理能力,为未经过明确培训的任务提供富有洞…

python的字符串

字符串 简单操作 创建 利用 ‘ ’ 或 “ ” 将字符或数字包裹起来的都为字符串 a"你好" 格式化字符串 元组的字符格式化 字符串格式化函数 srt.format() f格式化 方法 split()//指定分割符经行分割 strip()//指定移除字符头尾的字符 join()//指定序列中的字符连接成新…

5、 测试

这里写目录标题 1、自动化测试简介(1)自动化测试是什么(2)为什么要写测试测试节约你的时间发现错误,预防错误测试使得代码更有吸引力 2、基础测试策略3、开始写第一个测试(1)首先得有个bug&…

Not Invented Here 不是在这里发明的 / Proudly found elsewhere 自豪地在其他地方找到

注: 机翻,未校对。 两篇关于创新管理的小文章 Not Invented Here 不是在这里发明的 In the history of organizational success, the enterprises that dominate tend to flawlessly execute on ideas that were created elsewhere. Examine just abo…

智慧水利解决方案:从理论到实践的全面跨越,展示其在水资源管理、水灾害预警、水生态保护等方面的创新应用

目录 一、引言:智慧水利的时代背景与意义 二、智慧水利的理论框架与技术体系 1、理论框架 2、技术体系 三、智慧水利在水资源管理中的应用 1、水资源优化配置 2、水量水质协同管理 四、智慧水利在水灾害预警中的应用 1、洪水预警与应急响应 2、干旱监测与评…

Mediapipe-姿态估计实例

Mediapipe简介 Mediapipe 是由 Google Research 开发的一款开源框架,旨在帮助开发者轻松地构建、测试和部署复杂的多模态、多任务的机器学习模型。它特别擅长于实时处理和分析音频、视频等多媒体数据。以下是 Mediapipe 的一些关键特点和组件: 关键特点…

基于微信小程序的音乐播放平台

基于微信小程序的音乐播放平台 音乐播放小程序项目简介技术栈功能模块项目流程系统E-R图项目页面 音乐播放小程序 项目简介 微信音乐小程序旨在提供一个简洁高效的音乐播放平台,用户可以方便地搜索、播放和收藏自己喜欢的音乐。整个项目采用前后端分离的架构&…

WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL

环境: Win10 专业版 DELL7080 问题描述: WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL 事件日志 解决方案: 1.找到MEMORY.DMP文件内容,分析一下 Microsoft (R) Windows Debugger Version 10…

主机安全-开源HIDS字节跳动Elkeid安装使用

目录 概述什么是HIDSHIDS与NIDS的区别EDR、XDR是啥? Elkeid架构Elkeid Agent && Agent centerElkeid DriverElkeid RASPElkeid HUBService DiscoveryManager安装数据采集规则&告警 参考 概述 什么是HIDS HIDS( host-based intrusion detec…

使用Gitee仓库镜像管理功能实现Gitee与Github 双向同步

进入你所需要同步的仓库,点击「管理」->「镜像仓库管理」,点击「添加镜像」选项; 如果你的Gitee账号还没有绑定过 GitHub 帐号,先根据弹窗的提示绑定 GitHub 帐号; 添加镜像时候,在「镜像方向」中选择…

二次开发源码 借贷系统uniapp/借贷认证系统/小额信贷系统/工薪贷APP/资金贷系统h5

前端:UNIAPP 后端:ThinkPHP 数据库: Mysql 前端使用的uniapp 可以打包APP H5 小程序 系统提供了完善的网络借贷体系,为金融中介平台提供从获客到贷后管理全流程服务,解决了借贷手续繁琐、流程缓慢等问题 此源码为运营…

管理Linux本地用户和组

什么是用户 用户账户在可以运行命令的不同人员和程序之间提供安全界限。 在Linux系统中,系统通过分配唯一的标识号(用户ID或UID)来区分不同的用户帐户。 在Linux系统中,用户帐户有以下三种主要类型: 超级用户 负责…

分布式一致性算法:Raft学习

分布式一致性算法:Raft学习 1 什么是分布式系统? 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。这些节点可能位于不同的物理位置,但它们协同工作以提供一个统一的计算平台或服务。分布式系统…

Unity中一键生成具有身体感知的虚拟人物动作

在虚拟现实(VR)和增强现实(AR)的浪潮中,如何让虚拟人物的动作更加自然、真实,已经成为一个重要课题。AI4Animation项目,一个由 Sebastian Starke 主导的开源框架,为Unity开发者提供了强大的工具集,以实现这一目标。本文…