精华内容
下载资源
问答
  • 显性水印和不可见数字水印 显性水印(代码见最后) 获取要绘制的画布所在元素 获取浏览器的dpr(devicePixelRatio),将画布的宽度和高度乘以dpr, 否则绘制出来的画布会变得模糊 创建Image元素开始绘制原始图片 ...

    显性水印和不可见数字水印

    显性水印(代码见最后)

    1. 获取要绘制的画布所在元素

    2. 获取浏览器的dpr(devicePixelRatio),将画布的宽度和高度乘以dpr, 否则绘制出来的画布会变得模糊

    3. 创建Image元素开始绘制原始图片

    4. 绘制显性水印, 设置水印的样式, 水印位置设置在图片右下角

    不可见数字水印

    function getBitOffset(color):

    获取RGB中某一分量对应的位和偏移量

    图片编码
    function encodeImg(src):
    1. 获取画布元素的Context

    2. 画布宽高乘以dpr(devicePixelRatio)

    3. 绘制水印, 使用getImageData()方法获得水印的像素信息

    4. 绘制图片, 使用getImageData()方法获得图片的像素信息

    5. 调用mergeData()方法合并像素信息

    function mergeData(ctx, newData, color, originalData):

    ​ 1. 合并原始图片数据和数字水印的rgb数据.

    ​ 2. 对于规定的某一个RGB分量,

    ​ 采用将把没有水印信息的像素通过自增方式全改成偶数,

    ​ 把有水印信息的像素自增全改成奇数这种编码的方式编码图片

    1. 绘制合并后的图片
    图片解码
    function decodeImg(src,color):
    1. 同encodeImg()方法一样, 使用getImageData()方法获得图片的RGB信息
    2. 调用processData()方法
    function processData(ctx, originalData,color):
    1. 解码的方式与编码的方式相反
    2. 将非指定的RGB分量的所有信息置0(像素点置黑)
    3. 对于指定的RGB分量, 将偶数部分(非水印信息)的信息置0, 其他信息置为255
    4. 对于alpha通道的信息不处理

    结果如图

    显性水印和不可见数字

    代码

    未解决跨域问题, 不可从外部直接打开html, 需从IDE打开

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <title>watermark</title>
    
    </head>
    <style>
        html{
            margin:0;
            padding: 0;
        }
        .app{
            display: flex;
            justify-content: space-around;
            flex-wrap: wrap;
        }
        .canvas{
            height: 200px;
            width: 540px;
            margin-top: 50px;
        }
        img{
            height: 200px;
            width: 540px;
            margin-top: 50px;
        }
    
    </style>
    <body>
    <div class="app">
        <img src="../images/1.jpg">
        <canvas class="canvas" id="canvas-mark"></canvas>
        <canvas class="canvas" id="encode-mark"></canvas>
        <canvas class="canvas" id="encode-image"></canvas>
    
    </div>
    <script>
            //绘制显性水印
            var canvas_mark=document.getElementById("canvas-mark")
            var dpr = (scale = window.devicePixelRatio || 1);
            var rect = canvas_mark.getBoundingClientRect();
            canvas_mark.width = rect.width * dpr;
            canvas_mark.height = rect.height * dpr;
            canvas_mark.style.width = rect.width + "px";
            canvas_mark.style.height = rect.height + "px";
            let ctx=canvas_mark.getContext('2d');
            let img = new Image();
            img.onload = function () {
                ctx.drawImage(img, 0, 0, canvas_mark.width, canvas_mark.height);
                const txt = '@ ChenYin';
                ctx.fillStyle = '#fff';
                ctx.globalAlpha = 1;
                ctx.font = `12px 微软雅黑 light`;
                ctx.textAlign = 'right';
                ctx.fillText(txt, canvas_mark.width - 10, canvas_mark.height - 10);
            }
            img.src="../images/1.jpg"
    
            //绘制数字水印和数字水印结果图
    
            //获取RGB中某一分量对应的位和偏移量
            function getBitOffset(color) {
                let bit, offset;
    
                switch (color) {
                    case 'R':
                        bit = 0;
                        offset = 3;
                        break;
                    case 'G':
                        bit = 1;
                        offset = 2;
                        break;
                    case 'B':
                        bit = 2;
                        offset = 1;
                        break;
                }
                return [bit,offset];
            }
    
            //图片编码
            //合并原始图片数据和数字水印的rgb数据, 采用将把没有信息的像素全改成偶数, 把有信息的像素全改成奇数这种编码的方式
            function mergeData(ctx, newData, color, originalData) {
                let oData = originalData.data;
    
                let [bit,offset]=getBitOffset(color);
    
                for (var i = 0; i < oData.length; i++) {
                    if (i % 4 == bit) {
    
                        // 只处理目标通道
                        //把没有信息的像素全改成偶数
                        if (newData[i + offset] === 0 && (oData[i] % 2 === 1)) {
    
                            if (oData[i] === 255) {
                                oData[i]--;
                            } else {
                                oData[i]++;
                            }
                            //把有信息的像素全改成奇数
                        } else if (newData[i + offset] !== 0 && (oData[i] % 2 === 0)) {
                            // // 有信息的像素,该通道最低位置1,可以想想上面的斑点效果是怎么实现的
                            oData[i]++;
                        }
                    }
                }
                ctx.putImageData(originalData, 0, 0);
    
    
            }
    
            function encodeImg(src) {
                var textData;
                var can=document.getElementById('encode-mark');
                var dpr = (scale = window.devicePixelRatio || 1);
                var rect = canvas_mark.getBoundingClientRect();
                can.width = rect.width * dpr;
                can.height = rect.height * dpr;
                can.style.width = rect.width + "px";
                can.style.height = rect.height + "px";
    
    
                var ctx = can.getContext('2d');
                ctx.font = '30px Microsoft Yahei';
                ctx.fillText('ChenYin', 200, 120);
                textData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height).data;
                var img = new Image();
                // img.crossOrigin = '';
                var originalData;
                img.onload = function () {
                    // 获取指定区域的canvas像素信息
                    ctx.drawImage(img, 0, 0,can.width,can.height);
                    originalData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
                    mergeData(ctx, textData, 'G', originalData)
                };
                img.src = src;
            }
    
            //图片解码
            function processData(ctx, originalData,color) {
                let data = originalData.data;
                let [bit,offset]=getBitOffset(color);
                for (var i = 0; i < data.length; i++) {
                    if (i % 4 == bit) {
    
                        if (data[i] % 2 == 0) {
                            data[i] = 0;
                        } else {
                            data[i] = 255;
                        }
                    } else if (i % 4 == 3) {
                        continue;//alpha通道不处理
                    } else {
                        data[i] = 0;
                    }
                }
                // 将结果绘制到画布
                ctx.putImageData(originalData, 0, 0);
            }
    
            function decodeImg(src,color) {
                var encode_image = document.getElementById('encode-image')
                var dpr = (scale = window.devicePixelRatio || 1);
                var rect = canvas_mark.getBoundingClientRect();
                encode_image.width = rect.width * dpr;
                encode_image.height = rect.height * dpr;
                encode_image.style.width = rect.width + "px";
                encode_image.style.height = rect.height + "px";
                var ctx=encode_image.getContext('2d');
                var img = new Image();
                var originalData;
                img.onload = function () {
                    // 获取指定区域的canvas像素信息
                    ctx.drawImage(img, 0, 0);
                    originalData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
                    console.log(originalData)
                    processData(ctx, originalData,color)
                };
                img.src = src;
            }
            encodeImg('../images/1.jpg');
            decodeImg('../images/1-encode.png','G');
    
    
    </script>
    </body>
    
    </html>
    
    展开全文
  • 一种基于图像特征的自适应可见数字水印嵌入方法
  • 介绍了标准粒子群优化(SPSO)算法,在两种粒子群改进算法Gaussian Swarm和Fuzzy PSO的基础上提出了Cauchy粒子群优化(CPSO)算法,并将遗传算法中的变异操作引入粒子群优化,形成了动态概率变异Cauchy粒子群优化...
  • 数字水印可见不可见之分,可见的比如课件上印有学校校徽,微博发图片会水印上上传者的信息及微博logo等。 用java实现可见数字水印,草人主要是用到了java.awt包中的AlphaComposite类,当然在实现之前先介绍一下...

    数字水印有可见不可见之分,可见的比如课件上印有学校校徽,微博发图片会水印上上传者的信息及微博logo等。

    用java实现可见的数字水印,草人主要是用到了java.awt包中的AlphaComposite类,当然在实现之前先介绍一下AlphaComposite类:

    AlphaComposite类是关于两个目标重叠的混合处理类,此类实现的特定规则是 T. Porter 和 T. Duff 合著的 “Compositing Digital Images”, SIGGRAPH 84, 253-259 中描述的 12 条基本规则集。该类提供的一个getInstance的方法,其中的两个参数为rule和alpha,第二个参数将由调用者设置一个alpha值,即是透明度的设置,而第一个参数则是混合方式。此类扩展了 Porter 和 Duff 定义的方程,包含一个额外的因子。AlphaComposite 类的实例可以包含一个 alpha 值,在将该值用于混合方程之前,可以用它来修改不透明度和每个源像素的覆盖率。

    Porter和 Duff 的论文在混合方程的描述中使用了以下因子:

    以规则SRC_OVER为例,使用这些因子,Porter 和 Duff 定义了 12 种选择混合因子 Fs 和 Fd 的方法,从而产生了 12 种令人满意的可视效果。在对 12 个指定可视效果的静态字段的描述中,给出了具有确定 Fs 和 Fd 值的方程。SRC_OVER在目标色之上合成源色(Porter-Duff Source Over Destination 规则)。指定Fs = 1 和 Fd = (1-As),因此:

    Ar = As + Ad*(1-As)

    Cr = Cs + Cd*(1-As)

    该类扩展后一共有24中规则,定义了9个方法,由于草人的程序中用到了方法getInstance()就对之说明一下——

    •详细定义:public static AlphaComposite getInstance(int rule, float alpha)

    •功能:创建一个 AlphaComposite 对象,它具有指定的规则和用来乘源色 alpha 值的常量 alpha 值。在将源色与目标色合成前,要将源色乘以指定的 alpha 值。

    •参数:rule——合成规则,24种;alpha——将乘源色的 alpha 值的常量 alpha 值。alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字。

    •抛出:IllegalArgumentException - 如果 alpha 小于 0.0 或大于 1.0,或者 rule 是以下规则之一:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、 SRC_ATOP、DST_ATOP 或 XOR。

    更详细推荐AlphaCompositehttp类文档:http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/awt/AlphaComposite.html#hashCode()、

    Compositing Digital Images 论文:https://en.wikipedia.org/wiki/Alpha_compositing

    既然是图像处理,就先创建一个java2d对象

    
    
    1. Graphics2D g2d=image.createGraphics(); 
    2. //用源图像填充背景 
    3. g2d.drawImage(image, 00, image.getWidth(), image.getHeight(), nullnull); 

    然后为 Graphics2D 上下文设置 Composite后就可以将想要写入的文字或者图片写入源图片上

    AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);

    //为 Graphics2D 上下文设置 Composite。 Composite 用于所有绘制方法中,如 drawImage、

    //drawString、draw 和 fill。 它指定新的像素如何在呈现过程中与图形设备上的现有像素组合。

    g2d.setComposite(ac);

    完整代码(代码中注释足够了,就不多啰嗦)

    
    
    1. package cumt.zry.two; 
    2.  
    3. import java.awt.*; 
    4. import java.awt.image.BufferedImage; 
    5. import java.io.*; 
    6. import javax.imageio.*; 
    7.  
    8. public class Watermark2{ 
    9.     public Watermark2(){super();}; 
    10. /** 
    11.    * 在源图片上设置水印文字 
    12.   */ 
    13.     public void WordsToImage(String srcImagePath,float alpha, 
    14.             String font,int fontStyle,int fontSize,Color color, 
    15.             String inputWords,int x,int y,String imageFormat,String toPath) throws IOException{ 
    16.         FileOutputStream fos=null
    17.         try { 
    18.             //读取图片 
    19.             BufferedImage image = ImageIO.read(new File(srcImagePath)); 
    20.             //创建java2D对象 
    21.             Graphics2D g2d=image.createGraphics(); 
    22.             //用源图像填充背景 
    23.             g2d.drawImage(image, 00, image.getWidth(), image.getHeight(), nullnull); 
    24.              
    25.             //!!!! 
    26.             AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); 
    27.             //为 Graphics2D 上下文设置 Composite。 Composite 用于所有绘制方法中,如 drawImage、 
    28.             //drawString、draw 和 fill。 它指定新的像素如何在呈现过程中与图形设备上的现有像素组合。  
    29.             g2d.setComposite(ac);   
    30.              
    31.             //设置文字字体名称、样式、大小 
    32.             g2d.setFont(new Font(font, fontStyle, fontSize)); 
    33.             g2d.setColor(color);//设置字体颜色 
    34.             g2d.drawString(inputWords, x, y); //输入水印文字及其起始x、y坐标 
    35.             g2d.dispose(); 
    36.             //将水印后的图片写入toPath路径中 
    37.             fos=new FileOutputStream(toPath); 
    38.             ImageIO.write(image, imageFormat, fos); 
    39.         }  
    40.         //文件操作错误抛出 
    41.         catch (Exception e) { 
    42.            e.printStackTrace(); 
    43.         }finally
    44.             if(fos!=null){ 
    45.                 fos.close(); 
    46.             } 
    47.         } 
    48.     } 
    49.       
    50.     /** 
    51.        *  在源图像上设置图片水印   
    52.      */ 
    53.     public void ImageToImage(String srcImagePath,String appendImagePath, 
    54.             float alpha,int x,int y,int width,int height, 
    55.             String imageFormat,String toPath) throws IOException{ 
    56.             FileOutputStream fos = null
    57.         try { 
    58.             //读图 
    59.             BufferedImage image = ImageIO.read(new File(srcImagePath)); 
    60.             //创建java2D对象 
    61.             Graphics2D g2d=image.createGraphics(); 
    62.             //用源图像填充背景 
    63.             g2d.drawImage(image, 00, image.getWidth(), image.getHeight(), nullnull); 
    64.              
    65.             //关键地方 
    66.             AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); 
    67.             g2d.setComposite(ac); 
    68.              
    69.             BufferedImage appendImage = ImageIO.read(new File(appendImagePath)); 
    70.             g2d.drawImage(appendImage, x, y, width, height, nullnull); 
    71.             g2d.dispose(); 
    72.             fos=new FileOutputStream(toPath); 
    73.             ImageIO.write(image, imageFormat, fos); 
    74.         } catch (Exception e) { 
    75.            e.printStackTrace(); 
    76.         }finally
    77.             if(fos!=null){ 
    78.                 fos.close(); 
    79.             } 
    80.         } 
    81.     } 
    82.      
    83.     public static void main(String[] args) throws Exception 
    84.     { 
    85.         Watermark2 imageObj = new Watermark2(); 
    86.         //源图片路径 
    87.         String srcImagePath = "F:/27.jpg"
    88.         //水印图片路径 
    89.         String appendImagePath = "F:/logo.jpg"
    90.         // ---- 宋体 普通字体 77号字 红色 透明度0.4" 
    91.         float alpha = 0.4F; 
    92.         String  font = "宋体"
    93.         int fontStyle = Font.PLAIN; 
    94.         int fontSize = 77
    95.         Color color = Color.RED; 
    96.          
    97.         String inputWords = "图片上设置水印文字"
    98.         int x = 1700
    99.         int y = 77
    100.         String imageFormat = "jpg"
    101.         //水印文字后的存储路径 
    102.         String wToPath = "F:/31.png"
    103.         //水印图片后的存储路径 
    104.         String IToPath = "F:/7.png" ; 
    105.         imageObj.WordsToImage(srcImagePath, alpha, font, fontStyle, 
    106.                 fontSize, color, inputWords, x, y, imageFormat, wToPath);  
    107.         imageObj.ImageToImage(srcImagePath, appendImagePath, alpha,  
    108.                 x, y, 300200, imageFormat, IToPath); 
    109.          
    110.          
    111.     } 

    实现预览:



    作者:半透明的稻草人

    来源:51CTO

    展开全文
  • 数字水印

    千次阅读 2018-07-16 17:55:37
    数字水印(Digital Watermarking) [1] 技术是将一些标识信息(即数字水印)直接嵌入数字载体当中(包括多媒体、文档、软件等)或是间接表示(修改特定区域的结构),且影响原载体的使用价值,也容易被探知和...

    数字水印(Digital Watermarking) [1]  技术是将一些标识信息(即数字水印)直接嵌入数字载体当中(包括多媒体、文档、软件等)或是间接表示(修改特定区域的结构),且不影响原载体的使用价值,也不容易被探知和再次修改。但可以被生产方识别和辨认。通过这些隐藏在载体中的信息,可以达到确认内容创建者、购买者、传送隐秘信息或者判断载体是否被篡改等目的。数字水印是保护信息安全、实现防伪溯源、版权保护的有效办法,是信息隐藏技术研究领域的重要分支和研究方向。

    中文名

    数字水印

    外文名

    Digital Watermarking [1] 

    目    的

    安全保护

    分    类

    鲁棒水印、脆弱水印

    特    性

    安全性,隐蔽性,鲁棒性/敏感性

    目录

    1. 特点
    2. 分类
    3. 特性
    1. 水印算法
    2. 应用领域
    3. 功能需求
    1. 发展历史

    特点

    编辑

    数字水印技术基本上具有下面几个方面的特点:

    ----安全性(Security):数字水印的信息应是安全的,难以篡改或伪造,同时,应当有较低的误检测率,当原内容发生变化时,数字水印应当发生变化,从而可以检测原始数据的变更;当然数字水印同样对重复添加有很强的抵抗性;

    ----隐蔽性(Invisibility):数字水印应是不可知觉的,而且应不影响被保护数据的正常使用;不会降质;

    ----鲁棒性(Robustness):该特性适用于鲁棒水印。是指在经历多种无意或有意的信号处理过程后,数字水印仍能保持部分完整性并能被准确鉴别。可能的信号处理过程包括信道噪声、滤波、数/模与模/数转换、重采样、剪切、位移、尺度变化以及有损压缩编码等;

    ----敏感性(Sensitivity):该特性适用于脆弱水印。是经过分发、传输、使用过程后,数字水印能够准确的判断数据是否遭受篡改。进一步的,可判断数据篡改位置、程度甚至恢复原始信息。

    分类

    编辑

    按特性划分

    ----按水印的特性可以将数字水印分为鲁棒数字水印和脆弱数字水印两类。鲁棒水印(Robust Watermarking)主要用于在数字作品中标识著作权信息,利用这种水印技术在多媒体内容的数据中嵌入创建者、所有者的标示信息,或者嵌入购买者的标示(即序列号)。在发生版权纠纷时,创建者或所有者的信息用于标示数据的版权所有者,而序列号用于追踪违反协议而为盗版提供多媒体数据的用户。用于版权保护的数字水印要求有很强的鲁棒性和安全性,除了要求在一般图像处理(如:滤波、加噪声、替换、压缩等)中生存外,还需能抵抗一些恶意攻击。

    ----脆弱水印(Fragile Watermarking),与鲁棒水印的要求相反,脆弱数字水印主要用于完整性保护和认证,这种水印同样是在内容数据中嵌入不可见的信息。当内容发生改变时,这些水印信息会发生相应的改变,从而可以鉴定原始数据是否被篡改。根据脆弱水印的应用范围,脆弱水印又可分为选择性和非选择性脆弱水印。非选择性脆弱水印能够鉴别出比特位的任意变化,选择性脆弱水印能够根据应用范围选择对某些变化敏感。例如,图像的选择性脆弱水印可以实现对同一幅图像的不同格式转换不敏感,而对图像内容本身的处理(如:滤波、加噪声、替换、压缩等)又有较强的敏感性,即:既允许一定程度的失真,又要能将特定的失真情况探测出来。

    按附载媒体划分

    ----按水印所附载的媒体,我们可以将数字水印划分为图像水印、音频水印、视频水印、文本水印以及用于三维网格模型的网格水印等。随着数字技术的发展,会有更多种类的数字媒体出现,同时也会产生相应的水印技术。

    按检测过程划分

    ----按水印的检测过程可以将数字水印划分为盲水印和非盲水印。非盲水印在检测过程中需要原始数据或者预留信息,而盲水印的检测不需要任何原始数据和辅助信息。一般来说,非盲水印的鲁棒性比较强,但其应用需要原始数据的辅助而受到限制。盲水印的实用性强,应用范围广。非盲水印中,新出现的半盲水印能够以少量的存储代价换来更低的误检率、漏检率,提高水印算法的性能。目前学术界研究的数字水印大多数是盲水印或者半盲水印。

    按内容划分

    ----按数字水印的内容可以将水印划分为有意义水印和无意义水印。有意义水印是指水印本身也是某个数字图像(如商标图像)或数字音频片段的编码;无意义水印则只对应于一个序列。有意义水印的优势在于,如果由于受到攻击或其他原因致使解码后的水印破损,人们仍然可以通过视觉观察确认是否有水印。但对于无意义水印来说,如果解码后的水印序列有若干码元错误,则只能通过统计决策来确定信号中是否含有水印。

    按用途划分

    ----不同的应用需求造就了不同的水印技术。按水印的用途,我们可以将数字水印划分为票证防伪水印、版权保护水印、篡改提示水印和隐蔽标识水印。

    ----票证防伪水印是一类比较特殊的水印,主要用于打印票据和电子票据、各种证件的防伪。一般来说,伪币的制造者不可能对票据图像进行过多的修改,所以,诸如尺度变换等信号编辑操作是不用考虑的。但另一方面,人们必须考虑票据破损、图案模糊等情形,而且考虑到快速检测的要求,用于票证防伪的数字水印算法不能太复杂。

    ----版权标识水印是目前研究最多的一类数字水印。数字作品既是商品又是知识作品,这种双重性决定了版权标识水印主要强调隐蔽性和鲁棒性,而对数据量的要求相对较小。

    ----篡改提示水印是一种脆弱水印,其目的是标识原文件信号的完整性和真实性。

    ----隐蔽标识水印的目的是将保密数据的重要标注隐藏起来,限制非法用户对保密数据的使用。

    按隐藏位置划分

    ----按数字水印的隐藏位置,我们可以将其划分为时(空)域数字水印、频域数字水印、时/频域数字水印和时间/尺度域数字水印。

    ----时(空)域数字水印是直接在信号空间上叠加水印信息,而频域数字水印、时/频域数字水印和时间/尺度域数字水印则分别是在DCT变换域、时/ 频变换域和小波变换域上隐藏水印。

    ----随着数字水印技术的发展,各种水印算法层出不穷,水印的隐藏位置也不再局限于上述四种。应该说,只要构成一种信号变换,就有可能在其变换空间上隐藏水印。

    按透明性划分

    按数字水印是否透明的性质,可分为可见水印和不可见水印两种。可见水印就是人眼能看见的水印,比如照片上标记的拍照的日期或者电视频道上的标识等。不可见水印就是人类视觉系统难以感知的,也是当前数字水印领域关注比较多的。

    特性

    编辑

    数字水印系统必须满足一些特定的条件才能使其在数字产品版权保护和完整性鉴定方面成为值得信赖的应用体系。一个安全可靠的水印系统一般应满足如下要求:

    (1) 隐蔽性

    也称不可感知性,即对于不可见水印处理系统,水印嵌入算法不应产生可感知的数据修改,也就是水印在通常的视觉条件下应该是不可见的,水印的存在不会影响作品的视觉效果。

    (2) 鲁棒性

    水印必须很难去掉(希望不可能去掉),当然在理论上任何水印都可以去掉,只要对水印的嵌入过程有足够的了解,但是如果对水印的嵌入只是部分了解的话,任何破坏或消除水印的企图都应导致载体严重的降质而不可用。

    (3) 抗篡改性

    与抗毁坏的鲁棒性不同,抗篡改性是指水印一旦嵌入到载体中,攻击者就很难改变或伪造。鲁棒性要求高的应用,通常也需要很强的抗篡改性。在版权保护中,要达到好的抗窜改性是比较困难的。

    (4) 水印容量

    嵌入的水印信息必须足以表示多媒体内容的创建者或所有者的标志信息,或是购买者的序列号。这样在发生版权纠纷时,创建者或所有者的信息用于标示数据的版权所有者,而序列号用于标示违反协议而为盗版提供多媒体数据的用户。

    (5) 安全性

    应确保嵌入信息的保密性和较低的误检测率。水印可以是任何形式的数据,比如数值、文本、图像等。所有的水印都包含一个水印嵌入系统和水印恢复系统。

    (6) 低错误率

    即使在不受攻击或者无信号失真的情况下,也要求不能检测到水印(漏检、false -negative) 以及不存在水印的情况下,检测到水印(虚检、false - positive) 的概率必须非常小。

    水印算法

    编辑

    近年来,数字水印技术研究取得了很大的进步,下面对一些典型的算法进行了分析,除特别指明外,这些算法主要针对图像数据(某些算法也适合视频和音频数据)。

    空域算法

    该类算法中典型的水印算法是将信息嵌入到随机选择的图像点中最不重要的像素位 (LSB:least significant bits)上,这可保证嵌入的水印是不可见的。但是由于使用了图像不重要的像素位,算法的鲁棒性差,水印信息很容易为滤波、图像量化、几何变形的操作破坏。另外一个常用方法是利用像素的统计特征将信息嵌入像素的亮度值中。

    Patchwork算法

    方法是随机选择N对像素点 (ai,bi) ,然后将每个ai点的亮度值加 1 ,每个bi点的亮度值减 1,这样整个图像的平均亮度保持不变。适当地调整参数,Patchwork方法对JPEG压缩、FIR滤波以及图像裁剪有一定的抵抗力,但该方法嵌入的信息量有限。为了嵌入更多的水印信息,可以将图像分块 [1]  ,然后对每一个图像块进行嵌入操作。

    变换域算法

    该类算法中,大部分水印算法采用了扩展频谱通信(spread spectrum communication)技术。算法实现过程为:先计算图像的离散余弦变换(DCT),然后将水印叠加到DCT域中幅值最大的前k系数上(不包括直流分量),通常为图像的低频分量。若DCT系数的前k个最大分量表示为D=,i=1 ,… ,k,水印是服从高斯分布的随机实数序列W =,i=1 ,… ,k,那么水印的嵌入算法为di = di(1 + awi),其中常数a为尺度因子,控制水印添加的强度。然后用新的系数做反变换得到水印图像I。解码函数则分别计算原始图像I和水印图像I*的离散余弦变换,并提取嵌入的水印W*,再做相关检验 以确定水印的存在与否。该方法即使当水印图像经过一些通用的几何变形和信号处理操作而产生比较明显的变形后仍然能够提取出一个可信赖的水印拷贝。一个简单改进是不将水印嵌入到DCT域的低频分量上,而是嵌入到中频分量上以调节水印的顽健性与不可见性之间的矛盾。另外,还可以将数字图像空间域数据通过离散傅里叶变换(DFT)或离散小波变换(DWT)转化为相应的频域系数;其次,根据待隐藏的信息类型,对其进行适当编码或变形;再次,根据隐藏信息量的大小和其相应的安全目标,选择某些类型的频域系数序列(如高频或中频或低频);再次,确定某种规则或算法,用待隐藏的信息的相应数据去修改前面选定的频域系数序列;最后,将数字图像的频域系数经相应的反变换转化为空间域数据。该类算法的隐藏和提取信息操作复杂,隐藏信息量不能很大,但抗攻击能力强,很适合于数字作品版权保护的数字水印技术中。

    1. 基于离散余弦变换的数字水印

    最早的基于分块DCT水印技术出现于E Koch,J Zhao的文献。针对静止图像和视频压缩标准(JPEG和MPEG),他们的水印方案中图像也被分成8×8的块,由一个密钥随机的选择图像的一些分块,在频域的中频上稍微改变一个三元组以隐藏二进序列信息。选择在中频分量编码是因为在高频编码易于被各种信号处理方法破坏,而在低频编码则由于人的视觉对低频分量很敏感,对低频分量的改变易于被察觉。未经授权者由于不知道水印嵌入的区域,因此是很难测出水印的,此外,该水印算法对有损压缩和低通滤波是鲁棒的。将图像分割成8×8块,并对每个块做DCT变换,然后随机选择构造所有块的一个子集,对子集的每一个块,选择一组频率并嵌入二进制水印信息。由于频率组的选择不是基于最显著分量,并且频率系数的方差较小,因此该方法对噪声、几何变形以及多文档攻击比较敏感。

    Cox等人于1995年提出了基于图像全局变换的水印方法,称之为扩频法。这也是目前大部分变换域水印算法中所用到的技术。它将满足正态分布的伪随机序列加入到图像的DCT变换后视觉最重要系数中,利用了序列扩频技术(SS)和人类视觉特性(HVS)。算法原理为先选定视觉重要系数,再进行修改,最常用的嵌入规则如下:

    其中分别是修改前和修改后的频域系数,α是缩放因子,是第i个信息位水印

    一般说来,乘法准则的抗失真性能要优于加法准则。水印的检测是通过计算相关函数实现的。从嵌入水印的图像中提取出是嵌入规则的逆过程,把提取出来的水印与原水印作相似性运算,与制定的阈值比较,可确定是否存在水印。这是稳健性水印的奠基性算法。

    Chiou-Ting Hsu等人提出一种基于分块DCT的水印,他们的水印是可辨识的图像,而不是简单的一个符号或一个随机数。通过有选择地修改图像的中频系数来嵌入水印。验证时,衡量提取出的水印同原水印之间的相似性来判断是否加入了水印

    2. 基于离散小波变换的数字水印

    与传统的DCT变换相比,小波变换是一种变分辨率的,将时域与频域相联合的分析方法,时间窗的大小随频率自动进行调整,更加符合人眼视觉特性。小波分析在时、频域同时具有良好的局部性,为传统的时域分析和频域分析提供了良好的结合[6]。

    目前,小波分析已经广泛应用于数字图像和视频的压缩编码、计算机视觉、纹理特征识别等领域。由于小波分析在图像处理上的许多特点可用于信息隐藏的研究,所以这种分析方法在信息隐藏和数字水印领域的应用也越来越受到广大研究者的重视,目前已经有很多比较典型的基于离散小波变换的数字水印算法。

    除了上述有代表性的变换域算法外,还有一些变换域水印算法,它们中有相当一部分是上述算法的改进及发展。

    总的来说,与空域的方法相比,变换域的方法具有如下优点:

    (1) 在变换域中嵌入的水印信号能量可以分布到空域的所有像素上,有利于保证水印的不可见性;

    (2) 在变换域,人类视觉系统(HVS) 的某些特性(如频率掩蔽特性)可以更方便地结合到水印编码过程中,因而其隐蔽性更好;

    (3) 变换域的方法可与国际数据压缩标准兼容,从而易实现在压缩域(compressed domain) 内的水印算法,同时也能抵抗相应的有损压缩

    压缩域算法

    基于JPEG、MPEG标准的压缩域数字水印系统不仅节省了大量的完全解码和重新编码过程,而且在数字电视广播及VOD(Video on Demand)中有很大的实用价值。相应地,水印检测与提取也可直接在压缩域数据中进行。下面介绍一种针对MPEG-2压缩视频数据流的数字水印方案。虽然MPEG-2数据流语法允许把用户数据加到数据流中,但是这种方案并不适合数字水印技术,因为用户数据可以简单地从数据流中去掉,同时,在MPEG-2编码视频数据流中增加用户数据会加大位率,使之不适于固定带宽的应用,所以关键是如何把水印信号加到数据信号中,即加入到表示视频帧的数据流中。对于输入的MPEG-2数据流而言,它可分为数据头信息、运动向量(用于运动补偿)和DCT编码信号块3部分,在方案中只有MPEG-2数据流最后一部分数据被改变,其原理是,首先对DCT编码数据块中每一输入的Huffman码进行解码和逆量化,以得到当前数据块的一个DCT系数;其次,把相应水印信号块的变换系数与之相加,从而得到水印叠加的DCT系数,再重新进行量化和Huffman编码,最后对新的Huffman码字的位数n1与原来的无水印系数的码字n0进行比较,只在n1不大于n0的时候,才能传输水印码字,否则传输原码字,这就保证了不增加视频数据流位率。该方法有一个问题值得考虑,即水印信号的引入是一种引起降质的误差信号,而基于运动补偿的编码方案会将一个误差扩散和累积起来,为解决此问题,该算法采取了漂移补偿的方案来抵消因水印信号的引入所引起的视觉变形。

    NEC算法

    该算法由NEC实验室的Cox等人提出,该算法在数字水印算法中占有重要地位,其实现方法是,首先以密钥为种子来产生伪随机序列,该序列具有高斯N(0,1)分布,密钥一般由作者的标识码和图像的哈希值组成,其次对图像做DCT变换,最后用伪随机高斯序列来调制(叠加)该图像除直流(DC)分量外的1000个最大的DCT系数。该算法具有较强的鲁棒性、安全性、透明性等。由于采用特殊的密钥,因此可防止IBM攻击,而且该算法还提出了增强水印鲁棒性和抗攻击算法的重要原则,即水印信号应该嵌入源数据中对人感觉最重要的部分,这种水印信号由独立同分布随机实数序列构成,且该实数序列应该具有高斯分布N(0,1)的特征。

    生理模型算法

    人的生理模型包括人类视HVS(HumanVisualSystem)和人类听觉系统HAS。该模型不仅被多媒体数据压缩系统利用,同样可以供数字水印系统利用。利用视觉模型的基本思想均是利用从视觉模型导出的JND(Just Noticeable Difference)描述来确定在图像的各个部分所能容忍的数字水印信号的最大强度,从而能避免破坏视觉质量。也就是说,利用视觉模型来确定与图像相关的调制掩模,然后再利用其来插入水印。这一方法同时具有好的透明性和强健性。

    应用领域

    编辑

    随着数字水印技术的发展,数字水印的应用领域也得到了扩展,数字水印的基本应用领域是防伪溯源、版权保护、隐藏标识、认证和安全隐蔽通信。

    当数字水印应用于防伪溯源时,包装、票据、证卡、文件印刷打印都是潜在的应用领域。用于版权保护时,潜在的应用市场在于电子商务、在线或离线地分发多媒体内容以及大规模的广播服务。数字水印用于隐藏标识时,可在医学、制图、数字成像、数字图像监控、多媒体索引和基于内容的检索等领域得到应用。数字水印的认证方面主要ID卡、信用卡、ATM卡等上面数字水印的安全不可见通信将在国防和情报部门得到广泛的应用。 多媒体技术的飞速发展和Internet的普及带来了一系列政治、经济、军事和文化问题,产生了许多新的研究热点,以下几个引起普遍关注的问题构成了数字水印的研究背景。

    数字作品的知识产权保护

    ----数字作品(如电脑美术、扫描图像、数字音乐、视频、三维动画)的版权保护是当前的热点问题。由于数字作品的拷贝、修改非常容易,而且可以做到与原作完全相同,所以原创者不得不采用一些严重损害作品质量的办法来加上版权标志,而这种明显可见的标志很容易被篡改。

    ----“数字水印”利用数据隐藏原理使版权标志不可见或不可听,既不损害原作品,又达到了版权保护的目的。目前,用于版权保护的数字水印技术已经进入了初步实用化阶段,IBM公司在其“数字图书馆”软件中就提供了数字水印功能,Adobe公司也在其著名的Photoshop软件中集成了Digimarc公司的数字水印插件。然而实事求是地说,目前市场上的数字水印产品在技术上还不成熟,很容易被破坏或破解,距离真正的实用还有很长的路要走。

    商务交易中的票据防伪

    ----随着高质量图像输入输出设备的发展,特别是精度超过 1200dpi的彩色喷墨、激光打印机和高精度彩色复印机的出现,使得货币、支票以及其他票据的伪造变得更加容易。

    ----另一方面,在从传统商务向电子商务转化的过程中,会出现大量过度性的电子文件,如各种纸质票据的扫描图像等。即使在网络安全技术成熟以后,各种电子票据也还需要一些非密码的认证方式。数字水印技术可以为各种票据提供不可见的认证标志,从而大大增加了伪造的难度。

    证件真伪鉴别

    ----信息隐藏技术可以应用的范围很广,作为证件来讲,每个人需要不只一个证件,证明个人身份的有:身份证、护照、驾驶证、出入证等;证明某种能力的有:各种学历证书、资格证书等。

    国内目前在证件防伪领域面临巨大的商机,由于缺少有效的措施,使得“造假”、“买假”、“用假”成风,已经严重地干扰了正常的经济秩序,对国家的形像也有不良影响。通过水印技术可以确认该证件的真伪,使得该证件无法仿制和复制。

    声像数据的隐藏标识和篡改提示

    ----数据的标识信息往往比数据本身更具有保密价值,如遥感图像的拍摄日期、经/纬度等。没有标识信息的数据有时甚至无法使用,但直接将这些重要信息标记在原始文件上又很危险。数字水印技术提供了一种隐藏标识的方法,标识信息在原始文件上是看不到的,只有通过特殊的阅读程序才可以读取。这种方法已经被国外一些公开的遥感图像数据库所采用。

    ----此外,数据的篡改提示也是一项很重要的工作。现有的信号拼接和镶嵌技术可以做到“移花接木”而不为人知,因此,如何防范对图像、录音、录像数据的篡改攻击是重要的研究课题。基于数字水印的篡改提示是解决这一问题的理想技术途径,通过隐藏水印的状态可以判断声像信号是否被篡改。

    隐蔽通信及其对抗

    ----数字水印所依赖的信息隐藏技术不仅提供了非密码的安全途径,更引发了信息战尤其是网络情报战的革命,产生了一系列新颖的作战方式,引起了许多国家的重视。

    ----网络情报战是信息战的重要组成部分,其核心内容是利用公用网络进行保密数据传送。迄今为止,学术界在这方面的研究思路一直未能突破“文件加密”的思维模式,然而,经过加密的文件往往是混乱无序的,容易引起攻击者的注意。网络多媒体技术的广泛应用使得利用公用网络进行保密通信有了新的思路,利用数字化声像信号相对于人的视觉、听觉冗余,可以进行各种时(空)域和变换域的信息隐藏,从而实现隐蔽通信。

    功能需求

    编辑

    隐蔽性或透明性(Imperceptible or Transparency)-原始图像在嵌入数字水印后的差异必须是人眼所无法察觉到的,也就是不能降低或破坏原始图像的品质。 不易移除性(Non-removable)-水印要设计得不容易甚至不可能被黑客移除。 鲁棒性(Robustness)-经过水印技术处理后的图像经由噪声、压缩处理、图像处理以及各种攻击后,所萃取的数字水印仍然可以清楚的体现以便于人眼辨识或判断。 明确性(Unambiguous)-提取的数字水印,经过各种攻击后,失真不会很严重,可以明确的让拥有者辨识或判断。

    发展历史

    编辑

    数字水印技术是从信息隐藏技术发展而来的,是数字信号处理,图像处理,密码学应用,算法设计等学科的交叉领域。数字水印最早在1993年由Tirkel等人提出,在国际学术会议上发表题为“Electronic watermark”的第一篇有关水印的文章,提出了数字水印的概念及可能的应用,并针对灰度图像提出了两种向图像最低有效位中嵌入水印的算法。1996年在英国剑桥牛顿研究所召开了第一届国际信息隐藏学术研讨会,标志着信息隐藏学的诞生。

    展开全文
  • 随着数字水印技术的发展,数字水印的应用领域也得到了扩展,数字水印的基本应用领域是版权保护、隐藏标识、认证和安全不可见通信。 当数字水印应用于版权保护时,潜在的应用市场在于电子商务、在线或离线地分发...
  • matlab实现对可见数字水印的添加提取 matlab实现对可见数字水印的添加提取 matlab实现对可见数字水印的添加提取
  • Java数字水印技术,包含所有主流数字水印技术的Java实现,数字水印权威专家编写,非常好的资料
  • 关于MATLAB数字水印的实验代码,课程设计可以用,可以运行。
  • 数字水印技术是目前信息安全技术领域的一个新方向,是一个在开放的网络环境下,保护...通过大量的仿真实验,证明本文算法在保证水印不可见性的同时,对常见的图像处理如JPEG压缩、噪声、滤波、剪切等,均有较好的鲁棒性
  • 一种基于WEB图像版权的可见&不可见水印算法,陈莹,王晓宁,本论文通过对网络上数字图像安全的分析,针对数字图像易于被拷贝和被篡改的现象,提出了网络上数字图像的水印方案。该数字水印
  • 随着网络技术和多媒体技术的飞速发展,如何保护多媒体信息的安全已成为国际上研究的热门话题,数字水印技术应运而生。作为保护数字作品版权的一种重要...该水印算法不可见性较好,对JPEG压缩,噪声,有较好的鲁棒性。
  • 数字水印学习

    2020-12-25 11:30:37
    https://www.zhihu.com/question/50677827 阿里巴巴内网的不可见水印用的是什么算法? 将以下代码保存为1.html,在浏览器中运行。点击按钮"显示数字水印"即可。 <!DOCTYPE html> <html> <head> ...

    https://www.zhihu.com/question/50677827 阿里巴巴内网的不可见水印用的是什么算法?

    将以下代码保存为1.html,在浏览器中运行。点击按钮"显示数字水印"即可。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    <script>
    function watermark(settings) {
    
      //默认设置
      var defaultSettings={
        watermark_txt:"text",
        watermark_x:20,//水印起始位置x轴坐标
        watermark_y:20,//水印起始位置Y轴坐标
        watermark_rows:5,//水印行数
        watermark_cols:5,//水印列数
        watermark_x_space:10,//水印x轴间隔
        watermark_y_space:90,//水印y轴间隔
        watermark_color:'#000000',//水印字体颜色
        watermark_alpha:0.5,//水印透明度
        watermark_fontsize:'80px',//水印字体大小
        watermark_font:'微软雅黑',//水印字体
        watermark_width:500,//水印宽度
        watermark_height:90,//水印长度
        watermark_angle:25//水印倾斜度数
      };
      //采用配置项替换默认值,作用类似jquery.extend
      if(arguments.length===1&&typeof arguments[0] ==="object" )
      {
        var src=arguments[0]||{};
        for(key in src)
        {
          if(src[key]&&defaultSettings[key]&&src[key]===defaultSettings[key])
            continue;
          else if(src[key])
            defaultSettings[key]=src[key];
        }
      }
    
      var oTemp = document.createDocumentFragment();
    
      //获取页面最大宽度
      var page_width = Math.max(document.body.scrollWidth,document.body.clientWidth);
      //获取页面最大长度
      var page_height = Math.max(document.body.scrollHeight,document.body.clientHeight);
    
      //如果将水印列数设置为0,或水印列数设置过大,超过页面最大宽度,则重新计算水印列数和水印x轴间隔
      if (defaultSettings.watermark_cols == 0 || (parseInt(defaultSettings.watermark_x + defaultSettings.watermark_width *defaultSettings.watermark_cols + defaultSettings.watermark_x_space * (defaultSettings.watermark_cols - 1)) > page_width)) {
        defaultSettings.watermark_cols = parseInt((page_width-defaultSettings.watermark_x+defaultSettings.watermark_x_space) / (defaultSettings.watermark_width + defaultSettings.watermark_x_space));
        defaultSettings.watermark_x_space = parseInt((page_width - defaultSettings.watermark_x - defaultSettings.watermark_width * defaultSettings.watermark_cols) / (defaultSettings.watermark_cols - 1));
      }
      //如果将水印行数设置为0,或水印行数设置过大,超过页面最大长度,则重新计算水印行数和水印y轴间隔
      if (defaultSettings.watermark_rows == 0 || (parseInt(defaultSettings.watermark_y + defaultSettings.watermark_height * defaultSettings.watermark_rows + defaultSettings.watermark_y_space * (defaultSettings.watermark_rows - 1)) > page_height)) {
        defaultSettings.watermark_rows = parseInt((defaultSettings.watermark_y_space + page_height - defaultSettings.watermark_y) / (defaultSettings.watermark_height + defaultSettings.watermark_y_space));
        defaultSettings.watermark_y_space = parseInt(((page_height - defaultSettings.watermark_y) - defaultSettings.watermark_height * defaultSettings.watermark_rows) / (defaultSettings.watermark_rows - 1));
      }
      var x;
      var y;
      for (var i = 0; i < defaultSettings.watermark_rows; i++) {
        y = defaultSettings.watermark_y + (defaultSettings.watermark_y_space + defaultSettings.watermark_height) * i;
        for (var j = 0; j < defaultSettings.watermark_cols; j++) {
          x = defaultSettings.watermark_x + (defaultSettings.watermark_width + defaultSettings.watermark_x_space) * j;
    
          var mask_div = document.createElement('div');
          mask_div.id = 'mask_div' + i + j;
          mask_div.appendChild(document.createTextNode(defaultSettings.watermark_txt));
          //设置水印div倾斜显示
          mask_div.style.webkitTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
          mask_div.style.MozTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
          mask_div.style.msTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
          mask_div.style.OTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
          mask_div.style.transform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
          mask_div.style.visibility = "";
          mask_div.style.position = "absolute";
          //选不中
          mask_div.style.left = x + 'px';
          mask_div.style.top = y + 'px';
          mask_div.style.overflow = "hidden";
          mask_div.style.zIndex = "9999";
          mask_div.style.pointerEvents = "none";
          //mask_div.style.border="solid #eee 1px";
          mask_div.style.opacity = defaultSettings.watermark_alpha;
          mask_div.style.fontSize = defaultSettings.watermark_fontsize;
          mask_div.style.color = defaultSettings.watermark_color;
          mask_div.style.textAlign = "center";
          mask_div.style.width = defaultSettings.watermark_width + 'px';
          mask_div.style.height = defaultSettings.watermark_height + 'px';
          mask_div.style.display = "block";
          oTemp.appendChild(mask_div);
        };
      };
      document.body.appendChild(oTemp);
    }
    </script>
    </head>
    <body>
    
    <h1>我的第一个 JavaScript 程序</h1>
    <p id="demo">这是一个段落</p>
    
    <button type="button" onclick="watermark({ watermark_txt:'hello'})">显示数字水印</button>
    
    </body>
    </html>
    
    展开全文
  • 数字水印技术的研究动态、概念、特点、典型算法及其受到的各种形式的攻击作了概括性介绍。 2.由数字图像水印的一般工作流程:嵌入水印、提取水印、攻击、再提取水印,分析和讨论了基于DWT小波变换的数字图像水印...
  • 数字水印简介

    千次阅读 2011-06-09 10:57:00
    数字水印(Digital Watermarking)技术是将一些标识信息(即数字水印)直接嵌入数字载体当中(包括多媒体、文档、软件等)或是间接表示(修改特定区域的结构),且影响原载体的使用价值,也容易被探知和再次修改。...
  • 数字水印技术可以保护来自入侵者的多媒体数据,例如文本,图像,音频和视频。 它将版权信息嵌入到多媒体内容中。 所有权标识和身份验证可保护内容免受攻击者的侵害。 二进制水印图像被加扰并嵌入到原始封面图像中。 ...
  • 本课题主要研究小波变换的数字水印的嵌入和提取的不可见性和鲁棒性,本文还根据人类视觉特性对嵌入系数强度进行调整,并总结了嵌入系数与不可见性和鲁棒性的关系。已经嵌有水印的图像能有良好的鲁棒性,有一定抵抗...
  • 基于matlab的数字水印嵌入 如果有调不通的可以在资源下留言 有空看到了就回复
  • java实现的对图片添加可视化的数字水印添加以及可见水印的添加与提取
  • 在分析一个SVD经典算法的基础上,提出了一种基于SVD和HVS的数字水印算法。该算法采用基于块系数关系的嵌入方法,同时为了解决不可见性和鲁棒性的矛盾,结合人类视觉系统的掩蔽特性嵌入水印。为了提高水印的安全性,...
  • 随着数字水印技术的发展,数字水印的应用领域也得到了扩展,数字水印的基本应用领域是版权保护、隐藏标识、和安全不可见通信。当数字水印应用于版权保护时,潜在的应用市场在于电子商务、在线或离线地分发多媒体内容...
  • 数字水印是一种嵌入到图像、视频或者音频数据中的不可见标志,通过对水印信息的检测可以达到保护多媒体数据版权的目的。先前众多的水印算法大部分是基于二维操作的(如静止图像、视频)。基于虚拟光学信息隐藏理论提出...
  • 数字水印的基本应用

    2020-11-07 21:37:42
    数字水印的基本应用领域是防伪溯源、版权保护、隐藏标识、认证和安全隐蔽通信。 当数字水印应用于防伪溯源时,包装、票据、证卡、文件印刷打印都是...数字水印的安全不可见通信将在国防和情报部门得到广泛的应用 ...
  • Java实现数字水印

    千次阅读 2015-07-31 11:03:42
    数字水印可见不可见之分,可见的比如课件上印有学校校徽,微博发图片会水印上上传者的信息及微博logo等。 用java实现可见数字水印,草人主要是用到了java.awt包中的AlphaComposite类,当然在实现之前先介绍一下...
  • 利用噪声可见性函数对对水印潜入功率进行自适应的容量分析
  • 提出非交换小波变换的快速算法,将非交换小波理论用于图像数字水印中,用误差自适应方法嵌入有意义水印,兼顾鲁棒性和不可见性的矛盾要求,且实现了水印盲提取。实验表明,采用该算法嵌入的水印对常见的图像处理和几何...
  • 将全息数字水印技术应用于防伪印刷无需添加任何新的材料,对设备和工艺也没有特殊的要求,同时还可提高水印的不可见性,其操作性较强。综述了空间域和变换域2类全息数字水印算法的研究现状,提出了现有全息数字水印方案...
  • LSB数字水印算法

    2015-11-04 14:01:41
    基于C#窗体程序编写的LSB数字水印算法,操作对象为任意的bmp格式图片。
  • 数字水印综述

    千次阅读 2007-01-12 20:31:00
    下午的工作,今天下午看了下面的几篇综述,关于数字水印的.-----------------------------------------------1....数字水印分类2.1 特性:可见,不可见2.2 载体方式:图象,音频,视频,文本,网格2.3 检测算法:非

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,425
精华内容 970
关键字:

不可见数字水印