сегментируйте каждый символ из шумного номера - PullRequest
0 голосов
/ 15 ноября 2018

Я выполняю проект по обнаружению номерного знака в Непале, в котором я обнаружил номерной знак на транспортном средстве и повернул номерной знак, но в результате получилось шумное изображение номерного знака.enter image description here

Я хочу знать, как сегментировать каждый символ из него, чтобы он мог быть отправлен для обнаружения части.Я пытался сделать это, но он просто сегментировал символы из второй строки.

def segment(image):
    H = 100.
    height, width, depth = image.shape
    imgScale = H/height
    newX,newY = image.shape[1]*imgScale, image.shape[0]*imgScale
    image = cv2.resize(image,(int(newX),int(newY)))

    cv2.imshow("Show by CV2",image)
    cv2.waitKey(0)
    cv2.imwrite("resizeimg.jpg",image)

    idx =0 
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    _,thresh = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)

    cv2.imshow("thresh",thresh)
    cv2.waitKey(0)

    # gray=cv2.cvtColor(plate,cv2.COLOR_BW2GRAY)
    _,contours,_ = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        idx += 1
        x,y,w,h = cv2.boundingRect(cnt)
        roi = image[y:y+h,x:x+w]
        if(w > 10 and h > 10):
            cv2.imwrite(str(idx) + '.jpg', roi)

1 Ответ

0 голосов
/ 16 ноября 2018

Предположим, у вас есть соотношение пластины и вы можете разрезать пластину пополам по оси Y.Слева направо: изображение обмолота, изображение morphologyEx, контуры.Примените то же самое с другой половиной.

thresh img

morphologyEx img

Contours

image = cv2.imread("1.PNG")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)
cv2.imshow("thresh",thresh)

element = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(5, 11))

morph_img = thresh.copy()
cv2.morphologyEx(src=thresh, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img)
cv2.imshow("morph_img",morph_img)


_,contours,_ = cv2.findContours(morph_img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
    r = cv2.boundingRect(c)
    cv2.rectangle(image,(r[0],r[1]),(r[0]+r[2],r[1]+r[3]),(0,0,255),2)

cv2.imshow("img",image)

cv2.waitKey(0)
cv2.destroyAllWindows()

Еще один способ сегментирования символов - найти сумму значений серого по оси X и Y.Вы можете легко увидеть, что есть 3 пика по оси x, которые представляют собой 3 символа, и 1 пик по оси y, где находятся ваши символы.

enter image description here

enter image description here

...