Быстро зациклить на пикселях NumPy - PullRequest
0 голосов
/ 30 ноября 2018

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

Цель состоит в том, чтобы удалить фон изображения и передать изображение в OCR..

Я пробовал 2 разных способа сделать это.

Метод 1:

По сути, я получаю среднее значение пикселя фона.А затем обведите все пиксели и проверьте, какие из них равны среднему фоновому пикселю.

    for x in range(0, w):
        for y in range(0, h):
            if Pixel(img[y, x]).compare(pixel, threshold):
                img[y, x] = 255
            else
                img[y, x] = 0

Функция сравнения проверит,>> / <= пиксель - / + пороговое значение.затем, если он вернет true, он изменит пиксель с белого на другой, а затем на черный. </p>

Это работает хорошо, однако это слишком медленно при использовании больших изображений.

Метод 2: Просто используйте opencvметод удаления фона.

Просто:

img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 41, 2)

Результаты: Подача нормального изображения: enter image description here

метод результата 1: enter image description here

метод результата 2: enter image description here

Подача инвертированного изображения: enter image description here

метод результата 1: enter image description here

метод результата 2: enter image description here

Первый метод - способ замедления, а второй - методработает только тогда, когда изображение имеет беловатый фон.

Мне это нужно для разных цветов фона.

Я нашел кое-что о векторизации массива numpy.Но не смог найти хороший пример по этому поводу.

1 Ответ

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

Чтобы ответить на вопрос с конкретным примером:

    #load an image as grayscale
    #get the background average pixel value, it out of the scope of this question, different methods to achieve
    bg_avg = get_bg_avg_px_val(img)
    th = 80

    background_mask = logical_and((bg_avg - th) <= img, img <= (bg_avg + th))
    text_mask = logical_or((bg_avg - th) >= img, img >= (bg_avg + th))
    img[selected] = 255
    img[text] = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...