1. 程式人生 > >OpenCV—python 影象修復(去除水印)

OpenCV—python 影象修復(去除水印)

基於OpenCV的兩種去水印方案(不具有普適性)
可以使用深度學習方法來去修復影象

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

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

"""
cv2.inpaint(src, inpaintMask, 3, cv2.INPAINT_TELEA)
引數:
目標修復影象;
蒙版圖(定位修復區域);
選取鄰域半徑;
修復演算法(INPAINT_TELEA:基於快速行進演算法 演算法效果較好
        INPAINT_NS:基於流體動力學並使用了偏微分方程)
"""
import cv2 src_ = cv2.imread('1111.png') mask = cv2.imread('2222.png', cv2.IMREAD_GRAYSCALE) res_ = cv2.resize(src_,None,fx=0.6, fy=0.6, interpolation = cv2.INTER_CUBIC) mask = cv2.resize(mask,None,fx=0.6, fy=0.6, interpolation = cv2.INTER_CUBIC) dst = cv2.inpaint(res_, mask, 3, cv2.INPAINT_TELEA) cv2.
imshow('res_', res_) cv2.imshow('mask', mask) cv2.imshow('dst', dst) cv2.waitKey(0) cv2.destroyAllWindows()

在這裡插入圖片描述

二、基於畫素的反色中和(處理質量較高)

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

# -*- coding: utf-8 -*-
import cv2
import numpy

src = cv2.imread('1111.png')
mask = cv2.imread('2222.png')
src = cv2.resize(src,None
,fx=0.6, fy=0.6, interpolation = cv2.INTER_CUBIC) mask = cv2.resize(mask,None,fx=0.6, fy=0.6, interpolation = cv2.INTER_CUBIC) 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.imshow('src', src) cv2.imshow('mask', mask) cv2.imshow('save', save) cv2.waitKey(0) cv2.destroyAllWindows()

在這裡插入圖片描述

鳴謝
https://my.oschina.net/u/2400083/blog/732321
https://www.cnblogs.com/lgh344902118/p/7928054.html