美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽。今天小编就带领大家来借助 Python 和 Flask 来实现一个迷你版的美图秀秀的网页工具,大家只需要通过网页上传需要美颜的图片,然后就可以从网页下载美颜好的图片。
首先我们需要实现的是美图秀秀的功能,在一幅图中,我们看起来的非常粗糙的点,可以视作是一些噪声,而我们就需要借助工具去去除这些噪声,使得图像看起来更加平滑。这里我们采用的是双边滤波来过滤掉这些噪声。双边滤波是将图像的像素点从空间上的邻近程度,和像素值之间的相似程度两个方面去考虑,从而叫做双边,即同时考虑两方面的信息。如下图所示 :
上图中的两点就是我们的两个像素,他们之间的空间距离体现出了邻近程度,而两个像素值的大小(图中的70、80)则是体现出了像素之间的像素值相似度。双边滤波可以很好的保留图像中的边缘细节,使得我们的图像在很好的过滤噪声的同时,使得图像不会过于的失真,也就是使得图像看起来很自然,P的痕迹不明显。import cv2# 可更改value调整滤波的程度value = 28
def Beauty(path, filename): img = cv2.imread(path) img_res = cv2.bilateralFilter(img, value, value * 2, value / 2) filename = './static/out/{}'.format(filename) cv2.imwrite(filename, img_res) return filename
这里我们使用 opencv 中集成的双边滤波算法,这个 value 值表示在过滤的过程中,图像中的每个像素领域的直径范围,这个值越大,图片中的噪声滤除的越好,但是图片看上去也会越像是P过的,而这个值越小,则图片美颜的效果会越差。
这里小编实验得出,28左右时效果比较好,我们使用opencv读入图片,然后将图片进行滤波,将滤波后的图片写入到指定的本地文件中,并将文件的路径返回。下图展示的是美颜前后的图片对比,可以看出,美颜效果还是很好的,只用区区十行代码就可以完成美颜的效果。

接下来我们就来完成 Flask 部分的编写,Flask 是基于 python 的轻量级 Web 应用框架。上手也比较快,核心部分程序如下:@app.route('/', methods=['GET', 'POST'])def index(): return render_template('index.html')
@app.route('/beauty', methods=['GET', 'POST'])def beauty(): if request.method == 'POST': file = request.files['image'] print(file) if file and allowed_file(file.filename): path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) file.save(path) output = Beauty(path, file.filename) print(output) return render_template('index.html', output = output) else: return render_template('index.html', alert = '文件类型必须是图片!') else: return render_template('index.html')
程序中首先调用index函数,并返回我们写好的 index.html 的网页,我们只需点击程序给出的默认链接,便会自动打开网页,如下图所示。

在网页中我们点击选择文件,选择我们需要美颜的图片,然后点击上传,网页便会将我们提交的表单信息返回,程序便会跳转到我们的 beauty 子页面并执行我们写好的 beauty 函数。在函数中,我们首先取出的图片名称,并判断我们上传的图片类型是不是符合我们的要求,然后我们执行之前写好的美颜函数 Beauty,将美颜好的图像进行保存,并返回保存的路径。接着我们再将路径信息提供给网页,网页 html 将访问美颜图片的路径进行显示,效果如下所示:
我们接下来就可以将美颜好的图片进行另存为即可。最后,以视频的形式来展现一下程序的整个流程:
视频展示:
感兴趣的同学可以下载源码进行学习和练习:
链接:
https://pan.baidu.com/s/1gv0F4pDd4fKXK0x0YhzeVw
提取码: 9ec5
注意:运行此项目代码需要安装好 opencv 和 flask 的库。具体方法可参考:
如何安装 Python 的第三方模块
运行代码中的 server.py 文件,并用流览器打开提示的默认地址:
http://127.0.0.1:5000/
即可访问页面。
作者:菜鸟哥
来源:菜鸟学Python
