Разделение рукописного числа, соприкасающегося друг с другом, с помощью openCV в Python для предварительной обработки MNIST - PullRequest
0 голосов
/ 11 апреля 2019

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

Вот шаги, которые я сделал до сих пор. Это хорошо работает с изображением, которое имеет хорошо разделенное число, но не с числом, касающимся друг друга. Одно из изображений, которое я пытаюсь решить:

One of the image i try to solve

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

Мой фактический код:

import cv2
import numpy as np


# 3 - detect and extract ROI's
#image = cv2.imread('imgs/01.jpg')
#image = cv2.imread('imgs/03.jpg')
image = cv2.imread('imgs/01_tresh_210.jpg')
#cv2.imshow('i', image)
#cv2.waitKey(0)

# grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
cv2.waitKey(0)

# binary
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('thresh', thresh)
cv2.waitKey(0)

# dilation
kernel = np.ones((10, 1), np.uint8)  # values set for this image only - need to change for different images
img_dilation = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow('dilated', img_dilation)
cv2.waitKey(0)

# find contours
im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# sort contours
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])

for i, ctr in enumerate(sorted_ctrs):
    # Get bounding box
    x, y, w, h = cv2.boundingRect(ctr)

    # Getting ROI
    roi = image[y:y + h, x:x + w]

    # show ROI
    #cv2.imshow('segment no:'+str(i),roi)
    cv2.imwrite('imgs\\roi\\{}.png'.format(i), roi)
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 0), 1)
    #cv2.waitKey(0)

    # save only the ROI's which contain a valid information
    if h > 20 and w > 75:
        cv2.imwrite('roi\\{}.png'.format(i), roi)

cv2.imshow('marked areas', image)
cv2.waitKey(0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...