python检测图像能否被打开_使用python检测图像中的文本区域并打开

有多种方法可以检测图像中的文本。

我建议你看看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)

查找文本区域的典型方法:可以使用Boris Epshtein、Eyal Ofek和Yonatan Wexler在"Detecting Text in Natural Scenes with Stroke Width Transform "中描述的笔划宽度变换来查找文本区域。老实说,如果这是一个快速和可靠的,因为我相信它是,那么这个方法是一个比我下面的代码更有效的方法。不过,您仍然可以使用上面的代码来删除蓝图设计,而可能会有助于swt算法的整体性能。

实现算法的Here is a c library,但它被声明为非常原始,文档被声明为不完整。显然,要将这个库与python一起使用,需要一个包装器,目前我还没有看到正式的包装器。

我链接的库是CCV。它是一个用于应用程序的库,而不是重新创建算法。因此,这是一个要使用的工具,这违背了OP希望从“第一原则”出发,如评论中所述。不过,如果你不想自己编写算法,知道它的存在还是很有用的。

自制非SWT法

如果每个图像都有元数据,比如说在一个xml文件中,它说明每个图像中有多少个房间被标记,那么您可以访问该xml文件,获取关于图像中有多少个标签的数据,然后将该数字存储在某个变量中,比如num_of_labels。现在,将您的图像放在一个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的形状保存为新框。

也许你无法知道图像中会有多少标签。如果是这样的话,我建议在找到最适合你的情况并得到所需的斑点之前,反复考虑侵蚀值。

或者,在删除设计后,可以尝试在剩余内容上查找轮廓,并根据边界框彼此之间的距离将它们合并为一个矩形。

当你找到你的盒子,简单地使用这些盒子对原始图像,你将完成。

OpenCV 3中的场景文本检测模块

正如在问题注释中提到的,opencv 3中已经存在一种场景文本检测方法(而不是文档文本检测)。我知道您没有能力切换版本,但是对于那些有相同问题的人,并且不限于较旧的opencv版本,我决定在最后包括这个。用于场景文本检测的文档可以是一个简单的谷歌搜索。

用于文本检测的opencv模块还附带了实现tessaract的文本识别,tessaract是一个免费的开源文本识别模块。tessaract(因此opencv的场景文本识别模块)的失败在于它没有商业应用程序那么精细,而且使用起来非常耗时。因此降低了它的性能,但它是免费使用的,所以这是最好的我们不花钱,如果你想文本识别以及。

链接:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以推荐一些有用的资源来帮助你实现基于Python图像文字检测,比如:Tesseract-OCR,OpenCV,pytesseract,scikit-image,PIL,以及Google Vision API等。 ### 回答2: 图像文字检测是一种常见的计算机视觉任务,可以通过使用Python语言来实现。下面是一个基于Python图像文字检测的代码示例: ``` import cv2 import pytesseract def text_detection(image_path): # 读取图像 image = cv2.imread(image_path) # 将图像转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 对图像进行二值化处理 _, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY) # 进行文字识别 text = pytesseract.image_to_string(binary, lang='chi_sim') # 输出识别结果 print("识别结果:") print(text) if __name__ == '__main__': image_path = 'image.jpg' # 替换成需要检测图像路径 text_detection(image_path) ``` 在这个示例,我们使用了OpenCV库来读取和处理图像使用了pytesseract库进行文字识别。首先,我们读取图像并将其转换为灰度图像,然后对图像进行二值化处理,以便更好地区分文字和背景。接下来,我们使用pytesseract库对二值图像进行文字识别,并将结果输出到控制台上。 需要注意的是,这段代码的运行需要事先安装好OpenCV和pytesseract,并且需要下载并安装文语言包,以便进行文文字的识别。 ### 回答3: 基于Python图像文字检测是通过使用计算机视觉和深度学习技术来实现的。以下是一个简单的代码示例,用于演示如何使用Python进行图像文字的检测: 1. 导入所需的库: ```python import cv2 import pytesseract ``` 2. 加载图像: ```python image = cv2.imread('image.jpg') ``` 3. 将图像转化为灰度图像: ```python gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 4. 对图像进行预处理(例如,去除噪声和边缘增强): ```python # 使用高斯滤波去除噪声 gray = cv2.GaussianBlur(gray, (5, 5), 0) # 使用Sobel算子进行边缘增强 grad_x = cv2.Sobel(gray, cv2.CV_16S, 1, 0, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT) grad_y = cv2.Sobel(gray, cv2.CV_16S, 0, 1, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT) gradient = cv2.subtract(grad_x, grad_y) gradient = cv2.convertScaleAbs(gradient) ``` 5. 二值化图像: ```python _, binary = cv2.threshold(gradient, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) ``` 6. 对二值化图像进行膨胀和腐蚀操作: ```python kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7)) binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel, iterations=1) ``` 7. 查找轮廓: ```python contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ``` 8. 遍历轮廓并提取文本: ```python for contour in contours: (x, y, w, h) = cv2.boundingRect(contour) if w/h > 5: # 根据文本的长宽比来过滤非文本区域 text_image = image[y:y+h, x:x+w] text = pytesseract.image_to_string(text_image, lang='eng') print(text) ``` 这是一个简单的示例,用于演示如何使用Python进行图像文字的检测。在实际应用,可以根据具体需求对代码进行更复杂的优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值