我正在尝试在python中创建一个OCR系统 - 第一部分涉及从图像中提取所有字符。这很好,所有字符都分成了自己的边界框。
下面的代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from scipy.misc import imread,imresize
from skimage.segmentation import clear_border
from skimage.morphology import label
from skimage.measure import regionprops
image = imread('./ocr/testing/adobe.png',1)
bw = image < 120
cleared = bw.copy()
clear_border(cleared)
label_image = label(cleared,neighbors=8)
borders = np.logical_xor(bw, cleared)
label_image[borders] = -1
print label_image.max()
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
ax.imshow(bw, cmap='jet')
for region in regionprops(label_image):
if region.area > 20:
minr, minc, maxr, maxc = region.bbox
rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,
fill=False, edgecolor='red', linewidth=2)
ax.add_patch(rect)
plt.show()
然而,由于字母i和j在它们上面有'点',因此代码将点作为单独的边界框。我正在使用regionprops库。调整每个边界框的大小和标准化也是一个好主意吗?
我如何修改此代码以解释i和j?我的理解是我需要合并附近的边界框?试着没有运气......谢谢。
答案 0 :(得分:1)
是的,您通常希望规范化边界框的内容以适合您的字符分类器的输入维度(假设您正在处理具有显式分段的字符分类器,而不是隐式地分段序列分类器)。
用于合并相同字母的垂直隔离的CC,例如i和j,我尝试各向异性高斯滤波器(x方向上非常小的sigma,y方向上更大)。确切的参数化将取决于您的输入数据,但应该很容易通过实验找到合适的值,这样所有字母都只能产生一个CC。
另一种方法是分析与其他CC呈现水平重叠的CC,并合并重叠超过某个相对阈值的那些对。
# Anisotropic Gaussian
from scipy.ndimage.filters import gaussian_filter
filtered = gaussian_filter(f, (2,0))
plt.imshow(filtered, cmap=plt.cm.gray)
# Now threshold
bin = filtered < 1
plt.imshow(bin, cmap=plt.cm.gray)
很容易看出每个角色现在只用一个CC来表示。现在我们几乎只需要应用每个蒙版并裁剪白色区域,最后得到每个角色的边界框。标准化它们的大小后,我们可以直接将它们提供给分类器(考虑到我们丢失了上升/下降线信息以及宽度/高度比,但这些可能对分类器有用;因此它应该有助于将它们明确地输入到分类器中除了规范化的边界框内容之外的分类器)。