You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用OpenCV去除文档水印,阈值法无效求解决方案

文档水印去除解决方案

针对你提供的带有浅灰色重复水印的文档图片,阈值法失效的核心原因是水印与文字的灰度值区间重叠,无法通过简单二值化区分。以下是几种可行的解决方案:

方法1:单通道阈值过滤

利用浅灰色水印在RGB绿色通道中更接近白色背景的特性,精准分离文字与水印:

import cv2
import numpy as np

if __name__ == '__main__':
    img = cv2.imread("doc.jpg")
    # 提取绿色通道,放大文字与水印的灰度差异
    green_channel = img[:, :, 1]
    
    # 反向二值化:保留黑色文字,抑制浅灰色水印
    _, thresh = cv2.threshold(green_channel, 240, 255, cv2.THRESH_BINARY_INV)
    
    # 形态学开运算消除阈值处理产生的噪点
    kernel = np.ones((1, 1), np.uint8)
    processed_img = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
    
    cv2.imshow('Processed Image', processed_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

方法2:图像修复(Inpaint)

通过标记水印区域,用周边背景信息填充水印位置,适合水印分布在文字间隙的场景:

import cv2
import numpy as np

if __name__ == '__main__':
    img = cv2.imread("doc.jpg")
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 生成水印掩码:筛选灰度值接近白色背景的区域(即水印)
    mask = cv2.inRange(gray, 200, 250)
    # 膨胀掩码确保覆盖全部水印像素
    kernel = np.ones((2, 2), np.uint8)
    mask = cv2.dilate(mask, kernel, iterations=1)
    
    # 使用TELEA算法修复水印区域,保留文档原有排版
    result = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
    
    cv2.imshow('Inpaint Result', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

方法3:对比度增强后阈值处理

通过直方图均衡化提升整体对比度,让文字与水印的差异更显著,再进行二值化:

import cv2

if __name__ == '__main__':
    img = cv2.imread("doc.jpg")
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 直方图均衡化增强文字与水印的对比度
    enhanced_gray = cv2.equalizeHist(gray)
    _, thresh = cv2.threshold(enhanced_gray, 230, 255, cv2.THRESH_BINARY_INV)
    
    cv2.imshow('Enhanced Result', thresh)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果说明:针对你提供的图片,方法1能快速提取清晰的纯文字内容,方法2可保留文档背景的同时彻底去除水印,二者效果更突出。

内容的提问来源于stack exchange,提问作者bomboerick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:57:21