如何从图像中删除点状水印?

时间:2019-06-01 06:48:18

标签: image opencv image-processing

我想自动化使用OCR将传真文档输入系统的任务。我尝试使用tesseract,但是发现不包含水印的部分可以被很好地识别,但是带有水印的部分几乎无法识别。

我想使用图像处理删除水印。此图像的水印通常由1x1黑色像素组成。

有办法摆脱这种水印吗?

示例文档(隐藏了敏感的个人信息):

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

水印(由1x1像素组成):

워터마크예시


编辑:另一个标记为重复的答案只是一个灰色的水印,但是我要处理的图像是二进制图像,因此图像和水印的颜色是黑色。因此,它不能以相同的方式进行处理,似乎必须以不同的方式进行处理。

2 个答案:

答案 0 :(得分:2)

您可以使用形态Closing操作。

仅在带有水印的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. 使用内核1x3在X方向上关闭
  2. 使用内核3x1沿Y方向关闭
  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

答案 1 :(得分:0)

由于删除文本数据时OCR不能正常工作,因此我对文本进行了处理,以使其不被删除,而没有留下一些水印。我最终使用了两个嵌套的for循环。

结果:

conda symbol

代码:

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