• 本网豪情赞助商

  • login failed for display 0 ubuntuallowed_u
  • css设定文本超出一行或多行就隐藏并显示省略
  • css设定文本超出一行或多行就隐藏并显示省略
  • 微信小程序如何把接口调用成功的回调函数返回
  • CodeIgniter - 数据库的增删改查
  • php生成excel的三种方式
  • 小程序UI库推荐
  • 多个句子竖向排列
  • 美团,大众点评,58城市行政区域和商圈数据实
  • java.security.InvalidKeyException: Illega
  • h3>

    两种Python基于OpenCV的固定位置半透明水印去除方案


    文章摘要: 两种Python基于OpenCV的固定位置半透明水印去除方案


    文章TAG:

     

    OpenCV基础

    OpenCV(Open Source Computer Vision Library)是一个跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法

    环境搭建

    #python沙箱环境
    virtualenv opencvenv
    source opencvenv/bin/activate
    
    pip install cryptography ndg-httpsclient #某些python版本需要的几个兼容包
    
    pip install numpy #opencv的依赖
    
    #我这里直接pip安装pyopencv不成功
    #换其他方法,直接从yum包里拷贝opencv的python wrapper
    sudo yum install opencv-python
    cp /usr/lib64/python2.7/site-packages/cv* opencv_test/cvenv/lib64/python2.7/site-packages/
    

    opencv的常用操作

    # -*- coding: utf-8 -*-
    import cv2
    
    #矩阵形式读取图像为三维列表,每一维分别代表 行、列、像素,像素维度列表中依次为BGR三个颜色通道
    img = cv2.imread("test.jpg")
    
    print img.shape #利用numpy的shape方法显示图像矩阵的三维尺寸信息,例如:(533, 800, 3)
    
    img2 = img.copy() #复制图像
    cv2.imwrite('save.jpg', img2) #保存
    

    基于OpenCV的两种去水印方案

    1. 基于 inpaint 方法(网上的方法,处理质量较低)

    • 算法理论:基于Telea在2004年提出的基于快速行进的修复算法(FMM算法),先处理待修复区域边缘上的像素点,然后层层向内推进,直到修复完所有的像素点
    • 处理方式:由ui人员制作出黑底白色水印且相同位置的水印蒙版图(必须单通道灰度图),然后使用inpaint方法处理原始图像,具体使用时可把水印区放粗,这样处理效果会好点
    # -*- coding: utf-8 -*-
    import cv2
    
    src = cv2.imread('src.jpg')  # 默认的彩色图(IMREAD_COLOR)方式读入原始图像
    mask = cv2.imread('mask.jpg', cv2.IMREAD_GRAYSCALE)  # 灰度图(IMREAD_GRAYSCALE)方式读入水印蒙版图像
    
    # 参数:目标修复图像; 蒙版图(定位修复区域); 选取邻域半径; 修复算法(包括INPAINT_TELEA/INPAINT_NS, 前者算法效果较好)
    dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_TELEA)
    
    cv2.imwrite('result.jpg', dst)
    

    效果演示
    src图:
    src图像
    mask图:
    mask图像

    INPAINT_TELEA算法处理效果:
    telea算法
    INPAINT_NS算法处理效果:
    ns算法

    细致比较的话,INPAINT_TELEA算法处理,水印的隐去效果会稍好点

    2. 基于像素的反色中和(处理质量较高)

    参考自ps去水印原理,通过一张白底的反色水印图来中和原图水印

    # -*- coding: utf-8 -*-
    import cv2
    import numpy
    
    src = cv2.imread('src.jpg')
    mask = cv2.imread('mask.png')
    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('result.jpg', save)
    

    src图:
    输入图片说明
    反色水印图:
    输入图片说明
    输出效果图:
    输入图片说明

    © 著作权归作者所有