python利用opencv去除水印方法


OpenCV(Open Source Computer Vision Library)是一個跨平台計算機視覺庫,實現了圖像處理和計算機視覺方面的很多通用算法

在python中可以利用opencv來去除水印

opencv安裝

window10

OpenCV 3:http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

Numpy:http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

將下載好的whl文件放置到一個方便的目錄,打開cmd,安裝

pip install xxx

測試

import cv2

沒有報錯則說明成功

參考自https://www.ywlib.com/archives/39.html

下面開始去除水印, 使用58圖片做測試

基於OpenCV的兩種去水印方案

1. 基於 inpaint 方法(網上的方法,處理質量較低)

  • 算法理論:基於Telea在2004年提出的基於快速行進的修復算法(FMM算法),先處理待修復區域邊緣上的像素點,然后層層向內推進,直到修復完所有的像素點
  • 處理方式:由ui人員制作出黑底白色水印且相同位置的水印蒙版圖(必須單通道灰度圖),然后使用inpaint方法處理原始圖像,具體使用時可把水印區放粗,這樣處理效果會好點

需要帶水印的圖,和該圖一樣大小的的黑底白色水印且位置相同的水印圖

    test_dir = 'xxx'
    mask_dir = 'xxx'
    save_dir ='xxx'
    src = cv2.imread(rental_dir)
    mask = cv2.imread(wm_dir, cv2.IMREAD_GRAYSCALE)
    dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_TELEA)
    cv2.imwrite(save_dir, dst)

2. 基於像素的反色中和(處理質量較高)

參考自ps去水印原理,通過一張白底的反色水印圖來中和原圖水印

 需要到水印的圖,和該圖一樣大小的白底棕色(128,128,128)的水印且位置相同的水印圖,128的效果比較好

    test_dir = 'xxx'
    mask_dir = 'xxx'
    save_dir ='xxx'
    src = cv2.imread(test_dir)
    mask = cv2.imread(mask_dir)
    save = numpy.zeros(src.shape, numpy.uint8)
    for row in range(src.shape[0]):
        for col in range(src.shape[1]):
            for channel in range(src.shape[2]):
                if mask[row, col, channel] == 0:
                    val = 0
                else:
                    reverse_val = 255 - src[row, col, channel]
                    val = 255 - reverse_val * 256 / mask[row, col, channel]
                    if val < 0:
                        val = 0
                save[row, col, channel] = val
    cv2.imwrite(save_dir, save)

第二種方面明顯比第一種要好,但是水印的邊角處理不好,可以先用二在用一,效果會更好

參考自https://my.oschina.net/u/2400083/blog/732321


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM