手绘图片生成器:以雪容融为例一键生成

请滑到文章末尾查看完整源码的获取方式!

【阅读全文】

在百度上面找了一个雪容融的图片,看一下生成的手绘图片效果…

手绘图片生成器:以雪容融为例一键生成

手绘图片生成器:以雪容融为例一键生成

手绘图片生成器可以将导入的彩色图片通过python分析光源、灰度等操作生成手绘图片。

手绘图片生成器:以雪容融为例一键生成

UI界面的整体部分代码块,UI界面的设计比较简单。效果在上面的图片展示。

class HandImage(QWidget):
    def __init__(self):
        super(HandImage, self).__init__()
        self.init_ui()

    def init_ui(self):
        '''
        UI界面组件及布局
        :return:
        '''
        self.setWindowTitle('手绘图片生成器   公众号:[Python 集中营]')
        self.setWindowIcon(QIcon('手绘图标.ico'))

        self.setFixedWidth(500)

        self.sou_im_path = QLineEdit()
        self.sou_im_path.setReadOnly(True)

        self.sou_im_path_btn = QPushButton()
        self.sou_im_path_btn.setText('源图片')
        self.sou_im_path_btn.clicked.connect(self.sou_im_path_btn_clk)

        self.dir_path = QLineEdit()
        self.dir_path.setReadOnly(True)

        self.dir_path_btn = QPushButton()
        self.dir_path_btn.setText('存储')
        self.dir_path_btn.clicked.connect(self.dir_path_btn_clk)

        self.start_btn = QPushButton()
        self.start_btn.setText('开始绘制图像')
        self.start_btn.clicked.connect(self.start_btn_clk)

        grid = QGridLayout()
        grid.addWidget(self.sou_im_path, 0, 0, 1, 1)
        grid.addWidget(self.sou_im_path_btn, 0, 1, 1, 1)
        grid.addWidget(self.dir_path, 1, 0, 1, 1)
        grid.addWidget(self.dir_path_btn, 1, 1, 1, 1)
        grid.addWidget(self.start_btn, 2, 0, 1, 2)

        self.thread_ = WorkThread(self)
        self.thread_.finished.connect(self.finished)

        self.setLayout(grid)

    # UI界面上的槽函数

    def sou_im_path_btn_clk(self):
        '''
        选择源图片并设置路径
        :return:
        '''
        im_path = QFileDialog.getOpenFileName(self, os.getcwd(), '打开图片', 'Image File(*.jpg);;Image File(*.png)')
        self.sou_im_path.setText(im_path[0])

    def dir_path_btn_clk(self):
        '''
        选择存储路径并设置路径
        :return:
        '''
        dir_path = QFileDialog.getExistingDirectory(self, os.getcwd(), '选择路径')
        self.dir_path.setText(dir_path)

    def start_btn_clk(self):
        '''
        开始按钮绑定的槽函数
        :return:
        '''
        self.start_btn.setEnabled(False)
        self.thread_.start()

    def finished(self, finished):
        '''
        用于子线程传递完成信号的槽函数
        :param finished: 信号变量
        :return:
        '''
        if finished is True:
            self.start_btn.setEnabled(True)

其中绘图用到的第三方库只有两个,主要的还是Pillow图像处理库,还有就是numpy科学计算库用于一些数组计算等的操作。

将第三方的处理库导入到代码块中

from PIL import Image  # 图像处理模块
import numpy as np  # 科学计算库

PyQt5界面制作及样式、核心组件
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

应用基础操作相关
import sys
import os

创建用于专门手绘图像的子线程类,将UI界面的处理逻辑和生成图像的处理逻辑分开不至于产生无响应的卡死状态。

class WorkThread(QThread):
    finished = pyqtSignal(bool)

    def __init__(self, parent=None):
        super(WorkThread, self).__init__(parent)
        self.parent = parent
        self.working = True

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        # 源图片路径
        sou_im_path = self.parent.sou_im_path.text().strip()
        # 存储路径
        dir_path = self.parent.dir_path.text().strip()
        if sou_im_path == '' or dir_path == '':
            self.finished.emit(True)
            return
        # 打开需要进行转的图像,并进行参数设置,取出来的参数主要图像的一些梯度值。最后进行数组保存。
        vals = np.asarray(Image.open(sou_im_path).convert('L')).astype('float')

        '''图像参数处理'''
        depth = 12.0  # 设置初始化深度
        gray_vals = np.gradient(vals)  # 提取图像灰度的梯度值
        gray_x, gray_y = gray_vals  # 单独提取横坐标与纵坐标的灰度值
        print('当前横坐标的灰度值:', gray_x)
        print('当前纵坐标的灰度值:', gray_y)

        # 重新设置横坐标合纵坐标的灰度值
        gray_x = gray_x * depth / 100.0
        gray_y = gray_y * depth / 100.0

        # 根据numpy.sqrt()函数计算横坐标和纵坐标灰度值的平方根
        gray_sqrt = np.sqrt(gray_x ** 2 + gray_y ** 2 + 1.0)

        # 重新计算X轴、Y轴、Z轴的光源
        light_x = gray_x / gray_sqrt
        light_y = gray_y / gray_sqrt
        light_z = 1.0 / gray_sqrt

        # 计算光源的方位角度、俯视角度
        agnle_el = np.pi / 2.2  # 俯视角度
        agnle_az = np.pi / 4.  # 方位角度

        # 分别计算光源对X轴、Y轴、Z轴的影响
        dx = np.cos(agnle_el) * np.cos(agnle_az)  # 光源对x 轴的影响
        dy = np.cos(agnle_el) * np.sin(agnle_az)  # 光源对y 轴的影响
        dz = np.sin(agnle_el)  # 光源对z 轴的影响

        # 设置光源归一化处理
        light = 255 * (dx * light_x + dy * light_y + dz * light_z)
        light = light.clip(0, 255)

        # 重新构建图像
        image = Image.fromarray(light.astype('uint8'))
        image.save(dir_path + '/手绘图像.jpg')
        self.finished.emit(True)
        print('手绘图像绘制完成!')

主要代码块实现都在上面了,需要完整源代码在公众号内回复”手绘图片生成器”下载就好了。

手绘图片生成器:以雪容融为例一键生成

我是 [Python 集中营]、很高兴您看到了最后, 我是一个专注于 Python 知识分享的公众号,希望可以得到您的关注~

【往期精彩呈现】

刚刚出炉的冬奥会吉祥物:冰墩墩,附源码…

最优美的表格查看插件:tabulate

抖音同款课堂点名系统,PyQt5写起来很简单…

开工啦!批量向PDF文件添加中文水印…

大年初二、做了一个windows通知管理器!

百度图片下载器2.0

gif动态图片生成器,多张图片组合后生成动图…

python几个常见的数据处理操作,一行代码就能完成!

过年了,用 PyQt5 生成一副春联吧…

PyQt5 最小化到托盘,升级小闹钟…

Original: https://www.cnblogs.com/lwsbc/p/15884774.html
Author: Python集中营
Title: 手绘图片生成器:以雪容融为例一键生成

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/814988/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 封装一个丝滑的聊天框组件

    需求背景 应公司业务要求,需要做个聊天机器人,要适应不同的业务场景,大概就跟淘宝客服类似,发送消息,机器人自动回复。 话不多说,直接开撸 技术栈: react(hooks写法) +…

    Python 2023年10月7日
    058
  • Pandas常见方法(2)-pandas对数据的预处理

    说明:本blog基于python3, pandas 1.3.5版本 本文主要介绍如何对数据做预处理,包括 缺失值过滤、缺失值补全、数据转换(重复值删除,数据映射、数据替换)、简单运…

    Python 2023年8月6日
    031
  • pd.read_csv报路径不存在

    原因1:读取的目标位置和实际文档位置不符合。 方法:将实际文档(csv文件)放置在目标位置上: 一般若是用pd.read_csv(“xxx.csv”)这种直…

    Python 2023年8月7日
    047
  • 基于meshgrid进行knn模型分类边界可视化

    meshgrid方法 xx,yy = numpy.meshgrid(x,y) meshgrid函数就是用两个坐标轴上的点在平面上画网格(当然这里传入的参数是两个的时候),本质上是用…

    Python 2023年8月28日
    039
  • 基于Flask_admin库,编写个人工作平台详述。

    一、个人工作平台展示 二、搭建过程 1、运行Flask-admin库样例custom-layout 下载代码:https://github.com/flask-admin/flas…

    Python 2023年8月10日
    046
  • Flask的一些简单代码

    FPGA的Flash读写 _代码_可以分为两部分:Flash控制器和SPI接口。 Flash控制器是用来控制Flash存储器的,通过读取或写入数据实现对Flash的读写操作。SPI…

    Python 2023年8月15日
    048
  • scrapy-redis分布式爬虫的使用总结

    scrapy-redis使用总结 因为初次使用这个分布式的 爬虫,踩了不少坑,所以在这里总结一下这个爬虫的使用。 安装模块 scrapy-redis 安装: pip install…

    Python 2023年10月4日
    037
  • python识别文字是否颠倒_pygame中的显示是否颠倒?

    我正在构建一个游戏,在这个游戏中,一个球应该从屏幕的边缘反弹,但是显示表面的rect似乎是颠倒的,因为当球碰到边缘时,代码会打印出另一面(例如,当球碰到底部边缘时,它会打印&#82…

    Python 2023年9月24日
    055
  • scrapy mysql 连接池_爬虫框架scrapy篇四——数据入库(mongodb,mysql)

    这篇将爬虫框架scrapy篇三中的第四步展开来讲,主要讲数据存入mongodb和mysql的不同方法 1、数据存入mongodb 链接MongoDB数据库有两种方法: 1、不需要在…

    Python 2023年10月4日
    036
  • Django实用功能汇总

    文章目录 hello world * 创建django项目 启动 路由 * 主路由 path转换器 请求与响应 – HttpRequest对象 HttpRespond对…

    Python 2023年8月3日
    031
  • 《纳瓦尔宝典》笔记一——你是在跟自己竞争,这是一场单人游戏

    目录 一、身体的健康是top1 二、你唯一拥有的就是时间 三、选择短期内更更痛苦的道路 四、人生早期有三个重大决定 五、从雇佣关系中解脱出来 六、找合作伙伴 七、你真的嫉妒别人吗 …

    Python 2023年9月15日
    040
  • DataFrame(11):时间处理

    时间处理是我们日常工作中遇到的基本问题 1、比较常用的时间处理函数 year 、month、day、hour、minute、second、quarter、dayofweek、day…

    Python 2023年8月21日
    059
  • 使用kubernetes部署flask

    博主vx: haitangyijiusu。很高兴认识你!偶尔带huo,都是精挑细选信得过的产品,欢迎来支持,期待和您相遇! 编写flask-dp.yaml: apiVersion:…

    Python 2023年8月14日
    066
  • Pandas DataFrame的多重索引 MultiIndex

    @创建于:20210813@修改于:20210813 一、创建多级索引二、检索多级索引三、更改索引的层级四、多级索引的值排序(sort_index)五、多级索引汇总统计六、多级索引…

    Python 2023年8月18日
    058
  • 第3课:if、while

    在Python中,井号(#)比较特殊:在代码中,井号后面到行尾的所有内容都将被忽略。下面是一个示例: 这一行为注释。注释让程序更容易理解。注释务必言而有物,不要重复去讲通过代码很容…

    Python 2023年9月19日
    045
  • python爬虫 豆瓣电影数据可视化(Flask框架)部署在服务器上

    文章目录 1. 在宝塔面板下载”python项目管理器” 2. 上传文件至服务器 3. 生成requirements.txt文件 4.在python项目管理…

    Python 2023年8月12日
    055
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球