請(qǐng)滑到文章末尾查看完整源碼的獲取方式!
成都創(chuàng)新互聯(lián)公司專(zhuān)注于網(wǎng)站建設(shè)|網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋成都廣告設(shè)計(jì)等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷(xiāo)售的產(chǎn)品,結(jié)合品牌形象的塑造,量身建設(shè)品質(zhì)網(wǎng)站。
【閱讀全文】
在百度上面找了一個(gè)雪容融的圖片,看一下生成的手繪圖片效果...
手繪圖片生成器可以將導(dǎo)入的彩色圖片通過(guò)python分析光源、灰度等操作生成手繪圖片。
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)都在上面了,需要完整源代碼在公眾號(hào)內(nèi)回復(fù)"手繪圖片生成器"下載就好了。
我是 [Python 集中營(yíng)]、很高興您看到了最后, 我是一個(gè)專(zhuān)注于 Python 知識(shí)分享的公眾號(hào),希望可以得到您的關(guān)注~
【往期精彩呈現(xiàn)】
剛剛出爐的冬奧會(huì)吉祥物:冰墩墩,附源碼...
最優(yōu)美的表格查看插件:tabulate
抖音同款課堂點(diǎn)名系統(tǒng),PyQt5寫(xiě)起來(lái)很簡(jiǎn)單...
開(kāi)工啦!批量向PDF文件添加中文水印...
大年初二、做了一個(gè)windows通知管理器!
百度圖片下載器2.0
gif動(dòng)態(tài)圖片生成器,多張圖片組合后生成動(dòng)圖...
python幾個(gè)常見(jiàn)的數(shù)據(jù)處理操作,一行代碼就能完成!
過(guò)年了,用 PyQt5 生成一副春聯(lián)吧...
PyQt5 最小化到托盤(pán),升級(jí)小鬧鐘...