【OpenCV实现图像:OpenCV进行OCR字符分割】

这篇具有很好参考价值的文章主要介绍了【OpenCV实现图像:OpenCV进行OCR字符分割】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

在处理OCR(Optical Character Recognition,光学字符识别)时,利用传统的图像处理方法进行字符切分仍然是一种有效的途径。即便当前计算机视觉领域主导的是卷积神经网络,但对于一些相对简单的实际应用场景,传统方法仍然表现出良好的效果。

在OCR任务中,字符切分是一个关键的步骤,它能够将整个文本图像分割成单个字符,为后续的处理任务提供基础。传统图像处理方法可以通过一系列技术来实现字符的准确切分。这些技术可能包括但不限于:

边缘检测: 使用算子(如Sobel、Canny)检测图像中字符的边缘,从而确定字符的边界。

连通区域分析: 通过标记和分析图像中的连通区域,可以识别字符的位置和形状。

投影法: 水平和垂直投影可以帮助检测字符之间的间隔,从而进行字符切分。

轮廓分析: 提取字符的轮廓信息,进而判断字符的位置和形状。

形态学操作: 使用腐蚀、膨胀等形态学操作来调整字符的形状,以便更好地进行切分。

虽然卷积神经网络在图像处理任务中表现出色,但在一些简单的场景中,传统方法的实用性仍然很大。例如,在文档扫描、数字识别等任务中,通过合理运用传统图像处理技术,可以快速、准确地完成字符切分,为后续的OCR处理奠定基础。这种混合使用传统方法和深度学习技术的方式,可以充分发挥各自的优势,实现更全面、高效的图像处理任务。

基本概念

OCR(Optical Character Recognition):全称光学字符识别,是一项技术,通过使用光学和图像处理技术,将图像中的文字转换为可编辑的文本。

Segmentation:在图像处理领域,分割是指将整个图像分解为多个子部分的过程,以便进行进一步的处理。

OCR Segmentation:是指在光学字符识别过程中,将包含文本的图像分解成多个小部分的操作。这旨在有效地识别图像中的文字,并将其从背景中分离出来,以便后续的OCR处理。通过分割,系统可以更准确地定位和识别每个字符,提高整体识别准确性。

读入图像

读入图像:

一旦获得了包含文本的数字图像,或者通过扫描仪将某些文档转换为数字图像进行存储,就可以迈入下一步,即预处理。在这个阶段,可以使用以下代码来读入图像,以便进行后续的处理。

import cv2

# 读入图像
myImage = cv2.imread('12.png')

# 显示图像
cv2.imshow('Text Image', myImage)
cv2.waitKey(0)

opencv 连通域 分割字符,# 学习笔记,opencv,python深度学习,opencv,ocr,人工智能,图像处理,算法,计算机视觉,ubuntu

图像二值化

在开始分割文本图像之前,需要经过一系列预处理步骤,其中之一是图像的二值化。这个过程包括以下步骤:

灰度化: 首先,将输入图像转换为灰度图像。这一步的目的是简化图像,使系统能够更轻松地识别图像中的不同形状,同时去除颜色信息,从而减少处理的复杂性。这通常通过将图像中的每个像素的彩色信息转化为相应的灰度值来实现。

import cv2

# 读入图像
myImage = cv2.imread('12.png')

# 灰度化
grayImage = cv2.cvtColor(myImage, cv2.COLOR_BGR2GRAY)

# 二值化
_, binaryImage = cv2.threshold(grayImage, 128, 255, cv2.THRESH_BINARY)

# 显示图像
cv2.imshow('Binary Image', grayImage)
cv2.waitKey(0)

opencv 连通域 分割字符,# 学习笔记,opencv,python深度学习,opencv,ocr,人工智能,图像处理,算法,计算机视觉,ubuntu

二值化: 一旦图像变为灰度图,接下来的关键步骤是将其二值化。这意味着将图像中的像素值转换为两个可能的值之一,通常是0和255。这样的二值图像使得文字与背景更为明显,为后续的字符切分和识别提供了更好的基础。

这个可以根据自己的修改,转换颜色。

_, binaryImage = cv2.threshold(grayImage, 128, 255, cv2.THRESH_BINARY)
import cv2
# 读入图像
myImage = cv2.imread('12.png')
# 灰度化
grayImage = cv2.cvtColor(myImage, cv2.COLOR_BGR2GRAY)
# 二值化
_, binaryImage = cv2.threshold(grayImage, 128, 255, cv2.THRESH_BINARY)
# 显示图像
cv2.imshow('Binary Image', binaryImage)
cv2.waitKey(0)

opencv 连通域 分割字符,# 学习笔记,opencv,python深度学习,opencv,ocr,人工智能,图像处理,算法,计算机视觉,ubuntu

import cv2

# 读入图像
myImage = cv2.imread('12.png')

# 灰度化
grayImage = cv2.cvtColor(myImage, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(grayImage, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)
# 形态学操作
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18))
dilation = cv2.dilate(thresh, horizontal_kernel, iterations=1)

# 显示图像
cv2.imshow('Dilated Image', thresh)
cv2.waitKey(0)

opencv 连通域 分割字符,# 学习笔记,opencv,python深度学习,opencv,ocr,人工智能,图像处理,算法,计算机视觉,ubuntu

接着可以选择并使用多种算法从上述二值图像中提取信息,例如直方图均衡、傅立叶变换、形态学等。
形态学操作

import cv2

# 读入图像
myImage = cv2.imread('12.png')

# 灰度化
grayImage = cv2.cvtColor(myImage, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(grayImage, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)
# 形态学操作
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18))
dilation = cv2.dilate(thresh, horizontal_kernel, iterations=1)

# 显示图像
cv2.imshow('Dilated Image', dilation)
cv2.waitKey(0)

opencv 连通域 分割字符,# 学习笔记,opencv,python深度学习,opencv,ocr,人工智能,图像处理,算法,计算机视觉,ubuntu

查找轮廓
接着需要找到轮廓线,这样才能将图像与背景逐行分离。
为了清楚,换红色线条标注,可以修改这段代码更换颜色

    rect = cv2.rectangle(myImage, (x, y), (x + w, y + h), (0, 0, 255), 1)  # 红色矩形
import cv2

# 读入图像
myImage = cv2.imread('12.png')

# 灰度化
grayImage = cv2.cvtColor(myImage, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(grayImage, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)

# 形态学操作
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18))
dilation = cv2.dilate(thresh, horizontal_kernel, iterations=1)

# 查找轮廓
horizontal_contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 在原始图像上绘制红色矩形
for cnt in horizontal_contours:
    x, y, w, h = cv2.boundingRect(cnt)
    rect = cv2.rectangle(myImage, (x, y), (x + w, y + h), (0, 0, 255), 1)  # 红色矩形

# 显示图像
cv2.imshow('Image with Red Rectangles', myImage)
cv2.waitKey(0)

opencv 连通域 分割字符,# 学习笔记,opencv,python深度学习,opencv,ocr,人工智能,图像处理,算法,计算机视觉,ubuntu
单词和字符分割

接着我们通过以下步骤对裁剪出的轮廓子图进行单词分割:

1-预处理(灰度、阈值)

2-形态学算法

3-找到边界并绘制它们

4-进入单个字符分割

进而我们将对输出图像中的每个单词再次重复相同的步骤进行单个字符的分割:

1-预处理(灰度、阈值)

2-形态学算法

3-找到边界并绘制它们

4-停止

最终我们得到的结果如下。
代码:

import cv2

# 读入图像
myImage = cv2.imread('12.png')

# 灰度化
grayImage = cv2.cvtColor(myImage, cv2.COLOR_BGR2GRAY)

# 二值化
ret, thresh = cv2.threshold(grayImage, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)

# 形态学操作
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18))
dilation = cv2.dilate(thresh, horizontal_kernel, iterations=1)

# 查找轮廓
horizontal_contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 在原始图像上绘制红色矩形和进行字符分割
for cnt in horizontal_contours:
    x, y, w, h = cv2.boundingRect(cnt)

    # 绘制红色矩形
    rect = cv2.rectangle(myImage, (x, y), (x + w, y + h), (0, 0, 255), 1)

    # 在水平轮廓区域内进行字符分割
    roi = thresh[y:y + h, x:x + w]

    # 进行字符分割的额外步骤,例如形态学操作、查找字符轮廓等
    char_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    char_dilation = cv2.dilate(roi, char_kernel, iterations=1)
    char_contours, _ = cv2.findContours(char_dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 在原始图像上绘制字符的边界
    for char_cnt in char_contours:
        char_x, char_y, char_w, char_h = cv2.boundingRect(char_cnt)
        char_rect = cv2.rectangle(myImage, (x + char_x, y + char_y), (x + char_x + char_w, y + char_y + char_h),
                                  (0, 255, 0), 1)

# 显示图像
cv2.imshow('Image with Red Rectangles and Character Boundaries', myImage)
cv2.waitKey(0)

`
opencv 连通域 分割字符,# 学习笔记,opencv,python深度学习,opencv,ocr,人工智能,图像处理,算法,计算机视觉,ubuntu

小结

在传统图像处理中,如何利用常见的形态学方法进行字符轮廓查找,从而实现字符的切分。通过提供相应的代码实现,展示了在一些字符分布简单、字符间隔较大的场景下,该方法能够取得一定的效果。然而,由于采用传统方案,该方法的泛化性较为有限。在面对更复杂的场景时,可以考虑借助神经网络等先进技术,以实现更加鲁棒和适用于多种情况的字符切分算法。文章来源地址https://www.toymoban.com/news/detail-799711.html

到了这里,关于【OpenCV实现图像:OpenCV进行OCR字符分割】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 用OpenCV进行图像分割--进阶篇

    大家好,我的图像处理爱好者们! 在上一篇幅中,我们简单介绍了图像分割领域中的基础知识,包含基于固定阈值的分割和基于OSTU的分割算法。这一次,我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。 闲话少说,我们直接开始吧! 基于色度的分割是指对每个

    2024年02月13日
    浏览(22)
  • 【opencv】示例-grabcut.cpp 使用OpenCV库的GrabCut算法进行图像分割

    left mouse button - set rectangle SHIFT+left mouse button - set GC_FGD pixels CTRL+left mouse button - set GC_BGD pixels 这段代码是一个 使用OpenCV库的GrabCut算法进行图像分割 的C++程序。它允许用户通过交互式方式选择图像中的一个区域,并利用GrabCut算法尝试将其分割出来。代码中包含用户操作指南、

    2024年04月13日
    浏览(35)
  • OpenCV(二十八):连通域分割

    目录 1.介绍连通域分割 2.像素领域介绍 3.两遍法分割连通域 4.连通域分割函数 1.介绍连通域分割        连通域分割是一种图像处理技术,用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性,如相近的灰度值或颜色。连通域分割可以用于物体

    2024年02月09日
    浏览(32)
  • OPENCV--实现meanshift图像分割

    2024年02月08日
    浏览(31)
  • OpenCV——图像连通域分析

       cv::connectedComponents 函数将二值图像分割成多个连通区域,每个连通区域被赋予一个唯一的标签。函数的返回值为标签数目。该函数的原型如下: image :输入图像。 labels :输出的连通区域标签图像。 connectivity :为连通性。 ltype :输出图像的数据类型。 cv::connectedCompon

    2024年02月11日
    浏览(36)
  • opencv 十六 python下各种连通域处理方法(按面积阈值筛选连通域、按面积排序筛选连通域、连通域分割等方法)

    本博文基于python-opencv实现了按照面积阈值筛选连通域、按照面积排序筛选topK连通域、 连通域细化(连通域骨架提取)、连通域分割(基于分水岭算法使连通域在细小处断开)、按照面积排序赛选topK轮廓等常见的连通域处理代码。并将代码封装为shapeUtils类,在自己的python代

    2024年02月04日
    浏览(54)
  • OpenCV16-图像连通域分析

    连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域。连通域分析是指在图像中寻找彼此互相独立的连通域并将其标记出来。 4邻域与8邻域的概念:点 P 0 ( x , y ) P_0(x,y) P 0 ​ ( x , y ) 的4邻域为其上下左右4个像素点,其8邻域为上下左右再加上对角线方向的4个点。

    2024年02月06日
    浏览(30)
  • 10---OpenCV:图像进阶操作之连通区域分析

    图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来 。提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌识别、文字识别、目标检测等领域对感兴趣区域分割与识别

    2024年02月16日
    浏览(33)
  • c++ opencv将彩色图像按连通域区分

    要将彩色图像按连通域区分,您可以使用 OpenCV 中的  cv::connectedComponents  函数。 下面是一个简单的示例代码,说明如何使用  cv::connectedComponents  函数来检测并标记图像中的连通域: 这段代码首先读取彩色图像,然后将其转换为灰度图像。接下来,使用  cv::threshold  函数将

    2024年02月10日
    浏览(36)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包