图像处理:使用 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.rhkb.cn/news/378251.html

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

相关文章

用node.js写一个简单的图书管理界面——功能:添加,删除,修改数据

涉及到的模块: var fs require(‘fs’)——内置模块 var ejs require(‘ejs’)——第三方模块 var mysql require(‘mysql’)——第三方模块 var express require(‘express’)——第三方模块 var bodyParser require(‘body-parser’)——第三方中间件 需要…

【论文阅读】MCTformer+:弱监督语义分割的多类令牌转换器

【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器 文章目录 【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器一、介绍1.1 WSSS背景1.2 WSSS策略 二、联系工作2.1 弱监督语义分割2.2 transformers的可视化应用 三、MULTI-CLASS TOKEN TRANSFORMER3.1 Multi-class t…

自建Web网站部署——案例分析

作者主页: 知孤云出岫 目录 作者主页:如何自建一个Web网站一、引言二、需求分析三、技术选型四、开发步骤1. 项目初始化初始化前端初始化后端 2. 前端开发目录结构示例代码App.jsHome.js 3. 后端开发目录结构示例代码app.jsproductRoutes.jsProduct.js 4. 前后端连接安装axio…

硕博电子智能控制器、触摸显示屏在集装箱跨运车上的应用

港口跨运车,又称跨运车或轮胎式龙门吊(RTG),专门用于集装箱码头的装卸和搬运作业,能够迅速完成集装箱在码头前沿、堆场区域以及仓库之间的运输和堆垛,大幅度缩短了装卸周期,提高了港口物流周转效率。 现代跨运车往往配…

LabVIEW扬尘控制系统

设计了一套基于LabVIEW的扬尘控制系统,通过监测TsP(总悬浮颗粒物)浓度、风向和摄像头视频,实现对环境的综合监控和扬尘控制。系统可以自动判断扬尘位置,并驱动抑尘设备进行抑尘。硬件选用NI cDAQ-9178数据采集模块、Om…

Go语言---HTTP编程基础(简单版百度贴吧爬虫)

网络爬虫 网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人等,可以自动化浏览网络中的信息,当然浏览信息的时候需要按照我们制定的规则进行,这些规则我们称之为网络爬虫算法。使用Python可以很方便地编写出爬虫程序,进行互联网信息的…

深入理解PostgreSql域类型(Domain),灵活定义数据约束,让表结构设计更加严谨

在PostgreSQL中,域(Domain)是一种用户定义的数据类型,它基于系统内已存在的数据类型,并可以附加约束条件。使用域可以增强数据的完整性和一致性,因为它允许开发者对特定列设定更为具体的规则,比…

科技出海|百分点科技智慧政务解决方案亮相非洲展会

近日,华为非洲全联接大会在南非约翰内斯堡举办,吸引政府官员行业专家、思想领袖、生态伙伴等2,000多人参会,百分点科技作为华为云生态合作伙伴,重点展示了智慧政务解决方案,发表《Enable a Smarter Government with Da…

socket功能定义和一般模型

1. socket的功能定义 socket是为了使两个应用程序间进行数据交换而存在的一种技术,不仅可以使同一个主机上两个应用程序间可以交换数据,而且可以使网络上的不同主机间上的应用程序间进行通信。 2. 图解socket的服务端/客户端模型

简单一阶滤波器设计:matlab和C实现

一、简单一阶滤波器的模型 二、示例 得: y(n)-0.9y(n-1)=x(n)+0.05x(n-1),即:y(n)=0.9y(n-1)+x(n)+0.05x(n-1) 已知:,并且有: A. 假设输入序列有N=100个点 B. 系统初始状态为0,即y(-1)=0 C. 输入序列是因果序列,

IDEA快速生成项目树形结构图

下图用的IDEA工具,但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下,进入cmd输入如下指令: 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释

C++ 入门基础:开启编程之旅

文章目录 引言一、C的第⼀个程序二、命名空间1、namespace2、namespace的定义 三、C输入 与 输出四、缺省参数五、函数重载六、引用1、引用的概念和定义2、引用的特性3、指针和引用的关系七、inline八、nullptr 引言 C 是一种高效、灵活且功能强大的编程语言,广泛应…

为ppt中的文字配色

文字的颜色来源于ppt不可删去的图像的颜色 从各类搜索网站中搜索ppt如何配色,有如下几点: 1.可以使用对比色,表示强调。 2.可以使用近似色,使得和谐统一。 3.最好一张ppt中,使用的颜色不超过三种主要颜色。 但我想强调…

33.异步FIFO IP核的配置、调用与仿真

(1)异步FIFO的配置过程: ps:异步fifo相比较同步fifo少一个实际深度 (2)异步FIFO的调用: module dcfifo (input wr_clk ,input rd_clk ,input [7:0] …

泉盛UV-K5扩容2Mbit EEPROM

泉盛UV-K5扩容2Mbit EEPROM 步骤 分离前面板与背板。 拆下电池,底部有个空隙,从缝隙撬开背板。分离前面板时注意喇叭连接线,不要扯断了。 分离屏幕。 先从箭头位置向上挑起,屏幕稍微松动即可左右晃动,直至完全取出。注…

开发实战经验分享:互联网医院系统源码与在线问诊APP搭建

作为一名软件开发者,笔者有幸参与了多个互联网医院系统的开发项目,并在此过程中积累了丰富的实战经验。本文将结合我的开发经验,分享互联网医院系统源码的设计与在线问诊APP的搭建过程。 一、需求分析 在开发任何系统之前,首先要…

【数据结构】二叉树全攻略,从实现到应用详解

​ 💎所属专栏:数据结构与算法学习 💎 欢迎大家互三:2的n次方_ ​ 🍁1. 树形结构的介绍 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做…

详解曼达拉升级:如何用网络拓扑结构扩容BSV区块链

​​发表时间:2024年5月24日 BSV曼达拉升级是对BSV基础设施的战略性重塑,意在显著增强其性能,运行效率和可扩容。该概念于2018年提出,其战略落地将使BSV区块链顺利过渡,从现有的基于单一集成功能组件的网络拓扑结构&am…

GuLi商城-商品服务-API-品牌管理-JSR303分组校验

注解:@Validated 实体类: package com.nanjing.gulimall.product.entity;import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.nanjing.common.valid.ListValue; import com.nanjing.common.valid.Updat…

MySQL-事务、日志

事务 特性 原子性 是指事务开始后,必须成功执行完所有的操作才会结束,否则会回滚到事务刚开始前。 拿转账来说,一个成功的 A向B转账100元的过程 会涉及如下过程: A:从数据库读取A的余额;A的余额-100&am…