在日常生活、工作中, 受限于拍照技术、拍摄条件等制约,得到的文本图像往往存在光照不均、角度倾斜、文字模糊等情况。这种低质量的文本图像不仅不利于保存和后续研究,也不利于光学字符识别。为了解决以上问题,特别调研了业内相关的产品,发现腾讯云 AI 的文本图像增强能力可以很好的打造一个掌上扫描仪。具体来说,软件底层采用计算机视觉技术,面向文本类图片场景提供图像处理服务,包括切边增强、弯曲矫正、阴影去除、摩尔纹去除等能力,可以有效优化文档类的图片质量,提升文字的清晰度,极大提高了低质量的文本图像的质量;用户操作方便只需要上传需要增强的文本图像,就可以自动处理图像,待图像处理完成后,用户就可以下载增强后的图片。
接下来,我将详细讲述掌上扫描仪的实现过程。
一、准备工作
为了使用腾讯云文本图像增强能力,我做了以下几个准备工作。
1.1 开通文本图像增强功能
在使用腾讯云文本图像增强之前,通过腾讯云官网开通 文本图像增强 服务。
服务开通成功后,腾讯云 AI 文字识别赠送了免费的资源包,其中文本图像增强1000次免费额度,可以在 资源包管理页面 查看资源包使用情况。



通过使用我发现在设置页面开通了后付费服务,这样就不用担心资源包耗尽导致调用接口失败了,但是后付费设置每月只能变更一次。


1.2 控制台监控信息


二、操作流程
通过以下几个步骤,就可以使用腾讯云 AI 文字识别的图像增强功能制作掌上扫描仪。
获取个人密钥
查看图像增强 API 文档
使用腾讯云 AI 文字识别的图像增强功能制作掌上扫描仪
体验掌上扫描仪的效果
2.1 获取个人密钥
2.2 图像增强 API 接口说明


2.3 使用腾讯云 AI 文字识别的图像增强功能制作掌上扫描仪
掌上扫描仪产品实现过程中主要分为以下几个步骤:
安装环境依赖的 SDK
调用图像增强接口
2.3.1 安装环境依赖的 SDK
# 安装公共基础包go get -v -u github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common# 安装对应的产品包go get -v -u github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm# 一次性下载腾讯云所有产品的包go get -v -u github.com/tencentcloud/tencentcloud-sdk-go
2.3.2 调用图像增强接口
package imageenhancementimport ("encoding/base64""fmt""github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common""github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors""github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"ocr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ocr/v20181119""io/ioutil""os""testing")//MainImageEnhancement 主函数func MainImageEnhancement(imagesPath string) {//图片地址// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取credential := common.NewCredential(//这里填入腾讯云账户密钥对"SecretId","SecretKey",)// 实例化一个client选项,可选的,没有特殊需求可以跳过cpf := profile.NewClientProfile()cpf.HttpProfile.Endpoint = "ocr.tencentcloudapi.com"// 实例化要请求产品的client对象,clientProfile是可选的client, _ := ocr.NewClient(credential, "ap-guangzhou", cpf)//读取图片base64toBase64Str, err := imageToBase64(imagesPath)respImages, err := imageType208(*client, toBase64Str)if err != nil {return}err = writeFile("test.jpg", *respImages)if err != nil {return}}//imageType1 切边增强func imageType1(client ocr.Client, toBase64Str string) (*string, error) {// 实例化一个请求对象,每个接口都会对应一个request对象request := ocr.NewImageEnhancementRequest()request.ImageBase64 = common.StringPtr(toBase64Str)request.ReturnImage = common.StringPtr("preprocess")request.TaskType = common.Int64Ptr(1)// 返回的resp是一个ImageEnhancementResponse的实例,与请求对象对应response, err := client.ImageEnhancement(request)if _, ok := err.(*errors.TencentCloudSDKError); ok {fmt.Printf("An API error has returned: %s", err)return nil, err}if err != nil {return nil, err}return response.Response.Image, nil}//imageType2 弯曲矫正func imageType2(client ocr.Client, toBase64Str string) (*string, error) {// 实例化一个请求对象,每个接口都会对应一个request对象request := ocr.NewImageEnhancementRequest()request.ImageBase64 = common.StringPtr(toBase64Str)request.ReturnImage = common.StringPtr("preprocess")request.TaskType = common.Int64Ptr(2)// 返回的resp是一个ImageEnhancementResponse的实例,与请求对象对应response, err := client.ImageEnhancement(request)if _, ok := err.(*errors.TencentCloudSDKError); ok {fmt.Printf("An API error has returned: %s", err)return nil, err}if err != nil {return nil, err}return response.Response.Image, nil}//imageType202 黑白模式func imageType202(client ocr.Client, toBase64Str string) (*string, error) {// 实例化一个请求对象,每个接口都会对应一个request对象request := ocr.NewImageEnhancementRequest()request.ImageBase64 = common.StringPtr(toBase64Str)request.ReturnImage = common.StringPtr("preprocess")request.TaskType = common.Int64Ptr(202)// 返回的resp是一个ImageEnhancementResponse的实例,与请求对象对应response, err := client.ImageEnhancement(request)if _, ok := err.(*errors.TencentCloudSDKError); ok {fmt.Printf("An API error has returned: %s", err)return nil, err}if err != nil {return nil, err}return response.Response.Image, nil}... //这里省略重复的部分,可以扩展其他模式或者任意模式组合//writeFile base64转imagefunc writeFile(path string, s string) error {//解析base64字符串dist, _ := base64.StdEncoding.DecodeString(s)//写入新文件f, _ := os.OpenFile(path, os.O_RDWR|os.O_CREATE, os.ModePerm)defer f.Close()_, err := f.Write(dist)return err}//imageToBase64 img转base64func imageToBase64(filePath string) (string, error) {srcByte, err := ioutil.ReadFile(filePath)if err != nil {return "", err}res := base64.StdEncoding.EncodeToString(srcByte)return res, nil}
2.4 体验掌上扫描仪的效果
1)角度矫正
原始图片 | 切边增强后图片 |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
经过角度矫正后,可以从上图中看出,角度矫正后的图片更加凸显文本内容,提高了文本图像的质量。
2)弯曲矫正
原始图片 | 矫正后图像 |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
经过弯曲矫正后,可以从上图中看出,弯曲矫正后的图片文本更加清晰,提高了文本图像的质量。
3)去除摩尔纹
原始图片 | 去除摩尔纹后的图片 |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
经过去除摩尔纹处理,很大程度的提高了文本图像的清晰度,排除了摩尔纹的干扰,提高了文本图像的质量。
4)去除阴影
原始图片 | 去除阴影后的图片 |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
经过去除阴影处理,解决了因为环境因素对文本图像质量造成的影响,提高了文本图像的质量。
三、总结
影响文本图像质量清晰程度有很多因素,室外光照度不均匀会造成图像灰度过于集中;摄像头获得的文本图像经过数/模转换,线路传输时都会产生噪声污染,文本图像质量不可避免降低,轻者表现为文本图像伴有噪点,难于看清文本图像细节;重者文本图像模糊不清,连大概文字轮廓都难以看清。因此,对图像进行分析处理之前,必须对图像进行改善。通过腾讯云AI的文本图像增强创造的掌上扫描仪解决了大部分文本图像不清晰的问题,提高了文本图像的质量。