Как стереть точечный водяной знак с изображения? - PullRequest
2 голосов
/ 01 июня 2019

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

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

Есть ли способ избавиться от этого водяного знака?

Пример документа (конфиденциальная личная информация в маске):

건강보험자격득실확인서_마스킹처리

Водяной знак (состоит из 1x1 пикселей):

워터마크예시


Редактировать:Другой ответ, помеченный как дубликат, является просто серым водяным знаком, но изображение, которое я хочу обработать, является двоичным изображением, поэтому цвет изображения и водяного знака - черный.Таким образом, он не может быть обработан таким же образом, и кажется, что он должен обрабатываться по-другому.

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

Вы можете использовать морфологическую операцию Закрытие .

Используйте закрытие только на ROI с водяным знаком.

Вот пример кода MATLAB:

I = rgb2gray(imread('kmyxE.png')); %Read the image and convert it to Grayscale.
J = I;

%Morphological closing with kernel size 3x3 (applyied only the area with the watermark).
J(720:1450, 480:1260) = imclose(I(720:1450, 480:1260), ones(3));

Я оставляю вам удовольствие реализовать это с помощью OpenCV ...

Результат:
enter image description here


Следующее решение может быть лучше:

  1. Закрыть в направлении X, используя ядро ​​1x3
  2. Закрыть в направлении Y, используя ядро ​​3x1
  3. Возьмите минимальное значение двух изображений.
I = rgb2gray(imread('kmyxE.png'));
J1 = I;
J2 = I;

%Morphological closing with kernel size 1x3 (applyied only the area with the watermark).
J1(720:1450, 480:1260) = imclose(I(720:1450, 480:1260), ones(1, 3));

%Morphological closing with kernel size 3x1
J2(720:1450, 480:1260) = imclose(I(720:1450, 480:1260), ones(3, 1));

%Keep the minimum of J1 and J2
J = min(J1, J2);

Результат:
enter image description here

0 голосов
/ 01 июня 2019

Поскольку при удалении текстовых данных распознавание не работало должным образом, я обработал текст, чтобы он не был удален, вместо того, чтобы оставить несколько водяных знаков.В итоге я использовал два вложенных цикла for.

результат:

enter image description here

код:

img = cv2.imread('masked.png')
img_bw = 255*(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) > 5).astype('uint8')
img_copy = np.copy(img_bw)

for x in range(1, 2146):
    for y in range(1, 1727):
        if img_bw[x][y] == 0 and \
                img_bw[x-1][y] == img_bw[x+1][y] == img_bw[x][y-1] == img_bw[x][y+1] == \
                img_bw[x-1][y-1] == img_bw[x-1][y+1] == img_bw[x+1][y-1] == img_bw[x+1][y+1] == 255:
            img_copy[x][y] = 255
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...