基于Python實現(xiàn)簡易的動漫圖片轉(zhuǎn)換器
本文旨在制作一個將普通照片轉(zhuǎn)換成動漫圖片的小工具,其中使用opencv的非標準庫實現(xiàn)對圖片完成轉(zhuǎn)換。

UI界面的制作使用的還是pyqt5,因為用習(xí)慣了使用起來相當方便,接下來還是先將使用到的python非標準庫列舉一下。
#?PyQt5相關(guān)模塊 from?PyQt5.QtWidgets?import?* from?PyQt5.QtCore?import?* from?PyQt5.QtGui?import?* #?動漫圖片制作的業(yè)務(wù)模塊 import?cv2 import?sys import?os #?日志模塊 from?loguru?import?logger
制作UI界面,創(chuàng)建CartoonUI類,用于初始化圖片轉(zhuǎn)換器的應(yīng)用。CartoonUI類繼承自QWidget,因為這里只需要制作一個單頁面的應(yīng)用,因此,這里只繼承了QWidget。
class?CartoonUI(QWidget):
????def?__init__(self):
????????'''
????????初始化UI界面應(yīng)用
????????'''
????????super(CartoonUI,?self).__init__()
????????self.init_ui()
????def?init_ui(self):
????????'''
????????自定義實現(xiàn)的ui應(yīng)用函數(shù)
????????:return:
????????'''
????????self.setWindowTitle('動漫圖片轉(zhuǎn)換器??公眾號: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('導(dǎo)入源圖片')
????????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按鈕綁定的槽函數(shù),
????????用于實現(xiàn)打開文件瀏覽項
????????: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按鈕綁定的槽函數(shù),
????????用于啟動業(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擊狀態(tài)
????????:param?finished:
????????:return:
????????'''
????????if?finished?is?True:
????????????self.generate_btn.setEnabled(True)
創(chuàng)建WorkThread類,繼承自QThread子線程,子線程這里專門用來實現(xiàn)對普通圖片的準換過程。之所以使用子線程來完成業(yè)務(wù)實現(xiàn),是因為通常直接在主線程中完成業(yè)務(wù)會導(dǎo)致主線程異常卡死的情況。
單獨使用子線程來完成業(yè)務(wù)會保證PyQt5的主線程正常的運行,將業(yè)務(wù)實現(xiàn)和界面應(yīng)用分離開來。
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ù)使用小的雙邊濾波代替一個大的濾波
????????????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)
????????????#?檢測到邊緣并且增強其效果
????????????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('動漫圖片轉(zhuǎn)換完成!')
????????????self.finished.emit(True)
????????except?Exception?as?e:
????????????logger.error(e)
實現(xiàn)完成上述所有的業(yè)務(wù)之后,需要使用main函數(shù)將PyQt5應(yīng)用加入到主體循環(huán)中,這樣整個UI應(yīng)用就直接拉起了。
if?__name__?==?'__main__': ????app?=?QApplication(sys.argv) ????main?=?CartoonUI() ????main.show() ????sys.exit(app.exec_())
到此這篇關(guān)于基于Python實現(xiàn)簡易的動漫圖片轉(zhuǎn)換器的文章就介紹到這了,更多相關(guān)Python動漫圖片轉(zhuǎn)換器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyTorch解決ModuleNotFoundError: No module named
本文主要介紹了PyTorch解決ModuleNotFoundError: No module named ‘torch’,這個錯誤意味著我們的Python環(huán)境中沒有安裝PyTorch庫,無法正常使用其功能,下面就來具體介紹一下2024-03-03
如何使用Python修改matplotlib.pyplot.colorbar的位置以對齊主圖
使用matplotlib.colors模塊可以完成大多數(shù)常見的任務(wù),下面這篇文章主要給大家介紹了關(guān)于如何使用Python修改matplotlib.pyplot.colorbar的位置以對齊主圖的相關(guān)資料,需要的朋友可以參考下2022-07-07
Python使用gRPC實現(xiàn)數(shù)據(jù)分析能力的共享
gRPC是一個高性能、開源、通用的遠程過程調(diào)用(RPC)框架,由Google推出,本文主要介紹了Python如何使用gRPC實現(xiàn)數(shù)據(jù)分析能力的共享,感興趣的可以了解下2024-02-02
卸載所有通過pip安裝的Python包的方法總結(jié)(Windows系統(tǒng))
這篇文章主要介紹了卸載所有通過pip安裝的Python包的方法總結(jié)(Windows系統(tǒng)),文中通過代碼示例和圖文講解的非常詳細,并具有一定的參考價值,需要的朋友可以參考下2024-08-08
Python使用PySimpleGUI和Pygame編寫一個MP3播放器
這篇文章主要為大家詳細介紹了Python如何使用PySimpleGUI和Pygame編寫一個簡單的MP3播放器,文中的示例代碼講解詳細,感興趣的小伙伴可以學(xué)習(xí)一下2023-11-11

