Python OpenCV удалить шум с капчи - PullRequest
0 голосов
/ 08 мая 2018

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

Я использую python и opencv. Я новичок в решении обработки изображений. После поиска, в качестве способа разрешения капчи я придумал следующий. Поскольку текст в Captha использует группу связанных цветов, я пытаюсь использовать формат и маску HSV, затем конвертировать изображение в оттенки серого и использовать Threshold (Adaptive_THRESH_MEAN_C) для удаления шума из изображения.

Но этого недостаточно, чтобы убрать шум и обеспечить автоматическое распознавание текста с помощью OCR (Tesseract). Смотрите изображения ниже.

Что я могу улучшить в своем решении или есть лучший способ?

Исходные изображения:

captcha1 captcha2

Обработанные изображения:

captcha1 captcha2

Код:

import cv2
import numpy as np

img = cv2.imread("1.jpeg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

mask = cv2.inRange(hsv, (36, 0, 0), (70, 255,255)) #green
# mask = cv2.inRange(hsv, (0, 0, 0), (10, 255, 255))
# mask = cv2.inRange(hsv, (125, 0, 0), (135, 255,255))

img = cv2.bitwise_and(img, img, mask=mask)
img[np.where((img == [0,0,0]).all(axis = 2))] = [255,255,255]

img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 15, 2)

cv2.imwrite("out.png", img)

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы можете попробовать разные подходы для достижения своей цели: Ваше первое изображение может быть обработано с помощью медианного фильтра (r = 2) с последующим адаптивным порогом: Processed image with clear text

Бинарный вариант открытия - это еще один вариант, который можно попробовать: Processed image with clear text. Text is of lower quality than in image one.

Обратите внимание, что качество ниже, чем при первом подходе (особенно последний G заметно ухудшается).

Второе изображение реагирует на лечение иначе, чем первое:

Для медианного подхода:

enter image description here

Для открытия:

Second image

Тем не менее, можно извлечь текст с помощью медианного размытия (r = 1), с последующим автоконтрастом и затем с порогом 50:

Image two with significantly reduced noise

Как видите, можно улучшить качество ваших изображений, чтобы их можно было узнать. Первое изображение можно без проблем преобразовать в текст, а второе можно распознать только частично.

0 голосов
/ 08 мая 2018

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

import cv2

img = cv2.imread("input.jpg")
# smoothing the image
img = cv2.medianBlur(img, 5)

#edge detection    
edges = cv2.Canny(img, 100, 200)
cv2.imwrite('output.png', edges)

enter image description here enter image description here

enter image description here enter image description here

...