基于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_())

到此这篇关于基于Python实现简易的动漫图片转换器的文章就介绍到这了,更多相关Python动漫图片转换器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现人像动漫化的示例代码

    利用百度api实现人像动漫化 百度API地址:https://ai.baidu.com/tech/imageprocess/selfie_anime 技术文档:https://ai.baidu.com/ai-doc/IMAGEPROCESS/Mk4i6olx5 注册百度账号,开通实现人像动漫化,创建应用. # encoding:utf-8 import requests import base64 # client_id 为官网获取的AK, client_secret 为官网获取的SK host

  • 基于Python实现视频转字符画动漫小工具

    目录 导语 正文 一.准备中 二.原理简介 三.代码演示 四.效果展示 导语 ​哈喽!boys and  girls 我是每天疯狂赶代码的木木子~ 今天带大家来点儿好玩儿的东西,我想你们肯定是喜欢的! 上面这个大家都认识吧 对,就是字符动画啦,之前也是不是再那个旮旯里面看见过,但是还没上手自己试的. 小编给大家先试试效果了,效果也是真不错,趣味性蛮强滴 推荐指数5颗星,大家都开始动手 燥起来吧~ 那么如何将视频动画转成字符画呢?今天就来教大家怎么转换,非常简单,今天教大家制作的 这款工具就能一键

  • 利用Python实现一键将头像转成动漫风

    目录 PyQt5框架 代码逻辑 最近在Github上面有看到将头像转化成动漫风的项目,但是对于不少没有技术背景的同学来说可能就不知道该怎么使用了,小编今天制作了一个UI界面,大家可以通过一键点击就实现头像照片转化成动漫风格的功能. PyQt5框架 用Python编程语言来制作UI界面的框架有很多哈,大家原则上哪种框架用的顺手就用哪种框架,小编这里使用的是PyQt的框架,因为它支持手动绘制控件,并且可以动态加载,我们在Pycharm当中添加上QtDesigner作为外部工具,来进行界面设置,生成u

  • 利用Python实现普通视频变成动漫视频

    目录 容我废话一下 一.思路流程 二.图像转动漫 三.视频帧读取与视频帧写入 容我废话一下 最近几个月,毒教材被曝光引发争议,那些编写度教材的人着实可恶.咱程序员也没有手绘插画能力,但咱可以借助强大的深度学习模型将视频转动漫.所以今天的目标是让任何具有python语言基本能力的程序员,实现短视频转动漫效果. 效果展示 一.思路流程 1.读取视频帧 2.将每一帧图像转为动漫帧 3.将转换后的动漫帧转为视频 难点在于如何将图像转为动漫效果.这里我们使用基于深度学习的动漫效果转换模型,考虑到许多读者对

  • Python OpenCV实现人物动漫化效果

    目录 前言 效果展示 代码展示 前言 前几天玩抖音,发现一个人像动漫化的操作,觉得很好玩儿.我心想:python既然这么强大,是不是也可以使用python程序来实现这样一个操作呢? 哈哈!我自己当然是没有这个本事编写这样一个牛逼的程序出来,但是百度可以呀,并且还很好用.百度AI开放平台给我们提供了完整的接口,甚至贴心的将代码都给我们写好了.这些接口还支持很多主流语言都呢,像Java.Python.PHP.C#等,我们做的就是直接调用它即可. 效果怎么样呢?我们先来看看下方的对比图吧. 效果展示

  • 基于Python实现简易的动漫图片转换器

    本文旨在制作一个将普通照片转换成动漫图片的小工具,其中使用opencv的非标准库实现对图片完成转换. UI界面的制作使用的还是pyqt5,因为用习惯了使用起来相当方便,接下来还是先将使用到的python非标准库列举一下. # PyQt5相关模块 from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * # 动漫图片制作的业务模块 import cv2 import sys import o

  • 基于Python实现简易的植物识别小系统

    导语 "  花草树木 皆有呈名 热爱自然,从认识自然开始 " 现在的植物爱好者,遇到不认得的植物.怎么办呢? 前几天去逛商场,一进商城一一一一门口的花店吸引了我的注意:摆放在店门口的各色鲜花植物花卉真的特别好看! 忍不住进门逛了一圈,发现我真的不认识,种类太多,对花卉的品种了解颇少. 回来之后找到了2款简单好用的植物识别APP一一一伴侣跟形色蛮好用的! 闲着也是闲着:默默用Python编写了一款简单的植物识别系统给大家正好la~ 正文 1)环境安装 本文用到的环境:Python3.7 

  • 基于Python实现简易的自制头像神器

    目录 前言 正文 1)原理简介 2)准备中 3)代码展示 4)效果展示 前言 都说新年新气象,所以,为了迎接2022年的到来! 小编决定换一波头像——于是问题来了!换一个什么样的头像比较合适呢? 来!开一波脑洞——作为一个不会PS的普通程序员要怎么快速制作一个属于自己的渐变头像呢?十行 Python 代码就能解决,非常简单! ​ 正文 首先来给大家白嫖几组新年的头像啦!快接着哈 1)原理简介 主要使用到了 Python 的 PIL 库(pip install Pillow),实现步骤也很简单:

  • 基于Python编写简易版的天天跑酷游戏的示例代码

    写出来的效果图就是这样了: 下面就更新一下全部的代码吧 还是老样子先定义 import pygame,sys import random 写一下游戏配置 width = 1200            #窗口宽度 height = 508            #窗口高度 size = width, height    score=None              #分数 myFont=myFont1=None     #字体 surObject=None          #障碍物图片   

  • 基于Python制作简易的windows修改器

    现在应该大部分人都使用win11系统吧,不用也要强行给你更新到win11,win11其实挺好用哈,只是有一点不好用,就是右键的菜单,今天做个小程序,就是应该修改win11的一个应用程序 先来看一段视频哈! 视频链接 windows11修改器 提取码:v9ms 源代码加编译后的文件 提取码:enr4 该程序的安装包 已被博主做成了安装包 这款软件纯python制作,内容简单 1.可以将win11的右键改为win10经典版,还可以进行恢复 2.可以去掉win11右键的终端(也就是win11的最高管理

  • 基于python制作简易版学生信息管理系统

    一.前言 本篇博客对于文件操作.字典.列表.匿名函数以及sort()等内置函数进行了系统的整理操作,以设计一个学生信息管理系统的形式展示,具体概念方法等会在代码后进行分析讲述,请读者仔细分析每一处解析,对于基础巩固将会有很大的帮助,其中还有每一块代码的设计思路图,逻辑分析会有一定的提升. 二.需求分析 本程序需要用到os模板首先导入,并命名要存储信息的文件 import os File_Object_Name = 'Student_Inforation.txt' 三.主函数 def Main()

  • 基于Python实现简易文档格式转换器

    目录 需求分析 开发环境 引用模块 UI界面代码块 格式转换主要代码块 效果展示 最近看到市场上各种的文档格式转换软件,要么是收费.要么是有大量的广告.于是学习了一下 PyQt5 的页面操作,再加上了解 pandas 的使用方法.所以,萌生了想法写一个简单的文档格式转换应用.或者有更好的实现方式请在评论区留言,大家一起讨论学习~ 需求分析 1.将 .txt 的文本文档转换成 csv 格式文件. 2.将 .txt 的文本文档转换成 excel 格式文件. 开发环境 1.运行环境:python-3.

  • 基于python利用Pyecharts使高清图片导出并在PPT中动态展示

    目录 1.前言 2.导出png格式图片 3.如何在PPT中展示pyecharts图片 1.前言 pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.用 Echarts 生成的图可视化效果非常棒,为了与 Python 进行对接,方便在 Python 中直接使用数据生成图”.pyecharts可以展示动态图,在线报告使用比较美观,并且展示数据方便,鼠标悬停在图上,即可显示数值.标签等.pyecharts画出的图很好看,但是怎么展示是个

  • 基于Python编写简易的成语接龙游戏

    目录 前言 1.游戏规则 2.正式敲代码 2.1模块导入 2.2读取txt数据 2.3界面设置 2.4电脑接龙 2.5重新开始新游戏 2.6成语是否合法 2.7读取成语的数据 2.8附完整的项目源码 3.效果展示 前言 "胸藏文墨怀如谷,腹有诗书气自华".      ——<和董传留别> 成语接龙是中华民族传统的文字游戏. 它历史悠久,是传统文字.文化.文明的一个缩影,也是老少皆宜的民间文化娱乐活动. 成语接龙:"龙腾虎跃,该你了!"          

  • 基于Python编写简易文字语音转换器

    话不多说上代码!源代码 from tkinter import * import pyttsx3 class Application(Frame): def __init__(self,master=None): super().__init__(master) self.master = master self.pack() self.creatWidget() # BING INPUT def creatWidget(self): self.w1 = Text(self, width=80,

随机推荐