OpenCV利用對比度亮度變換實現水印去除

導讀

本文主要介紹使用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去水印的資料請關註WalkonNet其它相關文章!

推薦閱讀: