这个答案实现了我在评论中所说的。在
我对你的代码做了一点修改,用opencv避免了形式的变化。代码是用python3.5编写的
为了提取数字,我将图像按列求和并缩放结果数组以得到check。我在这里操作您已经剪切的gray图像,有效地去除了下划线。在x_sum = np.sum(gray, axis = 0)
check = ((x_sum)/np.max(x_sum)*10)
该数组现在可用于与阈值进行比较,以识别字母/数字所在的区域,例如:
^{pr2}$
现在,我们将使用此信息修改图像并删除check数组值为0的区域,例如:
^{3}$
因此我们有这样的形象:
你已经在做的事情还可以进一步处理。这提供了独立的字母/数字,然后可以进行后处理以供学习。在
下一步是缩放字母/图像的大小,这些字母/图像由相同数量的特征描述。在
最后,您可以使用预训练分类器来预测最可能的字母/数字。在
完整代码如下:import numpy as np
import os
import matplotlib.pyplot as plt
from scipy.stats import mstats
import scipy
from matplotlib import gridspec
from PIL import Image
image = Image.open("testl.png")
f = image.convert('I')
gray = np.array(f)
gray[gray<200] = 0
gray[gray>=200] = 255
gray = gray[~np.all(gray == 255, axis=1)]
gray = gray[:,~np.all(gray == 255, axis=0)]
gray = gray[~np.all(gray == 0, axis=1)]
plt.imshow(gray, cmap='gray')
x_sum = np.sum(gray, axis = 0)
check = ((x_sum)/np.max(x_sum)*10)
plt.plot((check<8).astype(int))
plt.show()
plt.matshow(gray)
plt.show()
for idx,i in enumerate((check<8).astype(int)):
if i < 1:
gray[:,idx] = 255
plt.matshow(gray)
plt.show()
words = np.hsplit(gray, np.where(np.all(gray >= 200,axis=0))[0])
gs = gridspec.GridSpec(1,len(words))
fig = plt.figure(figsize=(len(words),1))
i = 0
for word in words:
word = word[:,~np.all(word >= 230, axis=0)]
if(word.size):
ax = fig.add_subplot(gs[i])
print (word.shape)
i = i + 1
ax.matshow(word, aspect = 'auto')
plt.show()
最后生成所有独立的字母/数字,例如: