Сегментирование связанных символов в изображении - PullRequest
0 голосов
/ 08 июня 2018

Моя цель - правильно сегментировать символы на изображении

Мое изображение выглядит так: 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 голосов
/ 08 июня 2018

Как уже рекомендовали люди в комментариях, лучшим вариантом является использование морфологических преобразований, таких как эрозия и раскрытие.Что касается размера ядра, вы можете сделать его функцией ширины ваших контуров или просто многократно повторять, применяя небольшое ядро ​​размером (3, 3) или (5,5).Я лично нашел этот учебник (на языке C ++, но концепция та же) простым и полезным.Что касается удаления шума из «5» и «M», вы не можете сделать это общим способом, который будет обобщать для всех возможных типов шума.Если у вас есть дополнительная информация о статистике ошибок или некоторая дополнительная информация (например, «шум» всегда проявляется в виде белых пикселей поверх текущего символа), это, конечно, проще и выполнимо.

...