python图片怎么实现转码_python实现简单图片文字识别翻译OCR

news/2024/7/24 13:36:37 标签: python图片怎么实现转码
688075d1760c0c4aef3a7d3571d2f844.png

场景描述

实现类似微信扫一扫中翻译功能,即拍照商品,一般为英语、韩语、日语等商品描述,进行文字识别后,进行在线翻译。

18c5c0efa81dde67cd54aa5362d47cc1.png

图片识别翻译前

1c51afecdc23d1ecc60b38535f88d356.png

图片识别翻译后

第一步引入所需要的库

from PIL import ImageFontfrom PIL import Imagefrom PIL import ImageDrawimport hashlibfrom urllib import parsefrom urllib import requestimport randomimport base64import json

第二步图片文字识别ocr(翻译)

文字识别(Optical Character Recognition,OCR),简单讲就是识别出图片中包含的文字信息。由于这是个很深的一个领域(贫道修行尚欠),有兴趣的可以关注下第三方框架openCV,在这里简单通过第三方接口有道智云来实现,其他如百度等也都有免费的接口提供。之所以选有道,主要考虑是一般仅支持一个外文翻译为中文,有道智云相对而言多种一起识别,其次直接就帮我翻译成中文了,比较简单直接上代码。

# 替换成您的应用IDappKey = "29df4hs2342"# 替换您的应用密钥appSecret = "9bPJj8Lh7933hlJHGOLJDSocTRh"# 参数部分f = open(r'd_4.png', 'rb') # 二进制方式打开图文件q = base64.b64encode(f.read()) # 读取文件内容,转换为base64编码q = q.decode('UTF-8', 'strict')f.close()# 源语言fromLan = "en"# 目标语言to = "zh-CHS"# 上传类型type = "1"# 随机数,自己随机生成,建议时间戳salt = random.randint(1, 65536)# 签名sign = appKey + q + str(salt) + appSecretm1 = hashlib.md5()m1.update(sign.encode("utf8"))sign = m1.hexdigest()data = {'appKey': appKey, 'q': q, 'from': fromLan, 'to': to, 'type': type, 'salt': str(salt), 'sign': sign}data = parse.urlencode(data).encode(encoding='UTF8')req = request.Request('http://openapi.youdao.com/ocrtransapi', data)response = request.urlopen(req)res = response.read()res = json.loads(res, encoding='utf-8')resRegions = res['resRegions']# 输出识别内容for i in resRegions: print(i)

第三步根据定位替换图片文字

这一步主要涉及python的PIL库,这个库很强大,主要用于图片的各种处理,可以自行根据python版本进行安装,python2.X和python3.X会有稍微区别。

# 绘制图片def dw(boundingBox, linesCount, lineheight, tranContent): # 文本box起点x,y,宽,高 x, y, w, h = boundingBox.split(',') x = int(x) y = int(y) w = int(w) h = int(h) # 设置字体字号 word_size = int(lineheight) word_css = "msyh.ttf" font = ImageFont.truetype(word_css, word_size) # 绘制文字 W, H = font.getsize(tranContent) # 文字总长和高 if W > w and int(linesCount) > 1: word_len = len(tranContent) r = w / W limit = int(w / word_size) i = limit tranContent = list(tranContent) while i < word_len: tranContent.insert(i, '') i += limit + 1 tranContent = ''.join(tranContent) X = x + w Y = y + h # 绘制矩形 draw.rectangle((x, y, X, Y), 'yellowgreen', 'wheat') draw.text((x, y), tranContent, 'DimGrey', font=font)if __name__ == "__main__": im = Image.open('d_4.png') textAngle = res['textAngle'] imNew = im.rotate(float(textAngle)) draw = ImageDraw.Draw(imNew) for resRegion in resRegions: boundingBox = resRegion['boundingBox'] linesCount = resRegion['linesCount'] lineheight = resRegion['lineheight'] tranContent = resRegion['tranContent'] dw(boundingBox, linesCount, lineheight, tranContent) imNew = imNew.rotate(-float(textAngle)) del draw # im.save('test.png') imNew.show() imNew.close()

小结

以上代码放在一起就可以跑通,代码写的比较稀碎,只是简单实现这么一个图片文字识别翻译的场景,有兴趣的可以自行研究下OCR实现。


http://www.niftyadmin.cn/n/840825.html

相关文章

matlab图像目标与背景分离_图像处理中的代数运算及几何变换

点击蓝字关注我们图像运算是图像处理中常用的处理方法&#xff0c;它以图像为单位进行操作&#xff0c;运算的结果是一副新的图像&#xff0c;常常用于图像的高级处理(如图像分割&#xff0c;目标的检测和识别等)的前期处理。具体的图像运算包括点运算&#xff0c;代数运算&…

RabbitMQ 安装配置与管理

安装 安装erlang虚拟机 Rabbitmq基于erlang语言开发&#xff0c;所有需要安装erlang虚拟机 #wget http://www.erlang.org/download/otp_src_R15B01.tar.gz #tar zxvf otp_src_R15B01.tar.gz && cd otp_src_R15B01 #./configure && make install 安装rabbitmq …

注解报错_工作经验|async 注解失效的原因以及如何在async中拿到request

失效原因Application启动类中没有添加EnableAsync注解开启异步&#xff1b;添加async注解的方法和当前调用者在同一个类中&#xff0c;会导致async失效&#xff1b;使用了async注解后&#xff0c;导致应用出现循环依赖的报错解决办法&#xff1a;将async注解的方法移到一个新的…

判断两个时间段是否有交集_判断两个人是否处于“暧昧关系”,就看这3个细节,注意观察...

你是不是会有这样一种疑惑&#xff1f;明明你们有着比朋友更为亲密的关系&#xff0c;你们会用专属于自己的称号去称呼对方&#xff0c;会每天和对方保持密切的联系。对方和异性之间走得近了你还会吃醋&#xff0c;你们所有的举动都和恋人有挂钩&#xff0c;可是&#xff0c;你…

我的第一个python web开发框架(16)——产品分类管理

产品分类管理的html页面之前忘记做了&#xff0c;这次附件里补上。 好了先上图 从页面效果图来看&#xff0c;我们需要开发列表获取接口、添加接口、单条记录获取接口、编辑接口和删除接口 对于产品分类列表&#xff0c;我们将使用jqgrid前端表格框架&#xff0c;jqgrid与接口交…

给array添加元素_C++语言中std::array的神奇用法总结

(给CPP开发者加星标&#xff0c;提升C/C技能)来源&#xff1a;飞得乐https://bbs.huaweicloud.com/blogs/214624std::array是在C11标准中增加的STL容器&#xff0c;它的设计目的是提供与原生数组类似的功能与性能。也正因此&#xff0c;使得std::array有很多与其他容器不同的特…

关于java实现同步的方法

什么是线程同步&#xff1f; 当使用多个线程来访问同一个数据时&#xff0c;非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。 实现同步机制有两个方法&#xff1a; 1。 同步代码块&#xff1a; synchronized(同…

vscode怎么快速启动npm_win10快速启动功能怎么开启

我们都知道&#xff0c;机械硬盘比固态硬盘弱&#xff0c;比如开机速度。说到启动速度&#xff0c;我们不知道win10是否有快速启动功能。如果你还不知道&#xff0c;让我们来学习一下win10快速入门的方法。小白认为&#xff0c;很多win10系统的用户并不知道win10有快速启动功能…