图片转为漫画

翻译链接图片漫画化

第一步:导入需要的库

导入OpenCV库用于图片处理
导入easygui
导入numpy 图片存储和处理为数字
导入imageio
导入matplotlib
OS 操作系统交互,这里主要时读取和存储图片路径

import cv2  #用于图像处理
import easygui #
import numpy
import imageio
import sys
import matplotlib.pyplot as plt
import os
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image

第二步 创建一个文件盒用于选择指定文件

构建应用程序的主窗口,按钮、标签和图像将驻留在该窗口中。

top = tk.Tk()
# 窗口大小
top.geometry('400x400')
# 窗口名字
top.title('Cartoonify your Image')
# 窗口背景色
top.configure(background='white')
""" fileopenbox opens the box to choose file
and help us store file path as string """
def upload():ImagePath=easygui.fileopenbox()cartoonify(ImagePath)

第三步 读取图片

用imreadj将图像读入存为numpy, 颜色顺序是BGR,用cvtColor转换为RGB

# 读取图片originalmage = cv2.imread(ImagePath)originalmage = cv2.cvtColor(originalmage, cv2.COLOR_BGR2RGB)
#print(image)  #  图片以数字形式存储
# 确认选中了图片if originalmage is None:print("Can not find any image. Choose appropriate file")sys.exit()# 第一个状态图,最后输出的3行2列图每个图的大小统一设置为960*540ReSized1 = cv2.resize(originalmage, (960, 540))
#plt.imshow(ReSized1, cmap='gray')

第四步 转为灰度图

漫画效果有两个特色:1、显著的边缘 2、平滑的颜色
为了将图片转为漫画,需要做多种转换。首先,转化成灰度图,灰度图更平滑;然后我们获取图片中得边缘部分;最后我们形成一个彩色图并用边缘来mask它。

#转为灰度图
grayScaleImage = cv2.cvtColor(originalmage, cv2.COLOR_BGR2GRAY)
# 在第一个状态上改为灰度图
ReSized2 = cv2.resize(grayScaleImage, (960, 540))
#plt.imshow(ReSized2, cmap='gray')

平滑灰度图

图像平滑处理(归一化块滤波、高斯滤波、中值滤波、双边滤波)
中值滤波:在核范围内所有点的平均值取代中心像素点,核大小一般为基数,这里是5。

#applying median blur to smoothen an image
smoothGrayScale = cv2.medianBlur(grayScaleImage, 5)
ReSized3 = cv2.resize(smoothGrayScale, (960, 540))
#plt.imshow(ReSized3, cmap='gray')

第五步 检索图片的边缘

实现第一个漫画特征 显著的边缘
通过自适应阈值技术adaptiveThreshold()检索边缘并使他们更显著。
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
scr:需要进行转换的灰度图,
maxValue,超过阈值设置的颜色(灰度值),
adaptiveMethod(自适应阈值算法)采用ADAPTIVE_THRESH_MEAN_C 即求局部领域块的平均值,
threshold Type 指定阈值类型为THRESH_BINARY即二进制阈值
blockSize:领域大小
C:adaptiveMethod计算出的值减去C为最终的阈值

#retrieving the edges for cartoon effect
#by using thresholding technique
getEdge = cv2.adaptiveThreshold(smoothGrayScale, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9)
ReSized4 = cv2.resize(getEdge, (960, 540))
#plt.imshow(ReSized4, cmap='gray')

第六步 准备蒙版图片

实现第二个漫画特征 平滑的颜色
将上一步得到的边缘盖在一个高亮的图片上,实现漫画化。用双边滤波器bilateralFilter去除噪声使图片在一定上更平滑。
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,达到保边去噪的目的,可以做边缘保,一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。9 邻域大小,后面两个300 分别是sigmaColor和SigmaSpace, 用来产生西格玛效果,也就是让图像看起来很糟糕,像水彩一样,消除颜色的粗糙性。

bilateralFilter( InputArray src, OutputArray dst, int d, double sigmaColor,double sigmaSpace,int borderType = BORDER_DEFAULT );
sigmaColor:颜色空间滤波器的sigma值。数值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
sigmaSpace坐标空间中滤波器的sigma值,数值越大,越远的像素会相互影响.

#applying bilateral filter to remove noise
#and keep edge sharp as required
colorImage = cv2.bilateralFilter(originalmage, 9, 300, 300)
ReSized5 = cv2.resize(colorImage, (960, 540))
#plt.imshow(ReSized5, cmap='gray')

第七步 漫画化

结合上两步得到的图片
bitwise_and(src1, src2, dst=None, mask=None)
src1、src2:为输入图像
dst:可选输出变量
mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0

#masking edged image with our "BEAUTIFY" image
cartoonImage = cv2.bitwise_and(colorImage, colorImage, mask=getEdge)
ReSized6 = cv2.resize(cartoonImage, (960, 540))
#plt.imshow(ReSized6, cmap='gray')

全部代码

import cv2  #用于图像处理
import easygui #
import numpy
import imageio
import sys
import matplotlib.pyplot as plt
import os
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from tkinter import messagebox
from PIL import ImageTk, Imagetop = tk.Tk()
# 窗口大小
top.geometry('400x400')
top.title('Cartoonify your Image')
top.configure(background='white')
label = Label(top, background='#CDCDCD', font=('arial', 20, 'bold'))
# fileopenbox 以字符串形式返回选择的路径
def upload():ImagePath = easygui.fileopenbox()cartoonify(ImagePath)def cartoonify(ImagePath):# 读取图片 imread是cv2通常用于以数字形式保存图片originalmage = cv2.imread(ImagePath)originalmage = cv2.cvtColor(originalmage, cv2.COLOR_BGR2RGB)if originalmage is None:print("Can not find any image. Choose appropriate file")Resized1 = cv2.resize(originalmage, (960,540))#plt.imshow(Resized1, cmap='gray')# 转成灰度图# cvtColor(image,flag)是cv2中将图片转化为flag中提到的色彩空间中的颜色grayScaleImage = cv2.cvtColor(originalmage, cv2.COLOR_BGR2GRAY)Resized2 = cv2.resize(grayScaleImage, (960,540))plt.imshow(Resized2, cmap='gray')# 平滑图片用的是模糊效果,用了中值模糊medianBlur()这个函数来平滑一个图片,smoothGrayScale = cv2.medianBlur(grayScaleImage, 5)Resized3 = cv2.resize(smoothGrayScale,(960,540))plt.imshow(Resized3, cmap='gray')# 用阈值技术检索卡通效果的边缘getEdge = cv2.adaptiveThreshold(smoothGrayScale,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 9, 9)Resized4 =cv2.resize(getEdge, (960,540))plt.imshow(Resized4, cmap='gray')# 用一个双边滤波器(bilateraFilter())去除噪声保持边缘锐度colorImage =cv2.bilateralFilter(originalmage, 9, 300, 300)Resized5 = cv2.resize(colorImage, (960,540))plt.imshow(Resized5, cmap='gray')cartoonImage = cv2.bitwise_and(colorImage, colorImage, mask=getEdge)Resized6 = cv2.resize(cartoonImage, (960,540))plt.imshow(Resized6, cmap='gray')plt.show()images = [Resized1, Resized2, Resized3, Resized4, Resized5, Resized6]fig, axes = plt.subplots(3,2, figsize=(8,8), subplot_kw={'xticks':[], 'yticks':[]},gridspec_kw=dict(hspace=0.1, wspace=0.1))for i, ax in enumerate(axes.flat):ax.imshow(images[i], cmap='gray')save1 = Button(top, text='save cartoon image', command=lambda: save(Resized6, ImagePath),padx=30, pady=5)save1.configure(background='#364156', foreground='white', font=('arial', 10, 'bold'))# 放置位置save1.pack(side=TOP, pady=50)plt.show()def save(Resized6, ImagePath):# 用imwrite存储图片newName = "cartoonified_Image"path1 = os.path.dirname(ImagePath)extension = os.path.splitext(ImagePath)[1]path = os.path.join(path1, newName + extension)cv2.imwrite(path, cv2.cvtColor(Resized6, cv2.COLOR_RGB2BGR))I = "Image saved by name " + newName + " at " + pathtk.messagebox.showinfo(title=None, message=I)# 创建按钮
upload = Button(top, text='Cartoonify an image', command=upload, padx=10, pady=5)
# 背景色、前景色、字体配置
upload.configure(background='#364156', foreground='white', font=('arial',10,'bold'))
upload.pack(side=TOP,pady=50)
top.mainloop()

机器学习项目1图片卡通化相关推荐

  1. 实战精通OpenCV第一章--基于Android的图片卡通化及肤色改变(三)

    第一章 基于Android的图片卡通化及肤色改变 一.基于Visual Studio的图片卡通化 二.基于Visual Studio的肤色改变 三.Android代码移植 最近由于工作比较忙,很抱歉没 ...

  2. 实战精通OpenCV第一章--基于Android的图片卡通化及肤色改变(二)

    转载请注明出处:https://blog.csdn.net/mymottoissh/article/details/86723580 第一章 基于Android的图片卡通化及肤色改变 一.基于Visu ...

  3. Befunky - 将图片卡通化的在线工具

    <script type="text/javascript"> </script> <script src="http://pagead2. ...

  4. 实战精通OpenCV第一章--基于Android的图片卡通化及肤色改变(一)

    转载请注明出处:https://blog.csdn.net/mymottoissh/article/details/86709457 本系列博客是基于<Mastering OpenCV with ...

  5. python使用百度云API接口图片卡通化

    python使用百度云API接口图片卡通化: import requests import base64class AnimeDemo:def __init__(self,AK,SK):self.AK ...

  6. Mastering Opencv学习笔记(1)——图片卡通化

    一.简介 可以通过opencv将图片进行卡通化处理,基本的思路是将图片的内容部分进行平滑处理,然后让边缘部分更加突出.首先,通过边缘检测滤波器获得图像的黑白素描图,然后通过双边滤波器获得平滑后的图像, ...

  7. [python ][opencv][图片卡通化]

    按顺序:               处理后的图片                待处理图片                源文件 下面是代码: import os import cv2def car ...

  8. 基于ONNX的人物卡通化

    照片进行卡通化,是研究的重点.主要原理是检测人头分割.然后卡通化网络.直接ONNX调用,得到卡通化的效果. 效果如下图所示: C++和PYTHON都能实现,具体效果见下面链接 照片卡通化,只需要OPE ...

  9. python头像转卡通_【Python】照片卡通化

    导语 最近想换个好看点的卡通头像,于是想着可以尝试利用Python与一些图像处理技术将照片卡通化,没有使用深度学习,只是做了些简单的尝试,过来分享一波,效果一般般吧,感觉可以凑合着用用. 让我们愉快地 ...

最新文章

  1. tf.GradientTape() 示例
  2. EM算法——有隐含变量时,极大似然用梯度法搞不定只好来猜隐含变量期望值求max值了...
  3. 几u产品结构计算机什么意思,计算机u系统组成.ppt
  4. phpcmsv9mysql扩展_phpcmsV9升级到php7.1+mysql5.6+nginx1.9迁移步骤nginx中文伪静态rewrite配置...
  5. Spring restful
  6. 一篇文章助你了解机器学习
  7. 如何使用Putty登录安装在VirtualBox里的ubuntu
  8. 再见了 React、Angular,Vue3 才是 yyds
  9. kali linux重启网络服务报错,Web安全学习笔记之在Kali Linux上安装Openvas以及启动失败修复...
  10. python编程环境安装包_Python环境安装与配置
  11. 重庆邮电大学c语言实验报告,重庆邮电大学c语言上机实验期末实验报告.doc
  12. minecraft java_minecraft java版本下载
  13. MySQL与Navicat安装及配置
  14. vue 代码格式化(VS code)
  15. centos7 修改 max locked memory
  16. MATLAB学习心得~
  17. C#之Image使用
  18. JAVA大学生科技创新项目管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  19. 来自北大算法课的Leetcode题解:696. 计算二进制子串
  20. 老男孩mysql 百度云_英语语录:除了你,没人能掌控你的幸福

热门文章

  1. 基于单片机的病房呼叫系统设计 源代码
  2. iOS AI智能对话项目(一边设备开外放声音,一边录音降噪)
  3. Python爬虫进阶之爬取某视频并下载,没有广告的视频看起来不爽吗?
  4. SpringMVC控制器类名称处理映射 500错误
  5. 中国制造VS国际品牌 耳熟能详游戏引擎比拼
  6. 如何调试命令行程序?——怎样输入命令行程序参数
  7. 小白学习MySQL - 数据库软件和初始化安装
  8. vos3000 检测版本失败_VOS3000 安装
  9. Java GUI(图形用户界面)-----GridLayout(网格布局管理器)详解
  10. .Net开发的部分知名网站案例