OpenCV對比度亮度變換竟能用來去水印(附Python/C++源碼)

Color_Space 2022-01-07 17:05:10 阅读数:509

opencv 亮度 竟能 能用 水印


導讀

本文主要介紹使用OpenCV亮度/對比度變換來去除圖片水印的實例。

背景介紹

OpenCV中去除水印最常用的方法是inpaint,通過圖像修複的方法來去除水印,最終效果也要根據實際圖像來看(時好時壞)。有些圖像並不適用inpaint方法來去除水印,比如下面的這種包含文本的圖像中的水印,即便提供了水印的mask圖,修複後也會丟失文字信息,這並不是我們想要的。

OpenCV對比度亮度變換竟能用來去水印(附Python/C++源碼)_通用方法

那麼問題來了,上面圖像中的水印該如何去除?有沒有一種通用方法,能很好去除這些水印?答案是:沒有通用方法,只能具體問題具體分析!

實現步驟

仔細觀察上面的圖像並分析文本與水印的像素值不難發現,圖中文本和水印的灰度值或者RGB值有明顯差异:

【1】圖案水印RGB值(取樣值:239,236,253)

OpenCV對比度亮度變換竟能用來去水印(附Python/C++源碼)_OpenCV_02

【2】文字水印RGB值(取樣值:215,215,215)

OpenCV對比度亮度變換竟能用來去水印(附Python/C++源碼)_計算機視覺_03

【3】文本RGB值(取樣值:114,112,125)

OpenCV對比度亮度變換竟能用來去水印(附Python/C++源碼)_圖像去水印_04

接下來對圖像做對比度和亮度變換:

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)

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

運行結果圖:

OpenCV對比度亮度變換竟能用來去水印(附Python/C++源碼)_通用方法_05

原圖與結果圖對比:

OpenCV對比度亮度變換竟能用來去水印(附Python/C++源碼)_OpenCV_06

—THE END—


版权声明:本文为[Color_Space]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071705098816.html