Сегментация символов номерного знака python opencv - PullRequest
0 голосов
/ 06 июня 2018

Я хочу выделить каждый символ на следующем изображении: enter image description here

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

Вот код, который я использую:

# Standard imports
import cv2
import numpy as np;

from PIL import Image
params = cv2.SimpleBlobDetector_Params()

# Change thresholds
params.minThreshold = 10;
params.maxThreshold = 200;

#Filter by Color

params.filterByColor=False
params.blobColor=255

# Filter by Area.
params.filterByArea = False
params.minArea = 50

# Filter by Circularity
params.filterByCircularity = False
params.minCircularity = 0.0785
#
# # Filter by Convexity
params.filterByConvexity = False
params.minConvexity = 0.87
#
# # Filter by Inertia
params.filterByInertia = False
params.minInertiaRatio = 0.01
# Read image
    im = cv2.imread("C:\\xx\\testimages\\bw_plate.jpg", cv2.IMREAD_GRAYSCALE)

cv2.threshold(im,200,255,cv2.THRESH_BINARY_INV,im)


# Set up the detector with default parameters.
detector = cv2.SimpleBlobDetector_create(params)

# Detect blobs.
keypoints = detector.detect(im)


# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0, 0, 255),
                                      cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show keypoints
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

Мой вывод с использованием следующего кода: enter image description here

Почему он не определяет 0 и 2 должным образом?Кроме того, как я могу создать отдельные файлы JPEG для каждого изолированного символа?

Реализация моего проекта на C ++ использует класс CblobResult , который выполнял сегментацию.Есть ли в Python эквивалентная библиотека?

Вот так должен выглядеть окончательный результат для каждого символа после сегментации: enter image description here

1 Ответ

0 голосов
/ 06 июня 2018

После удаления фоновых шумов вы можете ввести изображение следующим образом:

image

Затем вы можете получить то, что вы хотите, используя следующий код:

import cv2
img = cv2.imread('test4.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])
cv2.imshow("contours", img)
cv2.waitKey(0)
d=0
for ctr in contours:
    # Get bounding box
    x, y, w, h = cv2.boundingRect(ctr)
    # Getting ROI
    roi = image[y:y+h, x:x+w]

    cv2.imshow('character: %d'%d,roi)
    cv2.imwrite('character_%d.png'%d, roi)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    d+=1
...