您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“基于Python如何實(shí)現(xiàn)簡(jiǎn)易的動(dòng)漫圖片轉(zhuǎn)換器”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
效果圖
UI界面的制作使用的還是pyqt5,因?yàn)橛昧?xí)慣了使用起來(lái)相當(dāng)方便,接下來(lái)還是先將使用到的python非標(biāo)準(zhǔn)庫(kù)列舉一下。
# PyQt5相關(guān)模塊 from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * # 動(dòng)漫圖片制作的業(yè)務(wù)模塊 import cv2 import sys import os # 日志模塊 from loguru import logger
制作UI界面,創(chuàng)建CartoonUI類,用于初始化圖片轉(zhuǎn)換器的應(yīng)用。CartoonUI類繼承自QWidget,因?yàn)檫@里只需要制作一個(gè)單頁(yè)面的應(yīng)用,因此,這里只繼承了QWidget。
class CartoonUI(QWidget): def __init__(self): ''' 初始化UI界面應(yīng)用 ''' super(CartoonUI, self).__init__() self.init_ui() def init_ui(self): ''' 自定義實(shí)現(xiàn)的ui應(yīng)用函數(shù) :return: ''' self.setWindowTitle('動(dòng)漫圖片轉(zhuǎn)換器 公眾號(hào):Python 集中營(yíng)') 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('導(dǎo)入源圖片') self.input_image_btn.clicked.connect(self.input_image_btn_click) self.generate_btn = QPushButton() self.generate_btn.setText('一鍵生成動(dòng)漫圖片') 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按鈕綁定的槽函數(shù), 用于實(shí)現(xiàn)打開(kāi)文件瀏覽項(xiàng) :return: ''' im_path = QFileDialog.getOpenFileName(self, os.getcwd(), '打開(kāi)圖片', 'Image File(*.jpg);;Image File(*.png);;Image File(*.jpeg)') self.input_image_path.setText(im_path[0]) def generate_btn_click(self): ''' generate_btn按鈕綁定的槽函數(shù), 用于啟動(dòng)業(yè)務(wù)子線程 :return: ''' self.thread_.start() self.generate_btn.setEnabled(False) def finished(self,finished): ''' 接收子線程中finished變量, 判定子線程業(yè)務(wù)是否執(zhí)行完成,若執(zhí)行完成則將按鈕狀態(tài)改變?yōu)榭牲c(diǎn)擊狀態(tài) :param finished: :return: ''' if finished is True: self.generate_btn.setEnabled(True)
創(chuàng)建WorkThread類,繼承自QThread子線程,子線程這里專門用來(lái)實(shí)現(xiàn)對(duì)普通圖片的準(zhǔn)換過(guò)程。之所以使用子線程來(lái)完成業(yè)務(wù)實(shí)現(xiàn),是因?yàn)橥ǔV苯釉谥骶€程中完成業(yè)務(wù)會(huì)導(dǎo)致主線程異??ㄋ赖那闆r。
單獨(dú)使用子線程來(lái)完成業(yè)務(wù)會(huì)保證PyQt5的主線程正常的運(yùn)行,將業(yè)務(wù)實(shí)現(xiàn)和界面應(yīng)用分離開(kāi)來(lái)。
class WorkThread(QThread): finished = pyqtSignal(bool) def __init__(self, parent=None): ''' 子線程初始化函數(shù) :param parent: ''' super(WorkThread, self).__init__(parent) self.parent = parent self.working = True def __del__(self): ''' 子線程停止函數(shù) :return: ''' self.working = False self.wait() def run(self): ''' 子線程執(zhí)行函數(shù) :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 # 縮減像素采樣的數(shù)目 num_bilateral = 7 # 定義雙邊濾波的數(shù)目 img_rgb = cv2.imread(input_picture_name) # 讀取圖片 # 用高斯金字塔降低取樣 img_color = img_rgb for _ in range(num_down): img_color = cv2.pyrDown(img_color) # 重復(fù)使用小的雙邊濾波代替一個(gè)大的濾波 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) # 轉(zhuǎn)換為灰度并且使其產(chǎn)生中等的模糊 img_gray = cv2.cvtColor(img_color, cv2.COLOR_RGB2GRAY) img_blur = cv2.medianBlur(img_gray, 7) # 檢測(cè)到邊緣并且增強(qiáng)其效果 img_edge = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize=9, C=2) # 轉(zhuǎn)換回彩色圖像 img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) img_cartoon = cv2.bitwise_and(img_color, img_edge) # 保存轉(zhuǎn)換后的圖片 cv2.imwrite(output_picture_name, img_cartoon) logger.info('動(dòng)漫圖片轉(zhuǎn)換完成!') self.finished.emit(True) except Exception as e: logger.error(e)
實(shí)現(xiàn)完成上述所有的業(yè)務(wù)之后,需要使用main函數(shù)將PyQt5應(yīng)用加入到主體循環(huán)中,這樣整個(gè)UI應(yīng)用就直接拉起了。
if __name__ == '__main__': app = QApplication(sys.argv) main = CartoonUI() main.show() sys.exit(app.exec_())
“基于Python如何實(shí)現(xiàn)簡(jiǎn)易的動(dòng)漫圖片轉(zhuǎn)換器”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。