gpt4 book ai didi

python - 使用python和opencv检测图像中的文本区域

转载 作者:IT老高 更新时间:2023-10-28 22:15:26 25 4
gpt4 key购买 nike

我想使用 python 2.7 和 opencv 2.4.9 检测图像的文本区域
并在其周围绘制一个矩形区域。如下面的示例图像所示。

我是图像处理的新手,所以任何想法如何做到这一点将不胜感激。

building blueprint with labeled rooms

最佳答案

有多种方法可以检测图像中的文本。
我建议看 this question here ,因为它也可以回答您的情况。虽然它不是在python中,但代码可以很容易地从c++转换为python(只需查看API并将方法从c++转换为python,并不难。当我为自己的单独问题尝试他们的代码时我自己做了) .此处的解决方案可能不适用于您的情况,但我建议您尝试一下。
如果我要这样做,我将执行以下过程:
准备您的图像:
如果您要编辑的所有图像都与您提供的图像大致相同,其中实际设计由一系列灰色组成,而文本始终为黑色。我会首先将所有非黑色(或已经是白色)的内容涂白。这样做只会留下黑色文本。

# must import if working with opencv in python
import numpy as np
import cv2

# removes pixels in image that are between the range of
# [lower_val,upper_val]
def remove_gray(img,lower_val,upper_val):
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_bound = np.array([0,0,lower_val])
upper_bound = np.array([255,255,upper_val])
mask = cv2.inRange(gray, lower_bound, upper_bound)
return cv2.bitwise_and(gray, gray, mask = mask)
现在您所拥有的只是黑色文本,目标是获取这些框。如前所述,有不同的方法来解决这个问题。
描边宽度变换 (SWT)
查找文本区域的典型方法:您可以使用笔画宽度变换来查找文本区域,如 "Detecting Text in Natural Scenes with Stroke Width Transform " 中所述。作者:鲍里斯·爱泼施泰因、埃亚尔·奥菲克和约纳坦·韦克斯勒。老实说,如果这和我相信的一样快速和可靠,那么这种方法比我下面的代码更有效。您仍然可以使用上面的代码来删除蓝图设计,这可能有助于 swt 算法的整体性能。
Here is a c library实现了他们的算法,但据说它非常原始,并且文档被称为不完整。显然,为了将这个库与 python 一起使用,需要一个包装器,目前我没有看到官方提供的包装器。
我链接的库是 CCV .它是一个旨在用于您的应用程序的库,而不是重新创建算法。因此,这是一个要使用的工具,正如评论中所述,它违背了 OP 从“第一原则”中制作它的愿望。尽管如此,如果您不想自己编码算法,知道它存在很有用。

自酿非 SWT 方法
如果您有每个图像的元数据,例如在 xml 文件中,说明每个图像中有多少房间被标记,那么您可以访问该 xml 文件,获取有关图像中有多少标签的数据,然后存储该数据一些变量中的数字说, num_of_labels .现在获取您的图像并将其放入以您指定的设定速率侵 eclipse 的 while 循环中,在每个循环中查找图像中的外部轮廓,并在外部轮廓数量与您的 num_of_labels 相同时停止循环。 .然后只需找到每个轮廓的边界框即可完成。
# erodes image based on given kernel size (erosion = expands black areas)
def erode( img, kern_size = 3 ):
retval, img = cv2.threshold(img, 254.0, 255.0, cv2.THRESH_BINARY) # threshold to deal with only black and white.
kern = np.ones((kern_size,kern_size),np.uint8) # make a kernel for erosion based on given kernel size.
eroded = cv2.erode(img, kern, 1) # erode your image to blobbify black areas
y,x = eroded.shape # get shape of image to make a white boarder around image of 1px, to avoid problems with find contours.
return cv2.rectangle(eroded, (0,0), (x,y), (255,255,255), 1)

# finds contours of eroded image
def prep( img, kern_size = 3 ):
img = erode( img, kern_size )
retval, img = cv2.threshold(img, 200.0, 255.0, cv2.THRESH_BINARY_INV) # invert colors for findContours
return cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) # Find Contours of Image

# given img & number of desired blobs, returns contours of blobs.
def blobbify(img, num_of_labels, kern_size = 3, dilation_rate = 10):
prep_img, contours, hierarchy = prep( img.copy(), kern_size ) # dilate img and check current contour count.
while len(contours) > num_of_labels:
kern_size += dilation_rate # add dilation_rate to kern_size to increase the blob. Remember kern_size must always be odd.
previous = (prep_img, contours, hierarchy)
processed_img, contours, hierarchy = prep( img.copy(), kern_size ) # dilate img and check current contour count, again.
if len(contours) < num_of_labels:
return (processed_img, contours, hierarchy)
else:
return previous

# finds bounding boxes of all contours
def bounding_box(contours):
bBox = []
for curve in contours:
box = cv2.boundingRect(curve)
bBox.append(box)
return bBox
上述方法生成的框将在标签周围留出空间,如果框应用于原始图像,则这可能包括原始设计的一部分。为了避免这种情况,通过新发现的框制作感兴趣的区域并修剪空白区域。然后将该 roi 的形状保存为您的新盒子。
也许您无法知道图像中有多少标签。如果是这种情况,那么我建议您使用侵 eclipse 值,直到找到最适合您的情况并获得所需 Blob 的值。
或者,您可以尝试在移除设计后在剩余内容上找到轮廓,并根据边界框之间的距离将边界框组合成一个矩形。
找到您的盒子后,只需根据原始图像使用这些盒子即可完成。

OpenCV 3 中的场景文本检测模块
正如对您的问题的评论中所提到的,opencv 3 中已经存在一种场景文本检测(不是文档文本检测)的方法。我知道您没有切换版本的能力,但对于那些有相同问题的人,不受限制对于较旧的 opencv 版本,我决定将其包含在最后。可以通过简单的谷歌搜索找到场景文本检测的文档。
用于文本检测的 opencv 模块还带有实现 tessaract 的文本识别,这是一个免费的开源文本识别模块。 tessaract的垮台,也就是opencv的场景文本识别模块,就是不如商业应用那么精致,使用起来费时费力。因此降低了它的性能,但它可以免费使用,所以如果你也想要文本识别,它是我们不花钱就能得到的最好的。
链接:
  • Documentation OpenCv
  • Older Documentation
  • The source code is located here, for analysis and understanding

  • 老实说,我缺乏 opencv 和图像处理方面的经验和专业知识,无法提供实现其文本检测模块的详细方法。与 SWT 算法相同。在过去的几个月里,我刚刚接触了这些东西,但随着我了解更多,我将编辑这个答案。

    关于python - 使用python和opencv检测图像中的文本区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37771263/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com