如何用Python将你的照片变成漫画

603 阅读6分钟

如何用Python将你的照片变成漫画

使用卡通人物已经成为全世界年轻人中的一个流行趋势。这可以从他们在在线社交平台上的个人资料照片到流行的备忘录中看出来。

这些卡通人物的使用不仅限于社交平台,还包括其他各个领域。

简介

例如,你可以在学校杂志或漫画中加入真实人物的卡通形象,以逗乐读者。

在这个科技时代,卡通不需要手动绘制。我们有一些应用程序,可以轻松地将你的图像转换成卡通。

然而,你只限于应用程序内预先设定的自定义选项。那么,好消息是,你可以用几行代码在图像上创造你想要的效果。

在这篇文章中,我将向你展示如何使用Python将任何照片转换为卡通图像。我们利用优化的机器学习算法,产生清晰锐利的图像。

OpenCV和Numpy库在这个操作中很方便。你可以使用这个概念来建立一个专门用于将任何图片转换为卡通图片的应用程序。其结果是相当令人印象深刻的。

真实图像和卡通图像之间存在一些微妙的差异。通过考虑下面的图片,可以确定这些差异。

cartoon image

real image

其中一个很大的区别是,真实图像有厚实和清晰的边缘。另一个可观察到的区别是,与真实图像相比,卡通图像的明显色彩较少。

因此,我们的目标是赋予真实图像以这些特征。

我们将把这个过程分为四个部分,即。

  • [1.加载图像]
  • [2.创建一个边缘掩码]
  • [3.减少不同颜色的数量]
  • [4.将边缘遮罩与减色后的图像相结合]

前提条件

要跟上本教程,必须满足以下最低要求。

  • 有中级水平的Python编程知识。
  • 一个Google colab笔记本。

我们将使用Google colab笔记本,因为它有各种优势,比如。

  • 不需要配置。为数据科学配置你的计算机有时会很复杂,特别是对新手来说。
  • 免费使用图形处理单元(GPU)。
  • 易于分享。你可以很容易地与同事或专家分享你的工作,征求意见。

你所需要的只是一个浏览器和一个良好的网络连接。

对于喜欢修补和解决核心问题的挑战爱好者来说,你可以将你的电脑设置为这种练习。

第一部分:加载图像

我们将利用NumPy库和OpenCV库。NumPy是Numerical Python的简称,OpenCV是Open Source Computer Vision的简称。

在运行任何代码之前,请确保导入这些库。

我们以如下方式导入它们。

import numpy as np
import cv2 #This is how we import the OpenCV library

#include the following since we are running on Google Colab
from google.colab.patches import cv2_imshow #This will help in displaying the image as we continue to modify it
from google.colab import files #This will help us to select any image from our local files for editing

我们希望能够加载任何我们喜欢的图像,并能够将其 "卡通化"。

让我们创建一个加载图像的函数。

def readFile(file_name)
    image=cv2.imread(file_name)
    cv2_imshow(image)
    return image

现在调用该函数来加载图片。

uploaded=files.upload()
file_name=next(iter(uploaded))
img=readFile(file_name)

upload()方法渲染了一个小部件,提示用户将本地文件上传到内核中。它返回一个地图

我选择了下面这张图片,把它变成一个卡通。

real-image

第二部分:创建一个边缘遮罩

我们用边缘遮罩来强调图像边缘的厚度。图像中的边缘可以通过OpenCV库中一个非常重要的方法来检测,这个方法叫做adaptiveThreshold()。

让我们来定义一下边缘屏蔽函数。

def edgeMask(image,lineSize,blurValue)
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    grayBlur=cv2.medianBlur(gray,blurValue)
    edges=cv2.adaptiveThreshold(grayBlur,255,cv2.ADAPTIVE_THRESH_MEAN_C,CV2.THRESH_BINARY,lineSize,blurValue)
    return edges

在上面的函数中,我们使用cvtColor() 函数将图像从RGB模式转换成灰度模式。简单地说,灰度模式是一种黑白模式。

如果我们将图像转换为灰度后显示,我们会发现有很多噪音。为了减少模糊的灰度图像内的噪音,使用cv2.medianBlur() 函数。

我们可以玩玩blurValue ,将观察到的噪声改变到一个可接受的点。为了访问边缘,我们使用cv2.adaptiveThreshold ,该方法有几个参数传递给它。

现在让我们调用定义的函数。

lineSize=7
blurValue=7
edges=edgeMask(image,lineSize,blurValue)
cv2_imshow(edges)

结果应该如下图所示。

image with edges

第三部分:减少不同颜色的数量

正如我在本文开始时指出的,卡通和真实图像之间的一个主要区别是其中不同颜色的数量。与真实图像相比,卡通中的不同颜色较少。为了减少图像中的颜色数量,我们采用了颜色量化技术。

在这里,我们要学会欣赏机器学习算法,使我们的工作更容易。我们使用OpenCV库中固有的k-means 聚类算法。

让我们定义一个颜色量化函数,如下图所示。

def colorQuantization(image,k)
    data=np.float32(image).reshape((-1,3))
    criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,20,0.001)
    ret,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 ,用于确定我们希望图像中的不同颜色的数量。

现在我们来调用这个函数。

colors=9
image=colorQuantization(image,colors)

得到的图像如下图所示。

quantized image

正如我们所看到的,该图像是相当清晰和嘈杂的。我们利用cv2 库中的bilateralFilter 来减少噪音。该过滤器还为图像提供了模糊和锐度降低的效果。

我们使用这几行代码来实现这一目的。

blurImage=cv2.bilateralFilter(image,d=7,sigmaColor=200,sigmaSpace=200)
  • d 参数是每个像素邻域的直径。
  • sigmaColor 参数表示半等色的区域。
  • sigmaSpace 参数表示只要像素的颜色足够接近,就能进一步影响彼此。

第四部分:将边缘掩码与减色图像结合起来

最后,我们需要将我们的 "色彩量化图像 "与edge mask ,得到完整的卡通图像。

为了实现这一点,我们使用cv2.bitwise_and() 方法。

这在下面的代码中有所说明。

cartoonImage=cv2.bitwise_and(blurImage,blurImage,mask=edges)

最终的图像应该如下图所示。

cartoon-image

结论

在Python库的帮助下,我们能够将一张真实的图像转换成卡通。我们还体会到了机器学习模型的重要性,它使我们的工作变得更加容易。

你可以通过玩弄代码来创造你想要的效果。此外,你还可以利用OpenCV库中的大量函数来创造更多美妙的效果。