求助:使用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
相关产品推荐
相关产品推荐

