分割图像中的连接字符

时间:2018-06-08 05:31:06

标签: python opencv image-processing ocr image-segmentation

我的目标是正确分割图像中的字符

我的图片如下所示:enter image description here

如何正确分割连接的B和W?我的代码似乎也发现750都连接在一起。我如何细分它们?

我必须申请哪种转型?我试过侵蚀但它没有帮助?如何为这样的图像选择内核大小?我该如何消除5和M上的噪音?

我应该对代码进行哪些更改才能正确分割和隔离每个字符? 代码:

img = cv2.imread('C:\\xx\\testimages\\X\\plate4.jpg', 0)
cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU,img)
image, contours, hier = cv2.findContours(img, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
contours = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0])
d=0
for ctr in contours:
    # Get bounding box
        x, y, w, h = cv2.boundingRect(ctr)
    # Getting ROI
        if w>20 and h>20 and w<60:       #Boundary conditions to isolate a character
            print(x, y, w, h)
            roi = image[y:y+h, x:x+w]
            #roi=cv2.resize(roi,(20,35))
            #kernel = np.ones((3,3), np.uint8)
            #roi = cv2.morphologyEx(roi, cv2.MORPH_CLOSE, kernel)
            #roi = cv2.erode(roi, kernel, iterations=1)
            # kernel_1=np.ones((1,1),np.uint8)
            # roi=cv2.dilate(roi,kernel,iterations=1)
            cv2.imshow('character: %d' % d, roi)
            cv2.imwrite('C:\\xx\\ValidationSet\\character_%d.png'%d, roi)
            cv2.waitKey(0)
            cv2.destroyAllWindows()
            d+=1

1 个答案:

答案 0 :(得分:0)

正如人们在评论中所建议的,最好的选择是使用形态变换,如侵蚀和开放。 关于内核大小,你可以使它成为轮廓宽度的函数,或者只是应用一个大小(3,3)或(5,5)的小内核迭代多次。我个人发现这个tutorial(在C ++中,但概念是相同的)简单而有用。 关于从“5”和“M”中去除噪声,您不能以通用的方式做到这一点,这将推广到所有可能类型的噪声。如果您有关于错误统计数据的更多信息或更多信息(例如“噪音”总是以当前字符顶部的白色像素的形式出现),那么当然更容易和可行。