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

简介: 看程序员老爸如何机智带娃~

markus-spiske-IFCloi6PYOA-unsplash.jpg

场景介绍

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

目标读者

了解阿里云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中,这会导致函数被无限循环执行)

image.png

 

操作步骤

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

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

image.png

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

image.png

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

image.png

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

image.png

授权角色

image.png

image.png

 

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

image.png

 

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

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

image.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等常用模块,很好的支撑普通开发者快速实现功能,点赞👍🏻:

FC使用OSS触发器SDK:https://help.aliyun.com/document_detail/74765.html

OSS文件下载、上传SDK:https://help.aliyun.com/document_detail/88426.html

FC Python环境内置模块:https://help.aliyun.com/document_detail/158208.html

 

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

image.png

image.png

方案验证

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

image.png

image.png

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

image.png

image.png

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

image.png

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

image.png

 

本文转载自Serverless函数计算征集令优秀征文,

原作者:除却巫山不是云啊

原文地址:https://developer.aliyun.com/article/984500

 

更多精彩内容请关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。

原文链接:https://click.aliyun.com/m/1000354981/ 

本文为阿里云原创内容,未经允许不得转载。

posted @   阿里云云栖号  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2021-08-25 MySQL 深潜 - 一文详解 MySQL Data Dictionary
2021-08-25 日志审计携手DDoS防护助力云上安全
2021-08-25 5分钟搞定AlertManager接入短信、语音等10+种通知渠道
2021-08-25 如何快速搭建云原生企业级数据湖架构及实践分享
2021-08-25 浅谈 Linux 高负载的系统化分析
2020-08-25 阿里云飞天大数据产品价值解读——《一站式高质量搜索开放搜索》
点击右上角即可分享
微信分享提示