【问题标题】:How to erase the dotting watermark from the image?如何从图像中删除点水印?
【发布时间】:2019-06-01 06:48:18
【问题描述】:

我想使用 OCR 自动执行将传真文档输入系统的任务。我尝试使用tesseract,但发现不包含水印的部分识别得很好,但是加水印的部分几乎无法识别。

我想使用图像处理来去除水印。不同寻常的是,这张图片的水印由 1x1 黑色像素组成。

有没有办法去掉这个水印?

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

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


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

【问题讨论】:

标签: image opencv image-processing


【解决方案1】:

您可以使用形态学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 来实现它...

结果:


以下解决方案可能更好:

  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);

结果:

【讨论】:

    【解决方案2】:

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

    结果:

    代码:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2013-12-13
      • 2015-11-14
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多