基于 Serverless+OSS 分分钟实现图片秒变素描

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 在阿里云 Serverless 函数计算服务中部署普通图片转素描图的函数服务,实现批量上传到指定 OSS 桶内的图片自动转换为素描图并保存到另一个 OSS 桶内。

作者:除却巫山不是云啊


在阿里云 Serverless 函数计算服务中部署普通图片转素描图的函数服务,实现批量上传到指定 OSS 桶内的图片自动转换为素描图并保存到另一个 OSS 桶内。


场景介绍


小明接到学校老师安排的任务,需要批量将班级里同学们拍的普通照片转换为素描图,供课堂游戏使用,于是求助到程序员老爸,机智的程序员老爸分分钟用几行 Python 代码解决:在阿里云 Serverless 函数计算服务中部署普通图片转素描图函数服务,实现将批量上传到指定 OSS 桶内的图片自动转换为素描图并保存到另一个 OSS 桶内。


1.png


本文适合了解阿里云 Serverless、OSS、函数计算 FC 产品,有一定的云计算实践经验及 Python 编程经验的读者,熟悉阿里云鉴权系统及图片处理 OpenCV 库的个人开发者。


相关概念


Serverless:全称 Serverless computing,即无服务器计算,是云计算的一种新模式,区别于传统的 IaaS、PaaS、SaaS。无服务器运算不代表它真的不需要服务,而是指普通开发者不用过多考虑服务器、App 运行环境及各种周边依赖问题,计算资源真正成为一种服务而不是服务器或者容器。它允许开发者在以管理某个具体功能函数的粒度进行部署及运维管理,以便让开发者专注于核心业务逻辑,更快速地开发应用。


Function Compute:前面讲的 Serverless 是一种抽象层次更高说法,“FaaS + BaaS”是 Serverless 架构模式的一种实现,阿里云 Function Compute 就是典型的 FaaS,配合阿里云丰富的 BaaS(SLS、OSS、RDS 等)服务,可以非常快速的部署应用


函数计算 FC 是一种基于事件驱动的全托管计算服务,用户无需采购与管理服务器等基础设施,只需编写并上传代码。函数计算 FC 使用计算、存储资源,弹性地、可靠地运行任务,并提供日志查询、性能监控和报警等功能。


环境准备


前提条件


1. 已开通阿里云函数计算 FC、OSS、SLS 服务

2. 提前准备好普通图片转换为素描图的 Python 代码

3. 提前准备好测试图片

4. 提前创建好两个测试用的 OSS 桶不能将转换后的图片上传到同一个OSS bucket中,这会导致函数被无限循环执行


2.png


操作步骤


步骤一:创建阿里云函数计算 FC 服务


1. 选择函数及服务点击“创建服务”,填写名称和描述


3.png


2. 进入函数管理,点击“创建函数”


4.png


运行环境选择 Python 3.6,代码上传方式选择使用示例代码,请求处理程序类型选择处理事件请求:


5.png


触发器选择 OSS,Bucket 选择提前创建好的“sketch-image-input”,文件后缀为 .jpg,防止其他类型的文件上传后误触发函数执行。


6.png


授权角色。


7.png


8.png


3. 测试默认提供的 Python 函数,熟悉下基本功能


9.png


步骤二:编写 Python 脚本,实现普通图片转换为素描图函数


1. 在编辑器中,输入提前写好的 Python 代码:


10.png


参考代码如下:


# -*- coding: utf-8 -*-
import cv2
import json
import logging
import oss2
def sketch_image(source_image, target_image):
    # read image
    image = cv2.imread(source_image)
    # sketch image
    grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    invert_image = cv2.bitwise_not(grey_image)
    gaussian_blur_image = cv2.GaussianBlur(invert_image, (7, 7), 0)
    inverse_image = cv2.bitwise_not(gaussian_blur_image)
    sketch_image_result = cv2.divide(grey_image, inverse_image, scale=256.0)
    # save image
    cv2.imwrite(target_image, sketch_image_result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
def handler(event, context):
    logger = logging.getLogger()
    evt = json.loads(event)
    creds = context.credentials
    # Required by OSS sdk
    auth=oss2.StsAuth(
        creds.access_key_id,
        creds.access_key_secret,
        creds.security_token)
    evt = evt['events'][0]
    bucket_name = evt['oss']['bucket']['name']
    endpoint = 'oss-' +  evt['region'] + '.aliyuncs.com'
    bucket_input = oss2.Bucket(auth, endpoint, bucket_name)
    bucket_output = oss2.Bucket(auth, endpoint, 'sketch-image-ouput')
    logger.info('oss endpoint: %s' % endpoint)
    objectName = evt['oss']['object']['key']
    logger.info('oss objectName: %s' % objectName)
    newKey = 'sketch_' + objectName
    # Download image
    source_image = '/tmp/%s' % objectName
    bucket_input.get_object_to_file(objectName, source_image) 
    logger.info('download image %s success.' % source_image)
    # Sketch image
    target_image = '/tmp/%s' % newKey
    sketch_image(source_image, target_image)
    # Upload image
    with open(target_image, 'rb') as fileobj:
        bucket_output.put_object(newKey, fileobj)  
    logger.info('upload image %s success.' % newKey)


函数编写过程中,参考了阿里云提供的 SDK 案例,内容非常丰富,想要的功能都有,且阿里云函数计算 FC 提供的 Python 运行环境内置 OSS、OpenCV 等常用模块,很好的支撑普通开发者快速实现功能,点赞:


[1] 阿里云 FC 使用 OSS 触发器 SDK:

https://help.aliyun.com/document_detail/74765.html 


[2] OSS 文件下载、上传 SDK:

https://help.aliyun.com/document_detail/88426.html 


[3] FC Python 环境内置模块:

https://help.aliyun.com/document_detail/158208.html


2. 部署代码并开通 SLS 日志服务,便于调试代码时查看日志,真的很方便:


11.png


12.png


方案验证


1. 上传本地测试图片到 OSSsketch-image-input 桶中


13.png


14.png


2. 观察函数 sketch_image 调用日志信息及监控信息


15.png


16.png


3. 查看 OSSsketch-image-output 桶内转换后的素描图,效果还不错


17.png


4. 批量上传图片测试,函数功能很稳定


18.png


本文选自“Serverless 函数计算征集令”征文




Serverless Developer Meetup


19.jpeg


2022 阿里云 Serverless Developer Meetup 杭州站火热报名中!


本次沙龙特别邀请到阿里云、高德地图的 Serverless 一线技术专家,分享当前 Serverless 架构 CICD 的最新探索研究;带来 Serverless 在高德业务体系中的降本增效实践;全视角解析 Serverless 原子化能力是如何提升研发效能,增强开发幸福感。更有 Serverless Workshop 等你来玩,手把手带你体验 1 分钟极速部署的乐趣,感受 Severless 算力之美。免费报名即可参加活动,我们准备了超多周边礼品,等你一起来 Serverless!


  • 时间:9月17日(周六)13:00
  • 地点:阿里巴巴西溪园区B区访客中心


点击此处,立即报名!

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
24天前
|
监控 Serverless 测试技术
Serverless 应用引擎常见问题之生成的图片的oss地址配成自定义的域名如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
22 0
|
6月前
|
JavaScript 对象存储
在阿里云OpenAPI 为什么oss 图片链接, 在浏览器访问直接下载了,不是预览呢?
在阿里云OpenAPI 为什么oss 图片链接, 在浏览器访问直接下载了,不是预览呢?
416 1
|
7月前
|
存储 弹性计算 网络安全
搭建基于OSS的图片分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个图片分享网站。
313 0
|
15天前
|
存储 Cloud Native Serverless
云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
阿里云OSS对象存储方案利用函数计算FC,在不同终端请求时实时处理OSS中的原图,减少衍生图存储,降低成本。
|
6月前
|
Java 对象存储
【工具类】使用阿里oss实现图片、视频、文档上传
【工具类】使用阿里oss实现图片、视频、文档上传
222 0
|
2月前
|
域名解析 应用服务中间件 对象存储
解决阿里云oss图片浏览器访问直接下载而不是打开
解决阿里云oss图片浏览器访问直接下载而不是打开
308 0
|
3月前
|
JavaScript Java Serverless
函数计算中,这里是用的curl的方式,如何改用http的post方式请求?还有如何设置oss打包的zip的保存目录?
函数计算中,这里是用的curl的方式,如何改用http的post方式请求?还有如何设置oss打包的zip的保存目录?
157 0
|
4月前
|
Serverless 对象存储 数据安全/隐私保护
在阿里云函数计算(FC)中使用云对象存储服务(OSS)时,需要为FC实例授予对OSS资源的访问权限
在阿里云函数计算(FC)中使用云对象存储服务(OSS)时,需要为FC实例授予对OSS资源的访问权限
370 1
|
4月前
|
Serverless
函数计算FC图生图中,刚生成的图片,在Image Browse不能查看,是什么原因吖?
函数计算FC图生图中,刚生成的图片,在Image Browse不能查看,是什么原因吖?
29 1
|
7月前
|
Serverless 对象存储
用阿里云内容安全处理OSS的违禁图片
原文档,https://help.aliyun.com/document_detail/2400149.html 基于官方的文档做的一些拓展
558 1

相关产品

  • 函数计算