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

3天前

正如你可能知道的,素描或创建一个卡通并不总是需要手动完成。如今,许多应用程序可以把你的照片变成卡通照片。但是如果我告诉你,你可以用几行代码创造属于自己的效果呢?
有一个名为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 image
  data = np.float32(img).reshape((-1, 3))

# Determine criteria
  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)

# Implementing K-Means
  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值来确定要应用于图像的颜色数。
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/
正如你可能知道的,素描或创建一个卡通并不总是需要手动完成。如今,许多应用程序可以把你的照片变成卡通照片。但是如果我告诉你,你可以用几行代码创造属于自己的效果呢?有一个名为OpenCV的库,它为计算机视觉应用程序提供了一个公共基础设施,并优化了机器学习算法。它可以用来识别物体,检测和产生高分辨率的图像。本文,将向你展示如何利用OpenCV为Python中的图像提供卡通效果。使用google colab来编写和运行代码。你可以在这里访问Google Colab中的完整代码https://colab.research.google.com/drive/1lV5oJ_hI8PsSV1WDVWWfL18-tMm4vnxe?usp=sharing要创造卡通效果,我们需要注意两件事:边缘和调色板。这就是照片和卡通的区别所在。为了调整这两个主要部分,我们将经历四个主要步骤:加载图像创建边缘蒙版减少调色板结合边缘蒙版和彩色图像在开始主要步骤之前,不要忘记导入notebook中所需的库,尤其是cv2和NumPy。import cv2import numpy as np# required if you use Google Colabfrom google.colab.patches import cv2_imshowfrom google.colab import files1. 加载图像第一个主要步骤是加载图像。定义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 = 7blur_value = 7edges = edge_mask(img, line_size, blur_value)cv2_imshow(edges)3. 减少调色板照片和图画之间的主要区别——就颜色而言——是每一张照片中不同颜色的数量。图画的颜色比照片的颜色少。因此,我们使用颜色量化来减少照片中的颜色数目。色彩量化为了进行颜色量化,我们采用OpenCV库提供的K-Means聚类算法。为了在接下来的步骤中更容易实现,我们可以如下定义color_quantization 函数。def color_quantization(img, k):# Transform the image  data = np.float32(img).reshape((-1, 3))# Determine criteria  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)# Implementing K-Means  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值来确定要应用于图像的颜色数。total_color = 9img = 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添加另一个函数来为你的照片提供特殊效果。代码库里还有很多东西我们可以探索。很高兴尝试!参考文献:https://www.programcreek.com/python/example/89394/cv2.kmeanshttp://datahacker.rs/002-opencv-projects-how-to-cartoonize-an-image-with-opencv-in-python/☆ END ☆如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。不看的原因确定内容质量低不看此公众号

(0)

相关推荐

  • 【工具篇】如何用Google Colab高效的学习Python

    环境配置对于大多数人来说都是拦路虎,我们小白往往不知道: 怎么正确的安装 不知道选择什么 怎么安装常用的第三方库 ... Google推出了一个在线的网站 https://colab.research ...

  • colab中解绑谷歌云盘(代码方式)

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/colab中解绑谷歌云盘(代码方式) 作者:融水公子 rsgz Colab教程 Colab教程 http://www.rsgz.top/post/ ...

  • 如何正确地使用Google Colab

    一.Colab简介https://colab.research.google.com/notebooks/welcome.ipynb偶然间接触到Colab,发现它居然支持GPU,而且是免费使用.202 ...

  • 如何利用Tensorflow和OpenCV构建实时对象识别程序?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 在本文中,将逐步介绍如何使用Tensorflow(TF)的新 ...

  • colab 执行程序/等待执行/重新运行

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/colab简介 作者:融水公子 rsgz Colab教程 Colab教程 http://www.rsgz.top/post/410.html co ...

  • 平安夜,Python送你一顶圣诞帽 @微信官方

    最后知道真相的我眼泪掉下来 (还蒙在鼓里的同学请在微信最上方的搜索栏自行搜索『圣诞帽』) 好吧,你不给,咱自己来,不就是个帽子嘛. Python 在手,圣诞帽我有! OpenCV 库加上几张圣诞帽图片 ...

  • 下载google.colab模块

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/下载google.colab模块 作者:融水公子 rsgz Python3 教程 python教程 http://www.rsgz.top/pos ...

  • 为什么我的colab笔记没了?

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/为什么我的colab笔记没了? 作者:融水公子 rsgz Colab教程 Colab教程 http://www.rsgz.top/post/410 ...

  • python+opencv图像处理(二十二)

    中值滤波 中值滤波是比较常用的一种图像平滑处理方法. 其基本思路是通过滤波器遍历图像,取滤波器区域像素值中值为新的像素值. 表示为数学表达式如下: 其中,f(x,y)和g(x,y)分别是原图像和处理后 ...

  • 献给 Python 开发人员的 25 个最佳 GitHub 代码库!

    以下为译文: 根据2020年StackOverflow开发者调查报告,Python是世界上最受欢迎的语言之一,排名仅次于Rust和TypeScript.更令人惊讶的是,Python是开发人员最想尝试的 ...