如何使用OpenCV隔离文本图像中的连接字符和融合字符

时间:2018-10-19 19:02:46

标签: image opencv histogram

我一直在开发ocr系统。我可以很容易地从图像中分割出行和单词,但Iam完全陷于字符分割。如何从这些块中提取字符。我在论坛上读了很多答案,但是它们已应用于两个字符之间有足够间距的文本。我尝试了直方图方法从单词中分离字符,但结果并不令人满意。 我的话看起来像这样。Image with characters touching eachotherOne 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()

0 个答案:

没有答案