在日常生活、工作中, 受限于拍照技术、拍摄条件等制约,得到的文本图像往往存在光照不均、角度倾斜、文字模糊等情况。这种低质量的文本图像不仅不利于保存和后续研究,也不利于光学字符识别。为了解决以上问题,特别调研了业内相关的产品,发现腾讯云AI的文本图像增强能力可以很好的打造一个掌上扫描仪。
具体来说,软件底层采用计算机视觉技术,面向文本类图片场景提供图像处理服务,包括切边增强、弯曲矫正、阴影去除、摩尔纹去除等能力,可以有效优化文档类的图片质量,提升文字的清晰度,极大提高了低质量的文本图像的质量;用户操作方便只需要上传需要增强的文本图像,就可以自动处理图像,待图像处理完成后,用户就可以下载增强后的图片。
接下来,我将详细讲述掌上扫描仪的实现过程。
为了使用腾讯云文本图像增强能力,我做了以下几个准备工作。
在使用腾讯云文本图像增强之前,通过腾讯云官网开通文本图像增强服务。
服务开通成功后,腾讯云AI文字识别赠送了免费的资源包,其中文本图像增强1000次免费额度,可以在资源包管理页面查看资源包使用情况。
通过使用我发现在设置页面开通了后付费服务,这样就不用担心资源包耗尽导致调用接口失败了,但是后付费设置每月只能变更一次。
经过使用,我了解到所有文字识别服务的使用情况都可以在控制台中查看使用信息,可以从下图看到统计出当前月份的调用情况、计费情况、成功数、成功率等。
通过以下几个步骤,就可以使用腾讯云AI文字识别的图像增强功能制作掌上扫描仪。
获取个人密钥
查看图像增强API文档
使用腾讯云AI文字识别的图像增强功能制作掌上扫描仪
在腾讯云访问管理的API密钥管理页面,我们新建一个个人密钥。
可以在API Explorer中选择文字图像增强—输入参数—选择需要的语言—即可生成对应语言的API调用代码。
掌上扫描仪产品实现过程中主要分为一下几个步骤:
安装环境依赖的SDK
调用图像增强接口
体验掌上扫描仪的效果
# 安装公共基础包
go get -v -u github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common
# 安装对应的产品包(如 CVM)
go get -v -u github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm
# 一次性下载腾讯云所有产品的包
go get -v -u github.com/tencentcloud/tencentcloud-sdk-go
package imageenhancement
import (
"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)
//读取图片base64
toBase64Str, 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转image
func 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转base64
func imageToBase64(filePath string) (string, error) {
srcByte, err := ioutil.ReadFile(filePath)
if err != nil {
return "", err
}
res := base64.StdEncoding.EncodeToString(srcByte)
return res, nil
}
1)角度矫正
经过角度矫正后,可以从上图中看出,角度矫正后的图片更加凸显文本内容,提高了文本图像的质量。
2)弯曲矫正
经过弯曲矫正后,可以从上图中看出,弯曲矫正后的图片文本更加清晰,提高了文本图像的质量。
3)去除摩尔纹
去除摩尔纹后的图片:
经过去除摩尔纹处理,很大程度的提高了文本图像的清晰度,排除了摩尔纹的干扰,提高了文本图像的质量。
4)去除阴影
经过去除阴影处理,解决了因为环境因素对文本图像质量造成的影响,提高了文本图像的质量。
影响文本图像质量清晰程度有很多因素,室外光照度不均匀会造成图像灰度过于集中;摄像头获得的文本图像经过数/模转换,线路传输时都会产生噪声污染,文本图像质量不可避免降低,轻者表现为文本图像伴有噪点,难于看清文本图像细节;重者文本图像模糊不清,连大概文字轮廓都难以看清。因此,对图像进行分析处理之前,必须对图像进行改善。通过腾讯云AI的文本图像增强创造的掌上扫描仪解决了大部分文本图像不清晰的问题,提高了文本图像的质量。