基于Python实现简易的动漫图片转换器
作者:Sir 发布时间:2022-12-25 23:23:11
标签:Python,动漫,图片
本文旨在制作一个将普通照片转换成动漫图片的小工具,其中使用opencv的非标准库实现对图片完成转换。
UI界面的制作使用的还是pyqt5,因为用习惯了使用起来相当方便,接下来还是先将使用到的python非标准库列举一下。
#?PyQt5相关模块
from?PyQt5.QtWidgets?import?*
from?PyQt5.QtCore?import?*
from?PyQt5.QtGui?import?*
#?动漫图片制作的业务模块
import?cv2
import?sys
import?os
#?日志模块
from?loguru?import?logger
制作UI界面,创建CartoonUI类,用于初始化图片转换器的应用。CartoonUI类继承自QWidget,因为这里只需要制作一个单页面的应用,因此,这里只继承了QWidget。
class?CartoonUI(QWidget):
????def?__init__(self):
????????'''
????????初始化UI界面应用
????????'''
????????super(CartoonUI,?self).__init__()
????????self.init_ui()
????def?init_ui(self):
????????'''
????????自定义实现的ui应用函数
????????:return:
????????'''
????????self.setWindowTitle('动漫图片转换器??公众号:Python 集中营')
????????self.setWindowIcon(QIcon('ico.png'))
????????self.setFixedWidth(500)
????????hbox?=?QHBoxLayout()
????????self.input_image_path?=?QLineEdit()
????????self.input_image_path.setPlaceholderText('源图片路径')
????????self.input_image_path.setReadOnly(True)
????????self.input_image_btn?=?QPushButton()
????????self.input_image_btn.setText('导入源图片')
????????self.input_image_btn.clicked.connect(self.input_image_btn_click)
????????self.generate_btn?=?QPushButton()
????????self.generate_btn.setText('一键生成动漫图片')
????????self.generate_btn.clicked.connect(self.generate_btn_click)
????????hbox.addWidget(self.input_image_path)
????????hbox.addWidget(self.input_image_btn)
????????hbox.addWidget(self.generate_btn)
????????self.thread_?=?WorkThread(self)
????????self.thread_.finished.connect(self.finished)
????????self.setLayout(hbox)
????def?input_image_btn_click(self):
????????'''
????????input_image_btn按钮绑定的槽函数,
????????用于实现打开文件浏览项
????????:return:
????????'''
????????im_path?=?QFileDialog.getOpenFileName(self,?os.getcwd(),?'打开图片',
??????????????????????????????????????????????'Image?File(*.jpg);;Image?File(*.png);;Image?File(*.jpeg)')
????????self.input_image_path.setText(im_path[0])
????def?generate_btn_click(self):
????????'''
????????generate_btn按钮绑定的槽函数,
????????用于启动业务子线程
????????:return:
????????'''
????????self.thread_.start()
????????self.generate_btn.setEnabled(False)
????def?finished(self,finished):
????????'''
????????接收子线程中finished变量,
????????判定子线程业务是否执行完成,若执行完成则将按钮状态改变为可点击状态
????????:param?finished:
????????:return:
????????'''
????????if?finished?is?True:
????????????self.generate_btn.setEnabled(True)
创建WorkThread类,继承自QThread子线程,子线程这里专门用来实现对普通图片的准换过程。之所以使用子线程来完成业务实现,是因为通常直接在主线程中完成业务会导致主线程异常卡死的情况。
单独使用子线程来完成业务会保证PyQt5的主线程正常的运行,将业务实现和界面应用分离开来。
class?WorkThread(QThread):
????finished?=?pyqtSignal(bool)
????def?__init__(self,?parent=None):
????????'''
????????子线程初始化函数
????????:param?parent:
????????'''
????????super(WorkThread,?self).__init__(parent)
????????self.parent?=?parent
????????self.working?=?True
????def?__del__(self):
????????'''
????????子线程停止函数
????????:return:
????????'''
????????self.working?=?False
????????self.wait()
????def?run(self):
????????'''
????????子线程执行函数
????????:return:
????????'''
????????try:
????????????input_picture_name?=?os.path.basename(self.parent.input_image_path.text().strip())
????????????logger.info(input_picture_name)
????????????output_picture_name?=?'cartoon_'?+?input_picture_name
????????????num_down?=?2??#?缩减像素采样的数目
????????????num_bilateral?=?7??#?定义双边滤波的数目
????????????img_rgb?=?cv2.imread(input_picture_name)??#?读取图片
????????????#?用高斯金字塔降低取样
????????????img_color?=?img_rgb
????????????for?_?in?range(num_down):
????????????????img_color?=?cv2.pyrDown(img_color)
????????????#?重复使用小的双边滤波代替一个大的滤波
????????????for?_?in?range(num_bilateral):
????????????????img_color?=?cv2.bilateralFilter(img_color,?d=9,?sigmaColor=9,?sigmaSpace=7)
????????????#?升采样图片到原始大小
????????????for?_?in?range(num_down):
????????????????img_color?=?cv2.pyrUp(img_color)
????????????#?转换为灰度并且使其产生中等的模糊
????????????img_gray?=?cv2.cvtColor(img_color,?cv2.COLOR_RGB2GRAY)
????????????img_blur?=?cv2.medianBlur(img_gray,?7)
????????????#?检测到边缘并且增强其效果
????????????img_edge?=?cv2.adaptiveThreshold(img_blur,?255,
?????????????????????????????????????????????cv2.ADAPTIVE_THRESH_MEAN_C,
?????????????????????????????????????????????cv2.THRESH_BINARY,
?????????????????????????????????????????????blockSize=9,
?????????????????????????????????????????????C=2)
????????????#?转换回彩 * 像
????????????img_edge?=?cv2.cvtColor(img_edge,?cv2.COLOR_GRAY2RGB)
????????????img_cartoon?=?cv2.bitwise_and(img_color,?img_edge)
????????????#?保存转换后的图片
????????????cv2.imwrite(output_picture_name,?img_cartoon)
????????????logger.info('动漫图片转换完成!')
????????????self.finished.emit(True)
????????except?Exception?as?e:
????????????logger.error(e)
实现完成上述所有的业务之后,需要使用main函数将PyQt5应用加入到主体循环中,这样整个UI应用就直接拉起了。
if?__name__?==?'__main__':
????app?=?QApplication(sys.argv)
????main?=?CartoonUI()
????main.show()
????sys.exit(app.exec_())
来源:https://mp.weixin.qq.com/s/CRUdE-F53RSmxYjyrGsyUA
0
投稿
猜你喜欢
- 今天填一个坑,俄罗斯方块!!俄罗斯方块的移动不难实现,但是旋转就不太容易实现,究其原因是因为Python中没有数组这种数据结构,所以不能用矩
- 模式库在模式库里,我将列出所有电子商务网站需要的模式.以下将罗列出经典常用的模式案例,我也试图让这些模式看起来更有趣味性与实用性。(Yaho
- 需求我在最近的一个任务中,存在一个redis高并发计算多个客户端接收预警信息的时长问题。模型是首先模拟多个客户端连接预警服务器集群,然后向预
- value_counts()方法返回一个序列Series,该序列包含每个值的数量(对于数据框中的任何列,value_counts()方法会返
- windows系统下Python环境的搭建step1:下载Python程序 https://www.python.org/downloads
- 目录1.jupyter简介2.jupyter基础操作2.1windows更新pip库2.2jupyter安装2.3初次启动jupyter2.
- Python中的penpyxl是一个第三方库,可以处理xlsx格式的Excel文件。pip install openpyxl安装。penpy
- 首先让我祭出一张数学王子高斯的照片,这位印在德国马克上的神人有多牛呢? 他是近代数学的奠基人之一,与牛顿, 阿基米德并称顶级三大数学家,随便
- Python Logging原来真的远比我想象的要复杂很多很多,学习路线堪比git。但是又绕不过去,alternatives又少,所以必须要
- 本文介绍了python selenium UI自动化解决验证码的4种方法,分享给大家,具体如下:测试环境windows7+firefox50
- 原始数据原始数据大致是这样子的:每条数据中的四个数据分别是 当前节点名称,节点描述(指代一些需要的节点属性),源节点(即最顶层节点),父节点
- 网页编程中,在与数据库打交道的时候我们经常会碰到乱码的经常。本文就将介绍一种ASP读取MySQL数据库出现乱码的解决办法。情景再现:使用My
- 本文实例讲述了Python自定义scrapy中间模块避免重复采集的方法。分享给大家供大家参考。具体如下:from scrapy import
- 前言本文主要给大家介绍了关于Django快速分页的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。分页在web开发
- Python 在 2.2 版本中引入了descriptor(描述符)功能,也正是基于这个功能实现了新式类(new-styel class)的
- 如下所示:import datetime #获取两个日期间的所有日期 def getEveryDay(begin_date,end_date
- 索引 经常要查询的语句,则给它建一个索引 表连接 select T_Oders as o join T_Customers as C on
- 使用memcache来同步session是还是不错的,当然也可以通过redis来保存session,可以php开启并将Session存储到R
- 本文实例讲述了Python多进程multiprocessing、进程池用法。分享给大家供大家参考,具体如下:内容相关:multiproces
- 通过学习借鉴朋友的实现方法进行整理,实现了PHP版的微信公共平台消息主动推送,分享给大家供大家参考,具体内容如下此方法是通过模拟登录微信公共