Python小程序——将彩色图片转变为手绘效果

简介

Python有着强大的功能,其中Numpy库可以以点的方式画图,还有一种妙用就是改变图片
该程序主要代码来源于MOOC,想学习完整过程戳这里>>MOOC嵩天
我跟着视频敲了这个程序的主要代码(使用的pycharm),然后添加了一些内容打包了一个.exe文件,需要的话自行下载

库缺少请自行搜索下载

上代码

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 24 13:07:31 2019

@author: 隰有游龙
"""

from PIL import Image
from numpy import asarray,gradient,pi,sin,cos,sqrt
from tkinter.filedialog import askopenfilename, asksaveasfilename
from tkinter.messagebox import showinfo, showerror
from os import path
from tkinter import Tk

root = Tk() 
root.withdraw()  
default_dir = r"文件路径"
file_path = askopenfilename(title=u'选择文件', initialdir=(path.expanduser(default_dir)))
if file_path:
    try:
        last = path.splitext(file_path)[-1]
        Last = last[1:].upper()
        
        #来源MOOC嵩天 
        a = asarray(Image.open(file_path).convert('L')).astype('float')
        depth = 10.                      # (0-100)
        grad = gradient(a)             #取图像灰度的梯度值
        grad_x, grad_y = grad               #分别取横纵图像梯度值
        grad_x = grad_x*depth/100.
        grad_y = grad_y*depth/100.
        A = sqrt(grad_x**2 + grad_y**2 + 1.)
        uni_x = grad_x/A
        uni_y = grad_y/A
        uni_z = 1./A
         
        vec_el = pi/2.2                   # 光源的俯视角度,弧度值
        vec_az = pi/4.                    # 光源的方位角度,弧度值
        dx = cos(vec_el)*cos(vec_az)   #光源对x 轴的影响
        dy = cos(vec_el)*sin(vec_az)   #光源对y 轴的影响
        dz = sin(vec_el)              #光源对z 轴的影响
         
        b = 255*(dx*uni_x + dy*uni_y + dz*uni_z)     #光源归一化
        b = b.clip(0,255)
         
        im = Image.fromarray(b.astype('uint8'))  #重构图像
        showinfo('提示','修改完成!')
        fname = asksaveasfilename(title=u'保存文件', filetypes=[(Last,last)])
        im.save(str(fname) + last)
    except:
        showerror('错误','无法修改所选文件!')

上效果图(网上随便找的图)

在这里插入图片描述在这里插入图片描述

一次变化效果最好,多次会重影(感觉建筑效果比较好)
至于这个打包文件这么大我也不知道该这么办(求大佬指教)
但是用来装个***还是很好用的(记得提前看效果,失败概不负责)

发布了30 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44616044/article/details/101021628