我一直在开发ocr系统。我可以很容易地从图像中分割出行和单词,但Iam完全陷于字符分割。如何从这些块中提取字符。我在论坛上读了很多答案,但是它们已应用于两个字符之间有足够间距的文本。我尝试了直方图方法从单词中分离字符,但结果并不令人满意。 我的话看起来像这样。Image with characters touching eachother 和One more Sample。 通过进一步融合字符,阈值处理只会增加问题。如何细分这些字符。 这是我到目前为止所做的:函数接受二维列表,其中包含要分割的大小为500 * 500像素的单词:
import cv2
import numpy as np
def character_detector(words):
characters=[]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
for i in words:
j=i
l=[]
for k in j:
s=k
f=k
from cv2.ximgproc import THINNING_ZHANGSUEN
s = cv2.ximgproc.thinning(k,s,thinningType=THINNING_ZHANGSUEN )
s = cv2.dilate(s,kernel,iterations=3)
k = cv2.threshold(k,75,255,cv2.THRESH_OTSU)[1]
m = cv2.Canny(k,100,200)
k=k-m
i=0
while i<5:
m = cv2.Canny(k,100,200)
k = k-m
i+=1
y_sum = cv2.reduce(k, 0, cv2.REDUCE_AVG)
y_sum=y_sum[0]
y_avg = sum(y_sum)//500
hist =[]
for i in range(0,500):
if(y_sum[i]==0):
hist.append(False)
else:
hist.append(True)
j=1
y_start=0
y_end = 0
y_coord=[]
i=0
while i<500:
j=1
if not(hist[i]):
i=i+1
continue
else:
y_start = i
temp = i
j=0
while temp<500 and hist[temp]:
temp+=1
j+=1
i= i+j
y_end = y_start+j
y_coord.append((y_start,y_end))
for i in range (0,len(y_coord),1):
roi = f[0:500,y_coord[i][0]:y_coord[i][1]]
cv2.imshow('thresh',roi)
cv2.waitKey(0)
cv2.destroyAllWindows()