OpenCV中去除水印最常用的方法是inpaint,通过图像修复的方法来去除水印。本文将介绍另一种方法:利用对比度亮度变换去除水印,需要的朋友可以参考一下
导读
本文主要介绍使用OpenCV亮度/对比度变换来去除图片水印的实例。
背景介绍
OpenCV中去除水印最常用的方法是inpaint,通过图像修复的方法来去除水印,最终效果也要根据实际图像来看(时好时坏)。有些图像并不适用inpaint方法来去除水印,比如下面的这种包含文本的图像中的水印,即便提供了水印的mask图,修复后也会丢失文字信息,这并不是我们想要的。
那么问题来了,上面图像中的水印该如何去除?有没有一种通用方法,能很好去除这些水印?答案是:没有通用方法,只能具体问题具体分析!
实现步骤
仔细观察上面的图像并分析文本与水印的像素值不难发现,图中文本和水印的灰度值或者RGB值有明显差异:
【1】图案水印RGB值(取样值:239,236,253)
【2】文字水印RGB值(取样值:215,215,215)
【3】文本RGB值(取样值:114,112,125)
接下来对图像做对比度和亮度变换:
result = alpha * src - beta (alpha = 2.0, beta = -165)
提高对比度*2时水印消失,然后降低亮度做补偿:
Python-OpenCV实现代码:
import cv2
import numpy as np
img = cv2.imread("mark.jpg")
alpha = 2.0
beta = -165
result= alpha * img + beta
result= np.clip(result, 0, 255).astype(np.uint8)
cv2.imwrite("result.png", result)
C++ OpenCV实现代码:
#include <iostream>
#include <opencv2/opencv.hpp>
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;
}
运行结果图:
原图与结果图对比:
以上就是OpenCV利用对比度亮度变换实现水印去除的详细内容,更多关于OpenCV去水印的资料请关注编程学习网其它相关文章!
本文标题为:OpenCV利用对比度亮度变换实现水印去除
- Easyx实现扫雷游戏 2023-02-06
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- Qt计时器使用方法详解 2023-05-30
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言详解float类型在内存中的存储方式 2023-03-27
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- C语言qsort()函数的使用方法详解 2023-04-26
