最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+PyQT5實(shí)現(xiàn)手繪圖片生成器

 更新時(shí)間:2022年02月15日 08:34:51   作者:Python 集中營(yíng)  
這篇文章主要介紹了利用Python PyQT5制作一個(gè)手繪圖片生成器,可以將導(dǎo)入的彩色圖片通過(guò)python分析光源、灰度等操作生成手繪圖片。感興趣的可以跟隨小編一起了解一下

手繪圖片生成器可以將導(dǎo)入的彩色圖片通過(guò)python分析光源、灰度等操作生成手繪圖片。

file

UI界面的整體部分代碼塊,UI界面的設(shè)計(jì)比較簡(jiǎn)單。效果在上面的圖片展示。

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

    def init_ui(self):
        '''
        UI界面組件及布局
        :return:
        '''
        self.setWindowTitle('手繪圖片生成器   公眾號(hào):[Python 集中營(yíng)]')
        self.setWindowIcon(QIcon('手繪圖標(biāo).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('存儲(chǔ)')
        self.dir_path_btn.clicked.connect(self.dir_path_btn_clk)

        self.start_btn = QPushButton()
        self.start_btn.setText('開(kāi)始繪制圖像')
        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界面上的槽函數(shù)

    def sou_im_path_btn_clk(self):
        '''
        選擇源圖片并設(shè)置路徑
        :return:
        '''
        im_path = QFileDialog.getOpenFileName(self, os.getcwd(), '打開(kāi)圖片', 'Image File(*.jpg);;Image File(*.png)')
        self.sou_im_path.setText(im_path[0])

    def dir_path_btn_clk(self):
        '''
        選擇存儲(chǔ)路徑并設(shè)置路徑
        :return:
        '''
        dir_path = QFileDialog.getExistingDirectory(self, os.getcwd(), '選擇路徑')
        self.dir_path.setText(dir_path)

    def start_btn_clk(self):
        '''
        開(kāi)始按鈕綁定的槽函數(shù)
        :return:
        '''
        self.start_btn.setEnabled(False)
        self.thread_.start()

    def finished(self, finished):
        '''
        用于子線程傳遞完成信號(hào)的槽函數(shù)
        :param finished: 信號(hào)變量
        :return:
        '''
        if finished is True:
            self.start_btn.setEnabled(True)

其中繪圖用到的第三方庫(kù)只有兩個(gè),主要的還是Pillow圖像處理庫(kù),還有就是numpy科學(xué)計(jì)算庫(kù)用于一些數(shù)組計(jì)算等的操作。

將第三方的處理庫(kù)導(dǎo)入到代碼塊中

from PIL import Image  # 圖像處理模塊
import numpy as np  # 科學(xué)計(jì)算庫(kù)

# PyQt5界面制作及樣式、核心組件
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

# 應(yīng)用基礎(chǔ)操作相關(guān)
import sys
import os

創(chuàng)建用于專(zhuān)門(mén)手繪圖像的子線程類(lèi),將UI界面的處理邏輯和生成圖像的處理邏輯分開(kāi)不至于產(chǎn)生無(wú)響應(yīng)的卡死狀態(tài)。

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()
        # 存儲(chǔ)路徑
        dir_path = self.parent.dir_path.text().strip()
        if sou_im_path == '' or dir_path == '':
            self.finished.emit(True)
            return
        # 打開(kāi)需要進(jìn)行轉(zhuǎn)的圖像,并進(jìn)行參數(shù)設(shè)置,取出來(lái)的參數(shù)主要圖像的一些梯度值。最后進(jìn)行數(shù)組保存。
        vals = np.asarray(Image.open(sou_im_path).convert('L')).astype('float')

        '''圖像參數(shù)處理'''
        depth = 12.0  # 設(shè)置初始化深度
        gray_vals = np.gradient(vals)  # 提取圖像灰度的梯度值
        gray_x, gray_y = gray_vals  # 單獨(dú)提取橫坐標(biāo)與縱坐標(biāo)的灰度值
        print('當(dāng)前橫坐標(biāo)的灰度值:', gray_x)
        print('當(dāng)前縱坐標(biāo)的灰度值:', gray_y)

        # 重新設(shè)置橫坐標(biāo)合縱坐標(biāo)的灰度值
        gray_x = gray_x * depth / 100.0
        gray_y = gray_y * depth / 100.0

        # 根據(jù)numpy.sqrt()函數(shù)計(jì)算橫坐標(biāo)和縱坐標(biāo)灰度值的平方根
        gray_sqrt = np.sqrt(gray_x ** 2 + gray_y ** 2 + 1.0)

        # 重新計(jì)算X軸、Y軸、Z軸的光源
        light_x = gray_x / gray_sqrt
        light_y = gray_y / gray_sqrt
        light_z = 1.0 / gray_sqrt

        # 計(jì)算光源的方位角度、俯視角度
        agnle_el = np.pi / 2.2  # 俯視角度
        agnle_az = np.pi / 4.  # 方位角度

        # 分別計(jì)算光源對(duì)X軸、Y軸、Z軸的影響
        dx = np.cos(agnle_el) * np.cos(agnle_az)  # 光源對(duì)x 軸的影響
        dy = np.cos(agnle_el) * np.sin(agnle_az)  # 光源對(duì)y 軸的影響
        dz = np.sin(agnle_el)  # 光源對(duì)z 軸的影響

        # 設(shè)置光源歸一化處理
        light = 255 * (dx * light_x + dy * light_y + dz * light_z)
        light = light.clip(0, 255)

        # 重新構(gòu)建圖像
        image = Image.fromarray(light.astype('uint8'))
        image.save(dir_path + '/手繪圖像.jpg')
        self.finished.emit(True)
        print('手繪圖像繪制完成!')

主要代碼塊實(shí)現(xiàn)都在上面了,下面將展示完整的代碼

完整代碼

# -*- coding:utf-8 -*-
# @author Python 集中營(yíng)
# @date 2022/2/10
# @file test2.py

# done

# 手繪圖片生成器:以雪容融為例一鍵生成...

# 手繪圖片生成器可以將導(dǎo)入的彩色圖片通過(guò)python分析光源、灰度等操作生成手繪圖片。

# 其中繪圖用到的第三方庫(kù)只有兩個(gè),主要的還是Pillow圖像處理庫(kù),還有就是numpy科學(xué)計(jì)算庫(kù)用于一些數(shù)組計(jì)算等的操作。

# 將第三方的處理庫(kù)導(dǎo)入到代碼塊中
from PIL import Image  # 圖像處理模塊
import numpy as np  # 科學(xué)計(jì)算庫(kù)

# PyQt5界面制作及樣式、核心組件
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

# 應(yīng)用基礎(chǔ)操作相關(guān)
import sys
import os

# 創(chuàng)建用于專(zhuān)門(mén)手繪圖像的子線程類(lèi),將UI界面的處理邏輯和生成圖像的處理邏輯分開(kāi)不至于產(chǎn)生無(wú)響應(yīng)的卡死狀態(tài)。
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()
        # 存儲(chǔ)路徑
        dir_path = self.parent.dir_path.text().strip()
        if sou_im_path == '' or dir_path == '':
            self.finished.emit(True)
            return
        # 打開(kāi)需要進(jìn)行轉(zhuǎn)的圖像,并進(jìn)行參數(shù)設(shè)置,取出來(lái)的參數(shù)主要圖像的一些梯度值。最后進(jìn)行數(shù)組保存。
        vals = np.asarray(Image.open(sou_im_path).convert('L')).astype('float')

        '''圖像參數(shù)處理'''
        depth = 12.0  # 設(shè)置初始化深度
        gray_vals = np.gradient(vals)  # 提取圖像灰度的梯度值
        gray_x, gray_y = gray_vals  # 單獨(dú)提取橫坐標(biāo)與縱坐標(biāo)的灰度值
        print('當(dāng)前橫坐標(biāo)的灰度值:', gray_x)
        print('當(dāng)前縱坐標(biāo)的灰度值:', gray_y)

        # 重新設(shè)置橫坐標(biāo)合縱坐標(biāo)的灰度值
        gray_x = gray_x * depth / 100.0
        gray_y = gray_y * depth / 100.0

        # 根據(jù)numpy.sqrt()函數(shù)計(jì)算橫坐標(biāo)和縱坐標(biāo)灰度值的平方根
        gray_sqrt = np.sqrt(gray_x ** 2 + gray_y ** 2 + 1.0)

        # 重新計(jì)算X軸、Y軸、Z軸的光源
        light_x = gray_x / gray_sqrt
        light_y = gray_y / gray_sqrt
        light_z = 1.0 / gray_sqrt

        # 計(jì)算光源的方位角度、俯視角度
        agnle_el = np.pi / 2.2  # 俯視角度
        agnle_az = np.pi / 4.  # 方位角度

        # 分別計(jì)算光源對(duì)X軸、Y軸、Z軸的影響
        dx = np.cos(agnle_el) * np.cos(agnle_az)  # 光源對(duì)x 軸的影響
        dy = np.cos(agnle_el) * np.sin(agnle_az)  # 光源對(duì)y 軸的影響
        dz = np.sin(agnle_el)  # 光源對(duì)z 軸的影響

        # 設(shè)置光源歸一化處理
        light = 255 * (dx * light_x + dy * light_y + dz * light_z)
        light = light.clip(0, 255)

        # 重新構(gòu)建圖像
        image = Image.fromarray(light.astype('uint8'))
        image.save(dir_path + '/手繪圖像.jpg')
        self.finished.emit(True)
        print('手繪圖像繪制完成!')


# UI界面的整體部分代碼塊,UI界面的設(shè)計(jì)比較簡(jiǎn)單。效果在下面的圖片展示。

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

    def init_ui(self):
        '''
        UI界面組件及布局
        :return:
        '''
        self.setWindowTitle('手繪圖片生成器   公眾號(hào):[Python 集中營(yíng)]')
        self.setWindowIcon(QIcon('手繪圖標(biāo).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('存儲(chǔ)')
        self.dir_path_btn.clicked.connect(self.dir_path_btn_clk)

        self.start_btn = QPushButton()
        self.start_btn.setText('開(kāi)始繪制圖像')
        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界面上的槽函數(shù)

    def sou_im_path_btn_clk(self):
        '''
        選擇源圖片并設(shè)置路徑
        :return:
        '''
        im_path = QFileDialog.getOpenFileName(self, os.getcwd(), '打開(kāi)圖片', 'Image File(*.jpg);;Image File(*.png)')
        self.sou_im_path.setText(im_path[0])

    def dir_path_btn_clk(self):
        '''
        選擇存儲(chǔ)路徑并設(shè)置路徑
        :return:
        '''
        dir_path = QFileDialog.getExistingDirectory(self, os.getcwd(), '選擇路徑')
        self.dir_path.setText(dir_path)

    def start_btn_clk(self):
        '''
        開(kāi)始按鈕綁定的槽函數(shù)
        :return:
        '''
        self.start_btn.setEnabled(False)
        self.thread_.start()

    def finished(self, finished):
        '''
        用于子線程傳遞完成信號(hào)的槽函數(shù)
        :param finished: 信號(hào)變量
        :return:
        '''
        if finished is True:
            self.start_btn.setEnabled(True)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = HandImage()
    main.show()
    sys.exit(app.exec_())

以上就是Python+PyQT5實(shí)現(xiàn)手繪圖片生成器的詳細(xì)內(nèi)容,更多關(guān)于Python PyQT5手繪圖片生成器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Anaconda虛擬環(huán)境中安裝cudatoolkit和cudnn包并配置pytorch-gpu的配置教程

    Anaconda虛擬環(huán)境中安裝cudatoolkit和cudnn包并配置pytorch-gpu的配置教程

    這篇文章詳細(xì)介紹了如何在Anaconda虛擬環(huán)境中安裝和配置TensorFlow,特別是針對(duì)CUDA和cuDNN的版本管理,文章首先解釋了為什么需要更新TensorFlow版本,然后指導(dǎo)如何創(chuàng)建新的虛擬環(huán)境,需要的朋友可以參考下
    2025-02-02
  • windows安裝TensorFlow和Keras遇到的問(wèn)題及其解決方法

    windows安裝TensorFlow和Keras遇到的問(wèn)題及其解決方法

    這篇文章主要介紹了windows安裝TensorFlow和Keras遇到的問(wèn)題及其解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python?Pyramid框架應(yīng)用場(chǎng)景及高級(jí)特性實(shí)戰(zhàn)

    Python?Pyramid框架應(yīng)用場(chǎng)景及高級(jí)特性實(shí)戰(zhàn)

    Pyramid是一個(gè)靈活且強(qiáng)大的Python?web框架,廣泛用于構(gòu)建各種規(guī)模的Web應(yīng)用程序,本文將深度探索Pyramid框架,介紹其核心概念、應(yīng)用場(chǎng)景以及一些高級(jí)特性
    2023-12-12
  • python中_del_還原數(shù)據(jù)的方法

    python中_del_還原數(shù)據(jù)的方法

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python中_del_還原數(shù)據(jù)的方法,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Python中的 any() 函數(shù)和 all() 函數(shù)

    Python中的 any() 函數(shù)和 all() 函數(shù)

    這篇文章主要介紹了Python中的 any() 函數(shù)和 all() 函數(shù),文章基于Python的相關(guān)資料展開(kāi)對(duì) any 和 all() 函數(shù)的語(yǔ)法詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • Python中的迭代器詳解

    Python中的迭代器詳解

    這篇文章主要介紹迭代器,看完文章你可以了解到什么是可迭代對(duì)象、啥是迭代器、如何自定義迭代器、使用迭代器的優(yōu)勢(shì),文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • Pygame實(shí)戰(zhàn)之迷宮游戲的實(shí)現(xiàn)

    Pygame實(shí)戰(zhàn)之迷宮游戲的實(shí)現(xiàn)

    玩迷宮游戲長(zhǎng)大的我們,欣慰地看到,下一代仍熱愛(ài)著這個(gè)經(jīng)典游戲。本文將通過(guò)Python中的Pygame庫(kù)制作這一經(jīng)典的游戲,需要的可以參考一下
    2022-02-02
  • Python中過(guò)濾字符串列表的方法

    Python中過(guò)濾字符串列表的方法

    這篇文章主要介紹了Python中過(guò)濾字符串列表的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • cv2.imread?和?cv2.imdecode?用法及區(qū)別

    cv2.imread?和?cv2.imdecode?用法及區(qū)別

    對(duì)于路徑中含有中文的圖像,直接用cv2.imread讀取會(huì)報(bào)錯(cuò),上次看到有大佬使用cv2.imdecode就可以正常讀取,有點(diǎn)好奇,所以今天來(lái)記錄下二者用法和區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • python庫(kù)geopy計(jì)算多組經(jīng)緯度距離的實(shí)現(xiàn)方式

    python庫(kù)geopy計(jì)算多組經(jīng)緯度距離的實(shí)現(xiàn)方式

    這篇文章主要介紹了python庫(kù)geopy計(jì)算多組經(jīng)緯度距離的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論

澜沧| 通城县| 洛宁县| 铜山县| 赣榆县| 林西县| 瑞丽市| 武威市| 龙川县| 南皮县| 陆丰市| 夏河县| 昌宁县| 恩平市| 沙河市| 溧水县| 伽师县| 英山县| 临江市| 屏东县| 双江| 赞皇县| 南召县| 庆元县| 云和县| 米林县| 贺兰县| 伊金霍洛旗| 深圳市| 五台县| 汝阳县| 南郑县| 渭南市| 瑞金市| 阜新市| 永福县| 沙田区| 乌拉特中旗| 青田县| 桂林市| 谢通门县|