当前位置: 首页 > 后端技术 > Python

手绘图片生成器:以雪蓉蓉为例,一键生成

时间:2023-03-26 16:40:15 Python

完整源码获取方法请拉到文末![阅读全文]在百度上找了张雪蓉蓉的图片,看看生成手绘图的效果...手绘图生成器可以通过分析导入的彩色图片生成手绘图python分析光源、灰度等操作。整个UI界面部分的代码块,UI界面的设计比较简单。效果如上图所示。classHandImage(QWidget):def__init__(self):super(HandImage,self).__init__()self.init_ui()definit_ui(self):'''UI界面组件和布局:return:'''self.setWindowTitle('手绘图片生成器公众号:[Python集中营]')self.setWindowIcon(QIcon('手绘图标.ico'))self.setFixedWidth(500)self.sou_im_path=QLineEdit()self.sou_im_path...True)QPushButton()self.dir_path_btn.setText('storage')self.dir_path_btn.clicked.connect(self.dir_path_btn_clk)self.start_btn=QPushButton()self.start_btn.setText('开始绘制图像')self.start_btn.点击。连接(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)自我。setLayout(grid)#UI界面上的slot函数defsou_im_path_btn_clk(self):'''选择源图片并设置路径:return:'''im_path=QFileDialog.getOpenFileName(self,os.getcwd(),'Openpicture','ImageFile(*.jpg);;ImageFile(*.png)')self.sou_im_path.setText(im_path[0])defdir_path_btn_clk(self):'''选择存储路径并设置path:return:'''dir_path=QFileDialog.getExistingDirectory(self,os.getcwd(),'selectpath')self.dir_path.setText(dir_path)defstart_btn_clk(self):'''开始按钮绑定槽函数:return:'''self.start_btn.setEnabled(False)self.thread_.start()deffinished(self,finished):'''用于子线程传递完成信号的槽函数:paramfinished:signalvariable:return:'''iffinishedisTrue:self.start_btn。setEnabled(True)用于绘图的第三方库只有两个,主要是Pillow图像处理库,numpy科学计算库用于一些数组计算等操作。将第三方处理库导入代码块fromPILimportImage#图像处理模块importnumpyasnp#科学计算库#PyQt5界面制作及风格,核心组件fromPyQt5.QtGuiimport*fromPyQt5.QtWidgetsimport*fromPyQt5.QtCoreimport*#Applicationbasicoperationrelatedimportsysimportos创建专门手绘图片的子线程类,将UI界面的处理逻辑和生成图片的处理逻辑分离,以免造成无响应的卡死状态.类WorkThread(QThread):finished=pyqtSignal(bool)def__init__(self,parent=None):super(WorkThread,self).__init__(parent)self.parent=parentself.working=Truedef__del__(self):self.working=Falseself.wait()defrun(self):#源图片路径sou_im_path=self.parent.sou_im_path.text().strip()#存储路径dir_path=self.parent.dir_path.text().strip()ifsou_im_path==''ordir_path=='':self.finished.emit(True)return#打开需要转换的图像,并设置好参数,取出一些梯度值参数的主图像。最后,保存数组。vals=np.asarray(Image.open(sou_im_path).convert('L')).astype('float')'''图像参数处理'''depth=12.0#设置初始化深度gray_vals=np.gradient(vals)#提取图像灰度的梯度值gray_x,gray_y=gray_vals#分别提取横坐标和纵坐标的灰度值print('当前横坐标的灰度值:',gray_x)print('的灰度值当前纵坐标Value:',gray_y)#重新设置横坐标和纵坐标的灰度值gray_x=gray_x*depth/100.0gray_y=gray_y*depth/100.0#根据numpy.sqrt()functionSquarerootgray_sqrt=np.sqrt(gray_x**2+gray_y**2+1.0)#重新计算X轴、Y轴、Z轴光源light_x=gray_x/gray_sqrtlight_y=gray_y/gray_sqrtlight_z=1.0/gray_sqrt#计算光源方位角,俯视角agnle_el=np.pi/2.2#俯视角agnle_az=np.pi/4.#方位角angle#分别计算光源对X轴、Y轴、Z轴的影响dx=np.cos(agnle_el)*np.cos(agnle_az)#光源对x轴的影响axisdy=np.cos(agnle_el)*np.sin(agnle_az)#光源对y轴的影响dz=np.sin(agnle_el)#光源对z轴的影响Affect#设置光源归一化处理light=255*(dx*light_x+dy*light_y+dz*light_z)light=light.clip(0,255)#重建图像image=Image.fromarray(light.astype('uint8'))image.save(dir_path+'/hand-paintedimage.jpg')self.finished.emit(True)print('手绘图画好了!')主要代码块在上面实现,完整源码需要内回复公众号《手绘图就下载生成器》我是【Python集中营】,很高兴看到最后,我是专注于Python知识分享的公众号,希望得到大家的关注~[往期精彩介绍】刚刚发布冬奥会吉祥物:冰墩墩,附源码...最美表格视图插件:tabulate抖音同级点名系统,写起来非常简单PyQt5...开始工作!给PDF文件批量添加中文水印……大年初二,做了一个windows通知管理器!百度图片下载器2.0gif动态图片生成器,多张图片组合生成一张动态图片...python中几种常见的数据处理操作,一行代码即可完成!过年,用PyQt5生成对联...PyQt5最小化到托盘,升级小闹钟...