Python 烧瓶上传灰度图像

Python 烧瓶上传灰度图像,python,flask,Python,Flask,我在学习烧瓶。当我选择一个图像文件时,我想通过cv2转换该图像的灰度。但是cv2.imread无法读取变量。我创建新函数还是添加一些代码行?我认为html没有什么可以改变的 app.py 从flask导入flask,呈现模板,请求,重定向,url,从目录发送 从werkzeug.utils导入安全文件名 导入操作系统 文件夹\u PATH=os.PATH.join('C:\\Users\\teran\\Desktop\\Ps\u Sd\\uploads\\')) 允许的扩展名=set(['png

我在学习烧瓶。当我选择一个图像文件时,我想通过cv2转换该图像的灰度。但是
cv2.imread
无法读取变量。我创建新函数还是添加一些代码行?我认为html没有什么可以改变的 app.py

从flask导入flask,呈现模板,请求,重定向,url,从目录发送
从werkzeug.utils导入安全文件名
导入操作系统
文件夹\u PATH=os.PATH.join('C:\\Users\\teran\\Desktop\\Ps\u Sd\\uploads\\'))
允许的扩展名=set(['png','png','jpg','jpeg'])
app=烧瓶(名称)
app.config['UPLOAD\u FOLDER']=文件夹路径
允许的def_文件(文件名):
在文件名和\
允许的扩展名中的filename.rsplit('.',1)[1]
@app.route('/',方法=['GET','POST'])
def upload_文件():
如果request.method==“POST”:
file=request.files['file']
如果文件和允许的文件(file.filename):
filename=secure\u文件名(file.filename)
保存(os.path.join(app.config['UPLOAD\u FOLDER'],文件名))
返回重定向(url_for('uploaded_file',filename=filename))
返回呈现模板('upload.html')
@app.route(“/show/”)
def上传文件(文件名):
filename='1http://localhost:5000/uploads/“+文件名
返回渲染模板('upload.html',filename=filename)
@app.route(“/uploads/”)
def发送文件(文件名):
从目录返回发送目录(文件夹路径,文件名)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run(debug=True)

您需要使用
cv2.imdecode
功能,如中所述,然后使用
c2.imencode
将其返回到可写流

因此,我将创建一个函数来创建灰度图像,如下所示:

import cv2
import numpy as np

def make_grayscale(in_stream):
    # Credit: https://stackoverflow.com/a/34475270

    #use numpy to construct an array from the bytes
    arr = np.fromstring(in_stream, dtype='uint8')

    #decode the array into an image
    img = cv2.imdecode(arr, cv2.IMREAD_UNCHANGED)

    # Make grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    _, out_stream = cv2.imencode('.PNG', gray)

    return out_stream
然后,如果您想在上载时将该图像更改为灰度(将其以灰度保存在服务器上),您可以修改上载代码,使其看起来更像:

# ...
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file_data = make_grayscale(file.read())

            with open(os.path.join(app.config['UPLOAD_FOLDER'], filename),
                      'wb') as f:
                f.write(file_data)

            return redirect(url_for('uploaded_file', filename=filename))
# ...
另一方面,您可能应该知道,使用最初上传的文件名命名文件可能会导致以后的问题,我已经在另一个关于此问题的答案中介绍了这一点

# ...
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file_data = make_grayscale(file.read())

            with open(os.path.join(app.config['UPLOAD_FOLDER'], filename),
                      'wb') as f:
                f.write(file_data)

            return redirect(url_for('uploaded_file', filename=filename))
# ...