16- 图片转文字识别实操 (OpenCV系列) (项目十六)

这篇具有很好参考价值的文章主要介绍了16- 图片转文字识别实操 (OpenCV系列) (项目十六)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目要点

  • 读取图片:  image = cv2.imread('./images/page.jpg')
  • 调整图片尺寸:  resized = cv2.resize(image, (width, height), interpolation = cv2.INTER_AREA)
  • 灰度化处理:  gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  • 高斯模糊去噪点:  gray = cv2.GaussianBlur(gray, (5,5), 0)
  • 边缘检测:  edged = cv2.Canny(gray, 75, 200)
  • cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]  用边缘检测的结果进行轮廓检测  # 返回值两个: contours, hierarchy
  • 按照面积排序:  cnts = sorted(cnts, key = cv2.contourArea, reverse = True)
  • 显示轮廓:  image_contours = cv2.drawContours(image.copy(), cnts, -1, (0, 0, 255), 2)
  • 计算轮廓周长:  perimeter = cv2.arcLength(c, True)  # for c in cnts:
  • 多边形逼近:  approx = cv2.approxPolyDP(c, 0.02 * perimeter, True)
  • 显示轮廓: image_contours = cv2.drawContours(image.copy(), [screen_cnt], -1, (0,0,255), 2) 
  • 计算变换矩阵: M =cv2.getPerspectiveTransform(rect,dst) # rect 是原始坐标,dst 是调整后坐标
  • 通过坐标透视变换转换: warped = cv2.warpPerspective(image, M, (max_width, max_height))
  • 灰度化处理: warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)  # 二值化只能处理二维图片
  • 二值化处理: ref = cv2.threshold(warped, 120, 255, cv2.THRESH_BINARY)[1]  # 两个返回值: ret, thresh1
  • 保存图片cv2.imwrite('./scan1.jpg', ref)
  • 图片转文字:  text = pytesseract.image_to_string(Image.open('./scan1.jpg'))  # 需调包
  • 保存str 到 txt文件:
with open('test.txt','w', encoding='utf-8') as f:
    f.write(text)

图片转文字项目

1 图片预处理

1.1 显示原图

def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
# 导包
import numpy as np
import cv2
# 读取图片
image = cv2.imread('./images/page.jpg')
print(image.shape)   # (3264, 2448, 3)  

# 计算比例,限定高度500
ratio = image.shape[0] / 500.0
orig = image.copy()
cv_show('img', image)  # 图片极大, 看不全...

open 图片 文字识别,项目梳理,opencv,深度学习,计算机视觉,图像处理,人工智能

1.2 图片尺寸调整

def resize(image, width = None, height = None, inter = cv2.INTER_AREA):
    # cv2.resize()
    dim = None
    (h, w) = image.shape[:2]
    # print(image.shape[:2])
    if width is None and height is None:
        return image
    if width is None:  # 只提供了高度
        r = height /float(h)
        dim = (int(w * r), height)
        # print(dim)
    else: # 如果只提供了宽度
        r = width / float(w)
        dim = (width, int(h * r))
    resized = cv2.resize(image, dim, interpolation = inter)
    return resized

# 对图片进行 resize
image = resize(orig, height = 500)
cv_show('img', image) 

open 图片 文字识别,项目梳理,opencv,深度学习,计算机视觉,图像处理,人工智能

1.3 灰度化处理和轮廓检测

# 灰度化处理
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 高斯模糊去噪点
gray = cv2.GaussianBlur(gray, (5,5), 0)
# 边缘检测
edged = cv2.Canny(gray, 75, 200)
cv_show('img', edged)

open 图片 文字识别,项目梳理,opencv,深度学习,计算机视觉,图像处理,人工智能

1.4 轮廓检测

# 用边缘检测的结果进行轮廓检测
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
# 按照面积排序
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)
print(len(cnts))  # 16  轮廓数量
# 显示轮廓
image_contours = cv2.drawContours(image.copy(), cnts, -1, (0, 0, 255), 2)  
cv_show('img', image_contours)

open 图片 文字识别,项目梳理,opencv,深度学习,计算机视觉,图像处理,人工智能

1.5 找出最大轮廓

# 遍历轮廓,找出最大轮廓
for c in cnts:
    # 计算轮廓周长
    perimeter = cv2.arcLength(c, True)
    # 多边形逼近
    approx = cv2.approxPolyDP(c, 0.02 * perimeter, True)
    if len(approx) == 4:
        screen_cnt = approx
        break
# 显示轮廓
image_contours = cv2.drawContours(image.copy(), [screen_cnt], -1, (0, 0, 255), 2)  
cv_show('img', image_contours)

open 图片 文字识别,项目梳理,opencv,深度学习,计算机视觉,图像处理,人工智能

2 透视变换,拉正视角

2.1 透视转换

def order_points(pts):
    # 创建全为0 的矩阵, 来接收找到的坐标
    rect = np.zeros((4, 2), dtype = 'float32')
    s = pts.sum(axis = 1)
    # 左上角的坐标一定是X,Y相加最小的,右下为最大的
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]
    
    # 右上角的x,y 相减的差值一定是最小的
    # 左下角的x,y 相减,差值一定是最大的
    diff = np.diff(pts, axis = 1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]
    return rect
def four_point_transform(image, pts):
    rect = order_points(pts)
    (tl, tr, br, bl) = rect
    
    widthA = np.sqrt((br[0] - bl[0]) ** 2 + (br[1] - bl[1]) ** 2)
    widthB = np.sqrt((tr[0] - tl[0]) ** 2 + (tr[1] - tl[1]) ** 2)
    max_width = max(int(widthA), int(widthB))
    heightA = np.sqrt((tr[0] - br[0]) ** 2 + (tr[1] - br[1]) ** 2)
    heightB = np.sqrt((tl[0] - bl[0]) ** 2 + (tl[1] - bl[1]) ** 2)
    max_height = max(int(heightA), int(heightB))
    
    dst = np.array([
        [0, 0],
        [max_width - 1, 0],
        [max_width -1, max_height - 1],
        [0, max_height -1]], dtype = 'float32')
    
    M = cv2.getPerspectiveTransform(rect, dst)
    warped = cv2.warpPerspective(image, M, (max_width, max_height))
    return warped
# 视图透视变换, 将视图转为正对透视
warped = four_point_transform(orig, screen_cnt.reshape(4, 2) * ratio)
# 二值化处理
warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
ref = cv2.threshold(warped, 120, 255, cv2.THRESH_BINARY)[1]
print(ref.shape)  # (2624, 1962)
cv_show('ref', ref)
# 把处理好的图片写入文件
cv2.imwrite('./scan1.jpg', ref)
cv_show('warp', warped)
cv2.imwrite('./warped.jpg', warped)

open 图片 文字识别,项目梳理,opencv,深度学习,计算机视觉,图像处理,人工智能     open 图片 文字识别,项目梳理,opencv,深度学习,计算机视觉,图像处理,人工智能  

3 tesseract 进行识别

import pytesseract  # 调用电脑的识图转文字功能 
from PIL import Image 
# pytesseract要求的image不是OpenCV读进来的image, 而是pillow这个包, 即PIL
text = pytesseract.image_to_string(Image.open('./scan1.jpg'))
print(text)

with open('test.txt','w', encoding='utf-8') as f:
    f.write(text)
  • 文字识别结果

open 图片 文字识别,项目梳理,opencv,深度学习,计算机视觉,图像处理,人工智能文章来源地址https://www.toymoban.com/news/detail-803256.html

到了这里,关于16- 图片转文字识别实操 (OpenCV系列) (项目十六)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【项目管理】Java OCR实现图片文字识别

    系统:Win10 Java:1.8.0_333 IDEA:2020.3.4 最近在看外国漫画的时候,发现有些漫画没有汉化的翻译,这哪看得懂。正想把那些日语输入到有道翻译一下,发现日文不会输。正巧之前有接触关于OCR的项目,所以便想用Java做一个小工具,实现图片的文字识别功能,于是我便开始了项目

    2024年02月02日
    浏览(39)
  • 第十九篇【传奇开心果系列】Python的OpenCV库技术点案例示例:文字识别与OCR

    OpenCV文字识别与OCR:用于识别图像中的文字内容,并进行光学字符识别。 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理计算机视觉算法。虽然CV 本身并不包含专门的 OCR(Optical Character Recognition,光学字符识别)功能,但可以配合其他

    2024年02月20日
    浏览(52)
  • 【Opencv】PIL Opencv 向图片写入文字并旋转文字,Opencv图片旋转不截断,Opencv图片旋转不裁剪

    刚性变换: 只有物体的位置(平移变换)和朝向(旋转变换)发生改变,而形状不变,得到的变换称为刚性变换。刚性变换是最一般的变换。 使用透视变换,文字会扭曲失真。刚性变换就不会。 一些介绍: https://blog.csdn.net/liuweiyuxiang/article/details/86510191 创建一张空图写文字: 旋转

    2024年02月11日
    浏览(50)
  • 【Python • 图片识别】pytesseract快速识别提取图片中的文字

    提示:本文多图,请手机端注意流量。 利用python做图片识别,识别提取图片中的文字会有很多方法,但是想要简单一点怎么办,那就可以使用tesseract识别引擎来实现,一行代码就可以做到提取图片文本。 本程序用到了两个python库,pytesseract和PIL,所以先来安装。 运行以下命

    2024年02月02日
    浏览(40)
  • python-图片文字识别

    两种方法 1. 第一种方法 2. 第二种方法

    2024年02月15日
    浏览(45)
  • 识别图片中的文字

    PearOCR 是一款免费无限制网页版文字识别工具。 优点如下: 免费:完全免费,没有任何次数、大小限制,可以无限使用; 安全:全部数据本地运算,所有图片均不会被上传; 智能:基于深度学习训练得到的模型,拥有强大的识别能力; 易用:无需安装,即点即用,支持识别

    2024年02月11日
    浏览(45)
  • 【实操】python opencv将图片合成视频,并插入音频

    简介:将一组图片合成视频,并插入音频。用到opencv,ffmpy,pydub等库。 目录 一、统一图片大小及类型,并按数字排序 二、图片合成视频 三、音频的合并与剪裁 四、音视频融合 opencv基本使用 python对不同尺寸图像改成同一尺寸图像_自动化所副盐的博客-CSDN博客 如何将多张图

    2024年01月16日
    浏览(70)
  • 华为手机怎么识别提取图片文字?APP一键识别

    平时我们用手机会接触到形形色色的图片文件,其中有一部分保存着咱们需要的文字信息。如果我们是华为手机怎么识别提取图片文字呢?给大伙介绍两种方式,有同样需求的小伙伴接着往下浏览吧。 1.“智慧识屏” 华为手机自带的“智慧识屏”可以实现识别提取图片文字,

    2024年02月12日
    浏览(54)
  • Python识别图片中的文字

    不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制。或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存。但是当我们想用到里面的文字时,还是要一个字一个字打出来。那么我们能不能直接

    2024年01月18日
    浏览(53)
  • 使用python进行图片的文字识别

    Tesseract OCR 是一款由 Google 团队开发的开源 OCR(Optical Character Recognition,光学字符识别)引擎,用于将图片、PDF 等格式中的文本转换为可编辑的文本格式。自 1985 年首次发布以来,它已经经历了多个版本和改进,并成为目前最受欢迎的 OCR 引擎之一。 Tesseract OCR 支持多种语言,

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包