本文共 1814 字,大约阅读时间需要 6 分钟。
本文将介绍两种去除图片水印的方法,重点分析如何在保留文本原始色彩的前提下有效去除水印。
在OpenCV中,常用的去除水印方法是inpaint,通过图像修复来去除水印。然而,这种方法在处理含有文本的图片时效果不佳,因为修复过程会破坏文字信息。因此,我们需要更专门的方法来处理这种情况。
通过对比图片中的水印、文字和文本区域的RGB值,我们发现水印和文本的像素值存在明显差异。利用这一特性,我们可以通过调整对比度和亮度来去除水印。
Python-OpenCV 实现代码:
import cv2import numpy as npimg = cv2.imread("mark.jpg")alpha = 2.0 # 对比度调整系数beta = -165 # 亮度调整系数result = alpha * img + betaresult = np.clip(result, 0, 255).astype(np.uint8)cv2.imwrite("result.png", result)print('Done!') C++ OpenCV 实现代码:
#include#include using namespace std;using namespace cv;int main() { Mat src = imread("mark.jpg"); if (src.empty()) { cout << "src img load failed!" << endl; return 1; } imshow("src", src); Mat result = 2.0 * src - 165; imshow("result", result); waitKey(); imwrite("result.png", result); return 0;}
这种方法在去除水印时效果不错,但存在以下不足:
为了更好地保留文本原始色彩,我们可以使用inRange方法获取水印区域,然后将其替换为原始文本颜色。
代码实现:
import numpy as npimport cv2img = cv2.imread("kk.jpg")font = cv2.FONT_HERSHEY_SIMPLEX# 设定颜色范围(这里设定为白色区域)lower_hsv = np.array([160, 160, 160])upper_hsv = np.array([255, 255, 255])mask = cv2.inRange(img, lower_hsv, upper_hsv)# 调整mask以减少噪声mask = cv2.GaussianBlur(mask, (1, 1), 0)for i in range(img.shape[0]): for j in range(img.shape[1]): if mask[i, j] == 255: img[i, j] = [255, 255, 255]cv2.imwrite('res.jpg', img)print('Done!') 这种方法在去除水印的同时,较好地保留了文本的原始色彩。对比结果表明,文字颜色变化最小,效果更优。
选择哪种方法取决于具体图片特点和对效果的要求。
文章结束,感谢阅读。如果有任何问题或建议,请在评论区留言!
转载地址:http://wrsfk.baihongyu.com/