首頁 > 軟體

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

2021-11-25 19:00:54

導讀

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


IT145.com E-mail:sddin#qq.com