使用Python+OpenCV2进行图片中的文字分割(支持竖版)

这篇具有很好参考价值的文章主要介绍了使用Python+OpenCV2进行图片中的文字分割(支持竖版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

扣字和分割

把图片中的文字,识别出来,并将每个字的图片抠出来;

import cv2
import numpy as np

HIOG = 50
VIOG = 3
Position = []
 
'''水平投影'''
def getHProjection(image):
    hProjection = np.zeros(image.shape,np.uint8)
    # 获取图像大小
    (h,w)=image.shape
    # 统计像素个数
    h_ = [0]*h
    for y in range(h):
        for x in range(w):
            if image[y,x] == 255:
                h_[y]+=1
    #绘制水平投影图像
    for y in range(h):
        for x in range(h_[y]):
            hProjection[y,x] = 255
    # cv2.imshow('hProjection2',cv2.resize(hProjection, None, fx=0.3, fy=0.5, interpolation=cv2.INTER_AREA))
    # cv2.waitKey(0)
    return h_
 
def getVProjection(image):
    vProjection = np.zeros(image.shape,np.uint8);
    (h,w) = image.shape
    w_ = [0]*w
    for x in range(w):
        for y in range(h):
            if image[y,x] == 255:
                w_[x]+=1
    for x in range(w):
        for y in range(h-w_[x],h):
            vProjection[y,x] = 255
    # cv2.imshow('vProjection',cv2.resize(vProjection, None, fx=1, fy=0.1, interpolation=cv2.INTER_AREA))
    # cv2.waitKey(0)
    return w_


def scan(vProjection, iog, pos = 0):
    start = 0
    V_start = []
    V_end = []

    for i in range(len(vProjection)):
        if vProjection[i] > iog and start == 0:
            V_start.append(i)
            start = 1
        if vProjection[i] <= iog and start == 1:
            if i - V_start[-1] < pos:
                continue
            V_end.append(i)
            start = 0
    return V_start, V_end


def checkSingle(image):
    h = getHProjection(image)
    start = 0
    end = 0

    for i in range(h):
        pass

#分割
def CropImage(image,dest,boxMin,boxMax):
    a=boxMin[1]
    b=boxMax[1]
    c=boxMin[0]
    d=boxMax[0]
    cropImg = image[a:b,c:d]
    cv2.imwrite(dest,cropImg)
    
#开始识别
def DOIT(rawPic):
        # 读入原始图像
    origineImage = cv2.imread(rawPic)
    # 图像灰度化   
    #image = cv2.imread('test.jpg',0)
    image = cv2.cvtColor(origineImage,cv2.COLOR_BGR2GRAY)
    
    # cv2.imshow('gray',image)
    # 将图片二值化
    retval, img = cv2.threshold(image,127,255,cv2.THRESH_BINARY_INV)
    # kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    # img = cv2.erode(img, kernel)
    # cv2.imshow('binary',cv2.resize(img, None, fx=0.3, fy=0.3, interpolation=cv2.INTER_AREA))
    #图像高与宽
    (h,w)=img.shape
    #垂直投影
    V = getVProjection(img)
 
    start = 0
    V_start = []
    V_end = []

    # 对垂直投影水平分割
    V_start, V_end = scan(V, HIOG)
    if len(V_start) > len(V_end):
        V_end.append(w-5)

    # 分割行,分割之后再进行列分割并保存分割位置
    for i in range(len(V_end)):
        #获取行图像
        if V_end[i] - V_start[i] < 30:
            continue

        cropImg = img[0:h, V_start[i]:V_end[i]]
        # cv2.imshow('cropImg',cropImg)
        # cv2.waitKey(0)
        #对行图像进行垂直投影
        H = getHProjection(cropImg)
        H_start, H_end = scan(H, VIOG, 40)


        if len(H_start) > len(H_end):
            H_end.append(h-5)

        for pos in range(len(H_start)):
            # 再进行一次列扫描
            DcropImg = cropImg[H_start[pos]:H_end[pos], 0:w]
            d_h, d_w = DcropImg.shape
            # cv2.imshow("dcrop", DcropImg)
            sec_V = getVProjection(DcropImg)
            c1, c2 = scan(sec_V, 0)
            if len(c1) > len(c2):
                c2.append(d_w)

            x = 1
            while x < len(c1):
                if c1[x] - c2[x-1] < 12:
                    c2.pop(x-1)
                    c1.pop(x)
                    x -= 1
                x += 1

            # cv2.waitKey(0)
            if len(c1) == 1:
                Position.append([V_start[i],H_start[pos],V_end[i],H_end[pos]])
            else:
                for x in range(len(c1)):
                    Position.append([V_start[i]+c1[x], H_start[pos],V_start[i]+c2[x], H_end[pos]])

    #根据确定的位置分割字符
    number=0
    for m in range(len(Position)):
        rectMin =  (Position[m][0]-5,Position[m][1]-5)
        rectMax =  (Position[m][2]+5,Position[m][3]+5)
        cv2.rectangle(origineImage,rectMin, rectMax, (0 ,0 ,255), 2)
        number=number+1
        #start-crop
        CropImage(origineImage,'result/' + '%d.jpg' % number,rectMin,rectMax)
    # cv2.imshow('image',cv2.resize(origineImage, None, fx=0.6, fy=0.6, interpolation=cv2.INTER_AREA))
    cv2.imshow('image',origineImage)
    cv2.imwrite('result/' + 'ResultImage.jpg' , origineImage)
    cv2.waitKey(0)

#############################
rawPicPath = r"H:\TEMP\TEXT_PROCCESS\TEST05.jpg"
DOIT(rawPicPath)
#############################


原图片:

使用Python+OpenCV2进行图片中的文字分割(支持竖版),opencv,计算机视觉,人工智能

分割后文件夹:

使用Python+OpenCV2进行图片中的文字分割(支持竖版),opencv,计算机视觉,人工智能

重命名

可见此时文件都还是数字为文件名称,那么接下来要利用OCR自动给每个文字图片文件命名

我们使用UMIOCR , UMI-OCR的安装建议去GITHUB上查,windows上部署还是很方便的;

这里使用本机安装好的UMI-OCR 的 API地址  http://127.0.0.1:1224/api/ocr

先定义API调用方法

  
############################################
import base64
import requests
import json

#API访问使用
def UMI_OCR_OPT(url,img_path): 
    # url = "http://127.0.0.1:1224/api/ocr"
    # img_path= './result/123.jpg'
 
    with open(img_path,'rb') as f:
        image_base64 = base64.b64encode(f.read())
        image_base64 =str(image_base64,'utf-8')
    
    data = {
        "base64": image_base64,
        # 可选参数
        # Paddle引擎模式
        # "options": {
        #     "ocr.language": "models/config_chinese.txt",
        #     "ocr.cls": False,
        #     "ocr.limit_side_len": 960,
        #     "tbpu.parser": "MergeLine",
        # }
        # Rapid引擎模式
        # "options": {
        #     "ocr.language": "简体中文",
        #     "ocr.angle": False,
        #     "ocr.maxSideLen": 1024,
        #     "tbpu.parser": "MergeLine",
        # }
    }
    headers = {"Content-Type": "application/json"}
    data_str = json.dumps(data)
    response = requests.post(url, data=data_str, headers=headers)
    if response.status_code == 200:
        res_dict = json.loads(response.text)
        #检测失败与否
        if(str(res_dict).find('No text found in image')!=-1):
            # print("返回失败内容\n", res_dict)
            return ''
        print("返回值字典\n", res_dict)
        resText = res_dict['data'][0]['text']
        return resText
    return ''

开始批量调用检测

import easyocr

import shutil

error =''

#api地址
uni_orc_url="http://127.0.0.1:1224/api/ocr"
#将所有字体
for i in range(1,285):
    filePath = "./result/"+str(i)+".jpg"
    # result = reader.readtext(filePath, detail = 0)
    result = UMI_OCR_OPT(uni_orc_url,filePath)
    if(len(result)==0 or result == ''):
        error+= filePath +'\n'
        continue
    print(result)
    destPath = "./resultX/"+result[0]+".jpg" 
    print('sour :: '+ filePath)
    print('dest :: '+ destPath)
    shutil.copyfile(filePath, destPath)

print('error:\n'+error)

然后将能够识别出来的所有文字图片都复制并重命名为该字

效果如下:

使用Python+OpenCV2进行图片中的文字分割(支持竖版),opencv,计算机视觉,人工智能文章来源地址https://www.toymoban.com/news/detail-830631.html

到了这里,关于使用Python+OpenCV2进行图片中的文字分割(支持竖版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Python 实战】---- 批量识别图片中的文字,存入excel中【使用百度的通用文字识别】

    1. 获取信息图片示例 2. 运行实例 3. 运行结果 4. 各个文件的位置 1. 需求分析 识别图片中的文字【采用百度的通用文字识别】; 文字筛选,按照分类获取对应的文本; 采用 openpyxl 实现将数据存入 excel 中。 2. 获取 access_token 获取本地缓存的

    2024年02月15日
    浏览(49)
  • 基于Tesseract模块Python实现提取图片中的文字信息(安装+使用教程)

    Python实现提取图片中的文字可以使用Optical Character Recognition (OCR) 技术来解决。OCR是指将图像中的文本转换成可编辑的文本的过程。Python有许多OCR库,但最流行和最广泛使用的是Tesseract库。 下面是一个使用Python和Tesseract来提取图像中的文本的简单示例代码。 OCR,即光学字符识

    2024年02月05日
    浏览(46)
  • 如何使用Python中的OpenCV对图像进行调整大小?

    OpenCV  提供了函数  cv2.resize()  用于调整图像大小。OpenCV中的调整大小被称为  缩放  。我们可以通过指定图像大小或缩放因子来调整图像大小。当我们指定缩放因子时,宽高比会得到保留。 cv2.resize()  函数中有不同的插值方法: cv2.INTER_AREA  —— 用于缩小图像。 cv2.INTER

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

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

    2024年01月18日
    浏览(58)
  • 基于颜色进行轮廓分割,基于opencv和python

    1. 阈值调整,交互式的阈值调整,确定上限和下限: 2. 阈值分割,并找到最大轮廓 现根据mask找到所有轮廓 对所有轮廓排序,找到最大的 再对最大轮廓去凸多边形,用来对噪声做过滤。

    2024年02月11日
    浏览(43)
  • opencv实战---使用TesseractOCR进行文字识别

    什么是tesseractOCR? TesseractOCR 是一款由HP实验室开发由 Google 维护的开源 OCR(Optical Character Recognition , 光学字符识别)引擎。 简单点说,就是用来做字符识别的,可以识别超过100种语言。也可以用来训练其他的语言。 听起来不错,但识别的准确率让人恼火。于是,有人训练出

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

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

    2024年02月02日
    浏览(43)
  • python提取图片型pdf中的文字(提取pdf扫描件文字)

    前言 文字型pdf提取,python的库一大堆,但是图片型pdf和pdf扫描件提取,还是有些难度的,我们需要用到OCR(光学字符识别)功能。 一、准备 1、安装OCR(光学字符识别)支持库 首先要安装 pytesseract 和 Tesserac OCR ,Tesseract OCR是一种广泛使用的OCR工具,它可以用于从图像中提取

    2024年03月23日
    浏览(72)
  • python3去除图片中的文字水印

    以下为代码: 可根据水印颜色,将np.clip(1.4 * img + 20, 0, 255)中的1.4更改为1.1~1.7,20更改为-40~40,从而达到更好的效果。

    2024年01月25日
    浏览(40)
  • 通过Python的pytesseract库识别图片中的文字

    大家好,我是空空star,本篇给大家分享一下通过Python的pytesseract库识别图片中的文字。 本篇所用软件相关版本: macOS 11.6.5 Python 3.8.9 pytesseract 0.3.10 Pillow 9.4.0 Pytesseract是一个Python的OCR库,它可以识别图片中的文本并将其转换成文本形式。Pytesseract基于Google的Tesseract OCR引擎,具

    2024年02月03日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包