使用Python+OpenCV将照片变成卡通照片

news/2024/10/17 17:19:58/

正如你可能知道的,素描或创建一个卡通并不总是需要手动完成。如今,许多应用程序可以把你的照片变成卡通照片。但是如果我告诉你,你可以用几行代码创造属于自己的效果呢?

有一个名为OpenCV的库,它为计算机视觉应用程序提供了一个公共基础设施,并优化了机器学习算法。它可以用来识别物体,检测和产生高分辨率的图像。

本文,将向你展示如何利用OpenCV为Python中的图像提供卡通效果。使用google colab来编写和运行代码。你可以在这里访问Google Colab中的完整代码

  • https://colab.research.google.com/drive/1lV5oJ_hI8PsSV1WDVWWfL18-tMm4vnxe?usp=sharing

要创造卡通效果,我们需要注意两件事:边缘和调色板。这就是照片和卡通的区别所在。为了调整这两个主要部分,我们将经历四个主要步骤:

  1. 加载图像

  2. 创建边缘蒙版

  3. 减少调色板

  4. 结合边缘蒙版和彩色图像

在开始主要步骤之前,不要忘记导入notebook中所需的库,尤其是cv2和NumPy。

import cv2
import numpy as np
# required if you use Google Colab
from google.colab.patches import cv2_imshow
from google.colab import files

1. 加载图像

第一个主要步骤是加载图像。定义read_file函数,其中包括cv2_imshow以在Google Colab中加载所选图像。

def read_file(filename):img = cv2.imread(filename)cv2_imshow(img)return img

调用创建的函数来加载图像。

uploaded = files.upload()
filename = next(iter(uploaded))
img = read_file(filename)

我选择了下面的图片来转化成卡通图片。

2. 创建边缘蒙版

通常,卡通效果强调图像中边缘的厚度。我们可以使用 cv2.adaptiveThreshold() 函数检测图像中的边缘。

总之,我们可以将 egde_mask函数定义为:

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

在该函数中,我们将图像转换为灰度图像。然后,利用cv2.medianBlur对模糊灰度图像进行去噪处理。

模糊值越大,图像中出现的黑色噪声就越少。然后,应用自适应阈值函数,定义边缘的线条尺寸。较大的线条尺寸意味着图像中强调的较厚边缘。

定义函数后,调用它并查看结果。

line_size = 7
blur_value = 7
edges = edge_mask(img, line_size, blur_value)
cv2_imshow(edges)

3. 减少调色板

照片和图画之间的主要区别——就颜色而言——是每一张照片中不同颜色的数量。

图画的颜色比照片的颜色少。因此,我们使用颜色量化来减少照片中的颜色数目。

色彩量化

为了进行颜色量化,我们采用OpenCV库提供的K-Means聚类算法。

为了在接下来的步骤中更容易实现,我们可以如下定义color_quantization 函数。

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

我们可以调整k值来确定要应用于图像的颜色数。

total_color = 9
img = color_quantization(img, total_color)

在本例中,我使用9作为图像的k值。结果如下所示。

双边滤波器

在进行颜色量化之后,我们可以使用双边滤波器来降低图像中的噪声。它会给图像带来一点模糊和锐度降低的效果。

blurred = cv2.bilateralFilter(img, d=7, 
sigmaColor=200,sigmaSpace=200)

有三个参数可根据你的首选项进行调整:

  • d:每个像素邻域的直径

  • sigmaColor:参数值越大,表示半等色区域越大。

  • sigmaSpace:参数的值越大,意味着更远的像素将相互影响,只要它们的颜色足够接近。

4. 结合边缘蒙版和彩色图像

最后一步是将我们之前创建的边缘蒙版与彩色处理图像相结合。为此,请使用cv2.bitwise_and函数。

cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)

我们可以在下面看到原始照片的“卡通版”。

现在你可以开始来创建你自己的卡通效果。除了在我们上面使用的参数中调整值之外,你还可以从OpenCV添加另一个函数来为你的照片提供特殊效果。代码库里还有很多东西我们可以探索。很高兴尝试!

参考文献

  1. https://www.programcreek.com/python/example/89394/cv2.kmeans

  2. http://datahacker.rs/002-opencv-projects-how-to-cartoonize-an-image-with-opencv-in-python/

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓


http://www.ppmy.cn/news/465095.html

相关文章

php 照片变成卡通照片,怎么把照片做成q版卡通 照片变q版卡通人物 q版卡通头像制作...

想要把自己的头像变成真人q版卡通漫画,偷偷问了一个漫画家怎么制作的,他说用电脑手绘,得有画画基础才行,小编这下子就打了退堂鼓了,照片制作视频容易,但是自己画画太难了。有什么比较容易方法把照片做成q版…

Pixel2Pixel:卡通照片真人化

Pixel2Pixel:卡通照片真人化 项目链接:Pixel2Pixel:卡通照片真人化 前言: 之前PaddleGAN的趣味应用如雨后春笋般地出现,非常多的项目都是xxx动漫化。当时就有一个很普通的想法为什么大家都会去搞动漫化,这…

ChatGPT或致全球3亿人失业,人工智能时代下教育会发生什么样的变革?

不久前,谷歌教育发布了一份关于未来教育的研究报告。该报告由谷歌公司和 Canvas8合作,对来自世界24个国家的94位教育专家进行了历时长达2年的调研,探讨了未来教育形态、教育在未来的作用、教育公平、全球人才需求、教学方式、学习生态、工作技…

【STM32】软件I2C

【STM32】软件I2C I2C简介 I2C总线是一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信。I2C总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步。 在一个i2c通讯总线中,可连接…

SQL Server处于恢复已挂起状态的解决方法

win r 输入 services.msc,进入服务!找到SQL Server(MSSQLSERVER)点击重启

虚拟机状态显示“已关机”,但是提示“该虚拟机似乎正在使用中”

问题:想要删除虚拟机时,虚拟机状态显示“已关机”,但是提示“该虚拟机似乎正在使用中” 解决:删除虚拟机安装目录下的.lck文件夹 原因:据说是因为电脑关机或重启前没有关闭虚拟机(出现问题之前的确是这样的…

SqlServer处于恢复挂起状态

一. 出现问题: 二. 总结: 如果数据库处于一个恢复挂起的状态,并且对数据库做脱机和分离的操作,报出数据库文件不可访问的错误,可能是因为数据库的数据文件和日志文件在数据库正常连接的情况下,文件所在的磁…

取消Windows 2003登录及关机提示

很多使用过Windows 2003操作系统,常常会在登录和关机比较麻烦,比如登录时要按CtrlAltDelete这三个键才能出现登录面板,接着还要输入用户名及密码才能登录。关机时会出现一个关机原因提示框,需要输入原因才能正常关机。Windows 200…