首页 > 编程语言 >Python 让图像变卡通图

Python 让图像变卡通图

时间:2022-10-19 10:46:32浏览次数:47  
标签:img Python 图像 cv2 value edges 卡通图 blur

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

  • 加载图像
  • 创建边缘
  • 减少调色板
  • 将边缘掩模与彩色图像结合

  1. 图片导入

import cv2
import numpy as np
img = cv2.imread('xingye.jpg')
cv2.imshow('origin', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2import numpy as npimg = cv2.imread('xingye.jpg')cv2.imshow('origin', img)cv2.waitKey(0)cv2.destroyAllWindows()

Python 让图像变卡通图_邻域


2. 创建边缘掩模

卡通效果强调图像边缘的宽度,使用 cv2.adaptiveThreshold()函数检测图像的边缘。


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 函数对模糊灰度图像进行去噪处理。模糊值越大,图像中出现的黑噪声越少。然后,应用 adaptiveThreshold 函数,并定义边缘的线条大小。更大的线条尺寸意味着更宽的边缘,这将在图像中得到展示。


line_size = 7
blur_value = 7
edges = edge_mask(img, line_size, blur_value)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()


Python 让图像变卡通图_双边滤波_02


3. 减少调色板

照片和绘画的主要区别(就颜色而言)在于每张照片中不同颜色的数量,其中绘画的图像的颜色比照片少。因此,我们使用量化的方式来减少照片中的颜色数量。

为了实现这个图像量化,我们应用了 OpenCV 库提供的 K-Means 算法。为了使下一步更容易,我们可以定义 color_quantization 函数如下。


line_size = 7
blur_value = 7
edges = edge_mask(img, line_size, blur_value)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

k 值是我们想要应用到图像的颜色数量




total_color = 9
img = color_quantization(img, total_color)


双边滤波器

做完图像量化后,我们可以通过使用双边滤波器来降低图像中的噪声。这会给图像带来一点模糊和锐度降低的效果。


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

调整以下三个参数:

  • d:每个像素邻域的直径
  • sigmaColor:颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
  • sigmaSpace:坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域足够相似的颜色获取相同的颜色。

4. 边缘掩模和彩色图像结合

最后一步是将我们前面创建的边缘掩模与经过颜色处理的图像结合起来。为此,可以使用 cv2.bitwise_and 函数






cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)
cv2.imshow('cartoon', cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python 让图像变卡通图_双边滤波_03


完整代码如下


import cv2
import numpy as np


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


img = cv2.imread('xingye.jpg')
cv2.imshow('origin', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

line_size = 7
blur_value = 7
edges = edge_mask(img, line_size, blur_value)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()


def color_quantization(img, k):
data = np.float32(img).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


total_color = 9
img = color_quantization(img, total_color)

blurred = cv2.bilateralFilter(img, d=7, sigmaColor=200, sigmaSpace=200)
cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)

cv2.imshow('cartoon', cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()

标签:img,Python,图像,cv2,value,edges,卡通图,blur
From: https://blog.51cto.com/domi/5765008

相关文章

  • Python中的枚举类enum
    0.本文来历上一篇文章,我写了Pytest插件pytest-order指定用例顺序我当时就比较好奇它的顺序和英文的对应关系,肯定是写死的,找了下就发现在源码sorter.py中定义了一......
  • Python教程Day03-Python输出、输入、转换数据类型、运算符
    一、输出作用:程序输出内容给用户print('helloPython')age=18print(age)#需求:输出“今年我的年龄是18岁”1、格式化输出格式化输出即按照一定的格式输出内容1.1格......
  • Python list 中删除元素的方法
    在python列表中删除元素主要分为以下3种场景:根据目标元素所在的索引位置进行删除,可以使用del关键字或pop()方法;根据元素本身的值进行删除,可使用列表(list类型)提供的remove(......
  • python 脚本实现bugly自动上传符号文件
    bugly更新之后,符号文件不再支持拖拽或者选择文件的方式上传了,官方提供了一个上传的工具包,通过buglyqq-upload-symbol.jar实现上传,每次上架app都需要手动去配置相关参数和组......
  • python当中map,reduce和filter函数用法和区别
    在python当中,关于map,reduce和filter函数用法。map:对任何可迭代序列中的每一个元素应用对应的函数。python3中返回的是迭代器。reduce:将序列中所有的元素进行合并运算......
  • python封装
    这种变形的特点:1,在类外部无法直接obj.__AttrName2,在类内部可以直接使用:obj.__AttrName3,子类无法覆盖父类__开头的属性0,classA:'类的封装啊'__x=1......
  • python类中的数据问题
    问题:1.)上面的__init__函数中,加*句我不写,为啥不可以?不理解里面怎么传递。。。初始化的时候不是先在内部调用了__init__,生成了L了吗?下面函数不能用这里的L,甚至是a,b这些变......
  • Selenium+Python系列 - 开发环境搭建
    一、写在前面我从未想过自己会写python系列的自动化文章,有些同学会问,那你现在为什么又开始写了?不止一个人找过我,问我可以写一些Python自动化的文章吗,答案是肯定的。笔......
  • Python 操作Excel-openpyxl模块使用
    openpyxl的用法实例1.1Openpyxl库的安装使用openpyxl模块是一个读写Excel2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一......
  • 学习python-Day76
    今日学习内容一、虚拟机关键配置名词解释1.虚拟网络编辑器说明桥接模式​ 配置的地址信息和物理主机地址信息相同,容易造成地址冲突NAT模式​ 配置的地址信息和物......