Получите более темные линии изображения, используя opencv

Как мы можем удалить более светлые линии изображения и получить только более темные линии?

На следующем изображении представлена ​​игра в судоку (взято из здесь). Adaptive Gaussian Thresholding дает действительно хороший результат, но также включает серые (более светлые) линии.

Примечание. Я пробовал использовать canny, но он также удаляет числа.

ее


person Ricardo Cristian Ramirez    schedule 30.08.2016    source источник


Ответы (1)


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

Следующий пример выполняется в моем ноутбуке iPython с python 3.4 и opencv 3.1-dev в Ubuntu 15.10:

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

image = cv2.imread('sudokubig.jpg', 0)

if image is None:
    raise ValueError('Image not found!')

# background equalization
max_value = np.max(image)
backgroundRemoved = image.astype(float)
blur = cv2.GaussianBlur(backgroundRemoved, (151,151), 50)
backgroundRemoved = backgroundRemoved/blur
backgroundRemoved = (backgroundRemoved*max_value/np.max(backgroundRemoved)).astype(np.uint8)


fig = plt.figure(figsize=(20, 20))
plt.subplot(311),plt.imshow(image, 'gray'),plt.title('Input'),plt.axis('off')
plt.subplot(312),plt.imshow(backgroundRemoved, 'gray'),plt.title('Background Removed'),plt.axis('off')

ret, thres = cv2.threshold(backgroundRemoved,130,255,cv2.THRESH_BINARY)

# remove horizontal lines
kernel = np.ones((4, 1),np.uint8)
dilation1 = cv2.dilate(thres, kernel, iterations = 1)

# remove vertical lines
kernel = np.ones((1, 4),np.uint8)
dilation2 = cv2.dilate(dilation1, kernel, iterations = 1)

kernel = np.ones((3, 3),np.uint8)
erosion = cv2.erode(dilation2, kernel, iterations = 1)

plt.subplot(313),plt.imshow(erosion, 'gray'),plt.title('Final'),plt.axis('off')
plt.show()

kernel = np.ones((1, 4),np.uint8)
dilation = cv2.dilate(dilation, kernel, iterations = 1)

kernel = np.ones((3, 3),np.uint8)
erosion = cv2.erode(dilation, kernel, iterations = 1)

fig = plt.figure() 
plt.imshow(erosion, cmap='gray'),plt.title('missmatch')
plt.show()

вывод jupyter

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

person Fabian    schedule 31.08.2016
comment
Вау идеально. Спасибо. - person Ricardo Cristian Ramirez; 31.08.2016