给你的图片加上盲水印

作者: Leonhwaa | 来源:发表于2017-08-24 19:53 被阅读0次

前言

水印,一般是指图片上印有文字的水印,比如发表在微博或者CSDN的图片都会自动打上肉眼可见的文字水印。像这种一般用于标识某张图片的出处或者用于声明版权。但是这样做会破坏掉原图,而且影响美观,比较粗暴。此处我想讨论的是另一种水印--盲水印。盲水印不仅仅用于图片,也可应用于像音频这种数据流。当然这篇文章只讨论图片上的应用。盲水印隐蔽性强,给水印数据进行编码过后不易被破解出来。这是它最大的优势。

盲水印原理

前一篇文章里面我写了关于傅立叶的c语言实现方式,盲水印的实现就和傅立叶相关,傅立叶变换可以把数据从时域转换到频域。而且过程可逆。盲水印就是在图像的频域上添加水印数据。再通过逆变换转回时域。区别是图片是二维数据,要把图片数据由时域转到频域需要用到二维傅立叶变换。
水印添加流程图如下:

流程图.png

图像的二维傅立叶变换

和一维数据不同,要想对图片进行频域转换就要使用二维傅立叶变换。
其实,只要实现了一维傅立叶变换,二维傅立叶变换就不会那么难:先对图像矩阵数据每一行进行傅立叶变换,再对每一列进行傅立叶变换即完成二维傅立叶变换。这里还是用一张常见的美女lena. 对lena(256*256)进行二维傅立叶变换如下图:

lena傅立叶变换并中心化的过程.png

对于分辨率很大的图片,DFT的效率很低,通常不会考虑,取而代之的是FFT,但是,FFT的条件是要保证图片的宽和高都是2的幂级数。但是通常生活中的图片一般都不满足这个条件。这时候我们就需要对图片的宽和高进行补0扩充直到满足条件为止。

图片频域数据特征如下图所示:

fft_pic.jpg
图片中明亮的部分就是低频部分,暗点的是高频部分。
一般为了展示会把频谱图低频的部分移到中心(上面手机拍的最右边的图)。频谱图是关于中心点对称的
由于傅立叶变换是可逆的,若一张图片进行补零扩大后,进行逆变换后再把它补零的部分进行裁剪就可以得到原图。

水印数据嵌入

为了让水印更加隐蔽,需要将水印像素按照一定的顺序打乱,再进行二维傅立叶变化,最后再让它叠加在需要加水印的图片的频域上。为了提高水印的安全性,规定这种打乱的顺序需要外界传入一个密钥,根据不同的密钥生成不同乱序的规则,而且过程是可逆的。

  • 乱序


    水印乱序.png
  • 水印的添加过程
水印添加过程.png

水印的提取

因为水印的添加是在原图的频域上进行叠加。我们只需要将原图和加了水印的图片分别进行傅立叶变换,最后通过减法则可提取出加密过的水印数据。通过已知的密钥可以逆推出打乱的规则,这样当我们从水印图片中提取出水印像素时,可以还原出水印像素的原序列。最后就可以得到原水印。

提取出的水印.png

代码实现

所有的OC实现方法都已经写成框架LHWatermark

嵌入水印:
    //初始化
    LHWatermarkProcessor *  processor = [[LHWatermarkProcessor alloc] initWidthImage:image config:[LHConfig defaultConfig]];
    __weak typeof(self) weakSelf = self;
    //把文字水印@"你的名字"添加到image中。 异步线程
    [processor addMarkText:@"你的名字"  result:^(UIImage *watermarkImage) {
        // block中返回加了水印的图片 主线程
        __strong typeof(weakSelf) strongSelf = weakSelf;
        strongSelf.topImgView.image = watermarkImage;
    }];
提取水印:
   UIImage *image = [UIImage imageNamed:ImageName];
     __weak typeof(self) weakSelf = self;
    // 分别传入原图像、加了水印的图像 。异步线程
    [LHWatermarkProcessor restoreImageWidthOriginImage:image watermarkImage:[UIImage imageWithContentsOfFile:_imagePath] config:[LHConfig defaultConfig] result:^(UIImage *markImage) {
         __strong typeof(weakSelf) strongSelf = weakSelf;
        // block中返回水印的图片 主线程
         strongSelf.bottomImgView.image = watermarkImage;
    }];

具体代码请转到本人GitHub,如果觉得对你有帮助不要吝惜你的start。如果哪位大神有更好的方案也请不必吝惜你的建议。
转载请注明出处。谢谢!

博客地址:here

参考资料:

知乎
图书馆查阅后不记得名字的某本书

相关文章

  • 给你的图片加上盲水印

    前言 水印,一般是指图片上印有文字的水印,比如发表在微博或者CSDN的图片都会自动打上肉眼可见的文字水印。像这种一...

  • 图片添加二维码水印教程

    本博客介绍一下用jdk awt实现图片加文字水印和图片水印的方法 一、图片文字水印 原来图片 加上文字水印后图片 ...

  • OpenCV-图像处理-频域手段添加盲水印

    [傅里叶变换算法及盲水印实现]盲水印,顾名思义就是看不见的水印。今天我们来说下频域加盲水印。相信大家做过图像处理的...

  • 一个生成随机水印的脚本

    一个需求是对图片加上一个随机水印,另外,如果图片是透明背景色则加上一个随机背景后再加水印.水印中的内容由代码中的C...

  • 水印

    图片水印文字 图片水印图片

  • 用python来给图片加水印

    有时候我想在图片上添加自己的水印来防止别人盗图,所以今天给大家分享如何用python给我们的图片添加上水印。我们先...

  • Inpaint :还在为图片有水印苦恼!墙裂推荐一款软件给你

    还在为图片有水印苦恼 墙裂推荐一款软件给你,让你轻松搞定图片水印 Inpaint 是一款可以从图片上去除不必要的物...

  • 盲水印

    以*CTF2018的misc题xp3为例子 附件下载地址https://github.com/aye-whiteh...

  • iOS给图片添加文字水印和图片水印

    加水印的方式有很多,比如给图片添加图片水印、文字水印,或者给视频添加图片水印、文字水印。本文首先讲解如何给图片添加...

  • 如何为图片加上精美的水印?

    文 | 刘星文 互联网上盗图比较猖獗,为自己的作品加上水印,能一定程度上保护自己的原创。 但如果水印不够美观,会大...

网友评论

    本文标题:给你的图片加上盲水印

    本文链接:https://www.haomeiwen.com/subject/cddorxtx.html