基于Python實(shí)現(xiàn)簡(jiǎn)易的動(dòng)漫圖片轉(zhuǎn)換器
本文旨在制作一個(gè)將普通照片轉(zhuǎn)換成動(dòng)漫圖片的小工具,其中使用opencv的非標(biāo)準(zhǔn)庫實(shí)現(xiàn)對(duì)圖片完成轉(zhuǎn)換。
UI界面的制作使用的還是pyqt5,因?yàn)橛昧?xí)慣了使用起來相當(dāng)方便,接下來還是先將使用到的python非標(biāo)準(zhǔn)庫列舉一下。
#?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ī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)打開文件瀏覽項(xiàng) ????????: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ù), ????????用于啟動(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子線程,子線程這里專門用來實(shí)現(xiàn)對(duì)普通圖片的準(zhǔn)換過程。之所以使用子線程來完成業(yè)務(wù)實(shí)現(xiàn),是因?yàn)橥ǔV苯釉谥骶€程中完成業(yè)務(wù)會(huì)導(dǎo)致主線程異??ㄋ赖那闆r。
單獨(dú)使用子線程來完成業(yè)務(wù)會(huì)保證PyQt5的主線程正常的運(yùn)行,將業(yè)務(wù)實(shí)現(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ù)使用小的雙邊濾波代替一個(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_())
到此這篇關(guān)于基于Python實(shí)現(xiàn)簡(jiǎn)易的動(dòng)漫圖片轉(zhuǎn)換器的文章就介紹到這了,更多相關(guān)Python動(dòng)漫圖片轉(zhuǎn)換器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用pywin32實(shí)現(xiàn)windows模擬鼠標(biāo)及鍵盤動(dòng)作
這篇文章主要介紹了用pywin32實(shí)現(xiàn)windows模擬鼠標(biāo)及鍵盤動(dòng)作的示例,需要的朋友可以參考下2014-04-04淺談keras中自定義二分類任務(wù)評(píng)價(jià)指標(biāo)metrics的方法以及代碼
這篇文章主要介紹了淺談keras中自定義二分類任務(wù)評(píng)價(jià)指標(biāo)metrics的方法以及代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python對(duì)比校驗(yàn)神器deepdiff庫使用詳解
deepdiff模塊常用來校驗(yàn)兩個(gè)對(duì)象是否一致,包含3個(gè)常用類,DeepDiff,DeepSearch和DeepHash,其中DeepDiff最常用,可以對(duì)字典,可迭代對(duì)象,字符串等進(jìn)行對(duì)比,使用遞歸地查找所有差異,本文給大家講解Python對(duì)比校驗(yàn)神器deepdiff庫,感興趣的朋友一起看看吧2023-04-04?Python使用Mediapipe對(duì)圖像進(jìn)行手部地標(biāo)檢測(cè)
本文將以深度庫即Mediapipe為基礎(chǔ)庫,以及其他計(jì)算機(jī)視覺預(yù)處理的CV2庫來制作手部地標(biāo)檢測(cè)模型,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-03-03Python+opencv 實(shí)現(xiàn)圖片文字的分割的方法示例
這篇文章主要介紹了Python+opencv 實(shí)現(xiàn)圖片文字的分割的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07基于Python檢測(cè)動(dòng)態(tài)物體顏色過程解析
這篇文章主要介紹了基于Python檢測(cè)動(dòng)態(tài)物體顏色過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12python實(shí)現(xiàn)將兩個(gè)文件夾合并至另一個(gè)文件夾(制作數(shù)據(jù)集)
這篇文章主要介紹了python實(shí)現(xiàn)將兩個(gè)文件夾合并至另一個(gè)文件夾(制作數(shù)據(jù)集),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python使用conda如何安裝requirement.txt的擴(kuò)展包
這篇文章主要介紹了Python使用conda如何安裝requirement.txt的擴(kuò)展包問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02