乐趣区

关于github:基于-ServerlessOSS-分分钟实现图片秒变素描

简介: 在阿里云 Serverless 函数计算服务中部署一般图片转素描图函数服务,实现将批量上传到指定 OSS 桶内的图片主动转换为素描图并保留到另一个 OSS 桶内

场景介绍

小明接到学校老师安顿的工作,须要批量将班级里同学们拍的一般照片转换为素描图,供课堂游戏应用,于是求助到程序员老爸,机智的程序员老爸分分钟用几行 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 中,这会导致函数被有限循环执行)

操作步骤

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

  1. 选择函数及服务点击“创立服务”,填写名称和形容:
  2. 进入函数治理,点击“创立函数”:

    运行环境抉择 Python 3.6,代码上传形式抉择应用示例代码,申请处理程序类型抉择处理事件申请

    触发器抉择 OSS,Bucket 抉择提前创立好的 sketch-image-input,文件后缀为.jpg,避免其余类型的文件上传后误触发函数执行

    受权角色

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

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

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

    参考代码如下:

    # -*- 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 日志服务,便于调试代码时查看日志,真的很不便😄:

    计划验证

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

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

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

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

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

退出移动版