精华内容
下载资源
问答
  • DCT水印算法

    2017-01-11 17:48:13
    DCT水印实现 Matlab
  • MATLAB DCT水印源程序代码
  • MATLAB DCT水印源程序代码
  • MATLAB DCT水印源程序代码
  • 这是一个DCT水印嵌入的程序,matlab编写,首先把图像分成8*8的小块,DCT变换,在高频部分嵌入水印,反变换,亲测效果很好,可以完美使用
  • 通过使用matlab实现了LSB和DCT水印,并比较其优缺点,内含图片。
  • 基于的DCT水印算法实现

    万次阅读 多人点赞 2015-10-26 20:38:11
    上学期帮同校本科的同学做了毕业设计的实验部分,用MATLAB实现DCT水印算法,并且包含了攻击测试。先讲一个大体概念,然后放出具体代码。一、DCTDCT(离散余弦变换),这里只以二维DCT为例。 信号经过DCT后,从空间...

    上学期帮同校本科的同学做了毕业设计的实验部分,用MATLAB实现DCT水印算法,并且包含了攻击测试。先讲一个大体概念,然后放出具体代码。

    一、DCT

    DCT(离散余弦变换),这里只以二维DCT为例。
    信号经过DCT后,从空间域变换到频域。是一种正交变换的方法。是图像处理中应用即为广泛的傅氏变换中一种特殊的情况(被展开函数是实偶函数,再离散化,即为离散余弦变换)。
    同傅氏变换一样,有正反两种变换。
    正DCT:从空间域变为频域。反DCT:从频域变为空间域。具体公式如下。

    正DCT:

    这里写图片描述
    其中:
    这里写图片描述

    反DCT

    这里写图片描述
    *f(x,y)是空间采样值,简单说,就是点(x,y)的像素值。F(u,v)是频域采样值。*

    二、水印算法

    水印,就好像给图片盖章,注明所有权。
    这里写图片描述
    具体的概念不多讲,若是想深入了解,可以自行百度。

    %图片加水印,提取出水印
    %林多
    %%%%%%%%%%%%%
    M=256; %原图像长度
    N=32; %水印图像长度
    K=8; %8x8的分块
    I=zeros(M,M);%创建一个MxM矩阵,元素全是0
    J=zeros(N,N);
    BLOCK = zeros(K,K);
    %显示原图像
    subplot(5,2,1);%显示多幅图像,在第一个位置显示
    I=imread('23.bmp');%将23.bmp读入I中
    imshow(I);%显示图像
    title('原始公开图像');%标题
    %显示水印图像
    subplot(5,2,2);
    J=imread('21.bmp');
    imshow(J);
    title('水印图像');
    %水印嵌入算法
    for p=1:N %从132循环
     for q=1:N %从132循环
      x=(p-1)*K+1; y=(q-1)*K+1;
      BLOCK=I(x:x+K-1,y:y+K-1);%取相应元素保存到BLOCKBLOCK=dct2(BLOCK);%二维离散余弦变换
      if J(p,q)==0 %如果元素为0
        a=-1;
      else
        a=1;
      end
      BLOCK=BLOCK*(1+a*0.03);  BLOCK=idct2(BLOCK);%反二维离散余弦变换
      I(x:x+K-1,y:y+K-1)=BLOCK;
     end
    end
    %显示嵌入水印后的图像
    subplot(5,2,3);
    imshow(I);
    title('嵌入水印后的图像');
    imwrite(I,'watermarked.bmp','bmp');%保存成watermarked.bmp
    I=imread('23.bmp');%未加水印的原图像
    P=imread('watermarked.bmp');%水印图像
    %提取水印算法
    for p=1:N
    for q=1:N
    x=(p-1)*K+1;
    y=(q-1)*K+1;
    BLOCK1=I(x:x+K-1,y:y+K-1);%赋给BLOCK1元素
    BLOCK2=P(x:x+K-1,y:y+K-1);%赋给BLOCK2元素
    BLOCK1=idct2(BLOCK1);%对其本身进行反二维离散余弦变换
    BLOCK2=idct2(BLOCK2);%对其本身进行反二维离散余弦变换
    a=BLOCK2(1,1)/BLOCK1(1,1)-1;
    if a<0
    W(p,q)=0;
    else
    W(p,q)=1;
    end
    end
    end
    %显示提取的水印
    subplot(5,2,4);
    imshow(W);
    title('从含水印图像中提取的水印');
    
    %----------攻击测试-----------------------%
    
    %----------中值攻击----------%
    P1=imread('watermarked.bmp');
    P1=double(P1(:,:,1));%取1通道
    P1=medfilt2(P1);%中值滤波
    subplot(5,2,5);
    imshow(P1,[]);
    title('中值滤波攻击');
    I1=imread('23.bmp');%未加水印的原图像
    %提取水印算法
    for p=1:N
    for q=1:N
    x=(p-1)*K+1;
    y=(q-1)*K+1;
    BLOCK1=I1(x:x+K-1,y:y+K-1);%赋给BLOCK1元素
    BLOCK2=P1(x:x+K-1,y:y+K-1);%赋给BLOCK2元素
    BLOCK1=idct2(BLOCK1);%对其本身进行反二维离散余弦变换
    BLOCK2=idct2(BLOCK2);%对其本身进行反二维离散余弦变换
    a=BLOCK2(1,1)/BLOCK1(1,1)-1;
    if a<0
    W1(p,q)=0;
    else
    W1(p,q)=1;
    end
    end
    end
    subplot(5,2,6);
    imshow(W1);
    title('从含中值滤波图像中提取的水印');
    
    %----------变小攻击----------%
    P2=imread('watermarked.bmp');
    P2=imresize(P2,0.5);%变为0.5倍,从256x256到128x128
    subplot(5,2,7);
    imshow(P2,[]);%显示变小后图像
    title('变小攻击,变为128x128像素');
    I2=imread('23.bmp');%未加水印的原图像
    I2=imresize(I2,0.5);%原图像一样变小
    %提取水印算法
    for p=1:32
    for q=1:32
    x=(p-1)*4+1;
    y=(q-1)*4+1;
    BLOCK1=I2(x:x+4-1,y:y+4-1);%赋给BLOCK1元素
    BLOCK2=P2(x:x+4-1,y:y+4-1);%赋给BLOCK2元素
    BLOCK1=idct2(BLOCK1);%对其本身进行反二维离散余弦变换
    BLOCK2=idct2(BLOCK2);%对其本身进行反二维离散余弦变换
    a=BLOCK2(1,1)/BLOCK1(1,1)-1;
    if a<0
    W2(p,q)=0;
    else
    W2(p,q)=1;
    end
    end
    end
    subplot(5,2,8);
    imshow(W2);
    title('从128x128图像中提取水印');
    
    %-------旋转攻击-------%
    P3=imread('watermarked.bmp');
    P3=imrotate(P3,90);%逆时针旋转90度;
    subplot(5,2,9);
    imshow(P3,[]);
    title('旋转攻击');
    I3=imread('23.bmp');%未加水印的原图像
    I3=imrotate(I3,90); %原图像逆时针旋转90度;
    %提取水印算法
    for p=1:N
    for q=1:N
    x=(p-1)*K+1;
    y=(q-1)*K+1;
    BLOCK1=I3(x:x+K-1,y:y+K-1);%赋给BLOCK1元素
    BLOCK2=P3(x:x+K-1,y:y+K-1);%赋给BLOCK2元素
    BLOCK1=idct2(BLOCK1);%对其本身进行反二维离散余弦变换
    BLOCK2=idct2(BLOCK2);%对其本身进行反二维离散余弦变换
    a=BLOCK2(1,1)/BLOCK1(1,1)-1;
    if a<0
    W3(p,q)=0;
    else
    W3(p,q)=1;
    end
    end
    end
    subplot(5,2,10);
    imshow(W3);
    title('从含旋转图像中提取的水印');

    这里写图片描述
    原图与加水印(右侧,仔细看)后的对比。
    这里写图片描述
    代码打包(附带实验图片):
    http://download.csdn.net/detail/zxc024000/9214845

    展开全文
  • DCT水印算法实现MATLAB

    2015-10-26 20:28:14
    基于DCT水印算法实现,MATLAB版。附带实验图片,可以直接运行。
  • 基于DCT水印算法实现,MATLAB版。附带实验图片,可以直接运行。
  • 包含加密m文件,解密m文件,两个函数,都已搞好,数字内容安全作业
  • python环境下的遥感图像dct水印提取

    千次阅读 2018-05-05 09:56:03
    插入在前面的文章 本文主要是提取算法,详细注释看插入算法import gdalimport numpyfrom skimage import data,img_as_float,img_as_ubyteimport cv2...#插入水印后的图片dataset = gdal.Open(filename)im_width =...
    插入在前面的文章 本文主要是提取算法,详细注释看插入算法

    import gdal
    import numpy
    from skimage import data,img_as_float,img_as_ubyte
    import cv2
    filename = "f:/bs/band_11_255_0.0075.tif"#插入水印后的图片
    dataset = gdal.Open(filename)
    im_width = dataset.RasterXSize #获取长
    im_height = dataset.RasterYSize #获取宽
    im_bands = dataset.RasterCount #获取通道数
    im_data = dataset.ReadAsArray(0,0,im_width,im_height)
    BLOCK = numpy.zeros([32,32])
    M = 3808
    N = 238
    K = 16
    I = numpy.zeros([M,M])
    I = im_data[2000:,2000:]
    filename = "f:/bs/band_1.tif"
    dataset = gdal.Open(filename)
    im_width = dataset.RasterXSize #获取长
    im_height = dataset.RasterYSize #获取宽
    im_bands = dataset.RasterCount #获取通道数
    P = dataset.ReadAsArray(0,0,im_width,im_height)
    P = P[2000:,2000:]W = numpy.zeros([N,N])
    for p in range(238):
    for q in range (238):
    x = p*K
    y = q*K
    BLOCK1 = P[x:x+K,y:y+K]
    BLOCK2 = I[x:x+K,y:y+K]
    BLOCK1 = img_as_float(BLOCK1) #转换unit8为float
    BLOCK2 = img_as_float(BLOCK2)
    BLOCK1 = cv2.dct(BLOCK1)
    BLOCK2 = cv2.dct(BLOCK2)
    a = BLOCK1[0][0]/BLOCK2[0][0]-1
    if a<0:
    W[p][q]=1
    else :
    W[p][q]=-1
    W = img_as_ubyte(W) #转换float为unit8
    format = "GTiff"driver = gdal.GetDriverByName(format)
    tods = driver.Create("f:/bs/water_wh_1_255_0.0075.bmp",238,238,1,options=["INTERLEAVE = PIXEL"])
    tods.WriteRaster(0,0,238,238,W.tostring(),238,238,band_list=[1])
    原图:
    插入水印后:
    水印:
    提取出的水印:


    展开全文
  • 毕设在做在Python环境下的遥感图像水印算法 最近看了挺多博客 下面是自己整理的 有瑕疵的话请大神指正 刚开始学 希望大家多交流我的水印用的是灰度图像 但是我处理以后只有0和255两个颜色 238*238我的遥感图像是6...
    
    
    毕设在做在Python环境下的遥感图像水印算法 最近看了挺多博客 下面是自己整理的 有瑕疵的话请大神指正 刚开始学 希望大家多交流
    我的水印用的是灰度图像 但是我处理以后只有0和255两个颜色 238*238
    我的遥感图像是6通道8431*7646

    import gdal
    import numpyfrom skimage
    import data,img_as_float,img_as_ubyte
    import cv2
    filename = 'f:/bs/band_1.tif' #打开原图片,我的遥感图像已经分好了波段 进行单波段的水印嵌入
    dataset = gdal.Open(filename) #打开文件
    im_width = dataset.RasterXSize #获取长
    im_height = dataset.RasterYSize #获取宽
    im_bands = dataset.RasterCount #获取通道数
    im_data = dataset.ReadAsArray(0,0,im_width,im_height) #将转化为数组 取长宽最大的16的倍数
    waterdata_3 = gdal.Open("f:/bs/water_wh_1_255.bmp") #打开水印图片
    im_water_data = waterdata_3.ReadAsArray(0,0,238,238) #将水印图片转化为数组
    M = 3808 #处理的图片必须为一个正方形 我将水印嵌入图像中部的3808*3808的正方形区域
    N = 238 #分成238块16*16的小正方形
    K = 16 #分成16*16
    I = numpy.zeros([M,M])
    J = numpy.zeros([N,N])I = im_data[2000:,2000:]
    J = im_water_dataBLOCK = numpy.zeros([K,K]) #处理数组信息暂存
    for p in range(238):
    for q in range(238):
    x = p*K
    y = q*K
    BLOCK = I[x:x+K,y:y+K]
    BLOCK = img_as_float(BLOCK) #由于cv2包的dct函数处理的数据类型是float 所以先进行格式转换
    BLOCK = cv2.dct(BLOCK)
    if J[p][q]==0:
    a=-1
    else:
    a=1
    BLOCK = BLOCK*(1+a*0.0075) #0.0075是插入水印的影响参数 越大水印在图片中越清晰
    BLOCK = cv2.idct(BLOCK) #dct处理
    for ii in range(K): #转换会unit8格式,float在python中是在-1和1之间
    for jj in range(K):
    if BLOCK[ii][jj]>1:
    BLOCK[ii][jj]=1
    BLOCK = img_as_ubyte(BLOCK) #转换回unit8
    I[x:x+K,y:y+K] = BLOCKim_data[2000:,2000:]=I
    format = "GTiff"
    driver = gdal.GetDriverByName(format)
    tods = driver.Create("f:/bs/band_11_255_0.0075.tif",im_width,im_height,1,options=["INTERLEAVE = PIXEL"])
    tods.WriteRaster(0,0,im_width,im_height,im_data.tostring(),im_width,im_height,band_list=[1])

    原图:

    插入水印后:
    水印图片:

    展开全文
  • 一、简介 低密度校验码(LDPC码)是一种前向纠错码,LDPC码最早在20世纪60年代由Gallager在他的博士论文中提出,但限于当时的技术条件,缺乏可行的译码算法,此后的35年间基本上被人们忽略,其间由Tanner在1981年...

    一、简介

    低密度校验码(LDPC码)是一种前向纠错码,LDPC码最早在20世纪60年代由Gallager在他的博士论文中提出,但限于当时的技术条件,缺乏可行的译码算法,此后的35年间基本上被人们忽略,其间由Tanner在1981年推广了LDPC码并给出了LDPC码的图表示,即后来所称的Tanner图。1993年Berrou等人发现了Turbo码,在此基础上,1995年前后MacKay和Neal等人对LDPC码重新进行了研究,提出了可行的译码算法,从而进一步发现了LDPC码所具有的良好性能,迅速引起强烈反响和极大关注。经过十几年来的研究和发展,研究人员在各方面都取得了突破性的进展,LDPC码的相关技术也日趋成熟,甚至已经开始有了商业化的应用成果,并进入了无线通信等相关领域的标准。

    1 LDPC码的特点

    LDPC码是一种分组码,其校验矩阵只含有很少量非零元素。正是校验矩阵的这种稀疏性,保证了译码复杂度和最小码距都只随码长呈现线性增加。除了校验矩阵是稀疏矩阵外,码本身与任何其它的分组码并无二致。其实如果现有的分组码可以被稀疏矩阵所表达,那么用于码的迭代译码算法也可以成功的移植到它身上。然而,一般来说,为现有的分组码找到一个稀疏矩阵并不实际。不同的是,码的设计是以构造一个校验矩阵开始的,然后才通过它确定一个生成矩阵进行后续编码。而LDPC的编码就是本文所要讨论的主体内容。

    译码方法是LDPC码与经典的分组码之间的最大区别。经典的分组码一般是用ML类的译码算法进行译码的,所以它们一般码长较小,并通过代数设计以减低译码工作的复杂度。但是LDPC码码长较长,并通过其校验矩阵H的图像表达而进行迭代译码,所以它的设计以校验矩阵的特性为核心考虑之一。

    1.2 LDPC码的构造

    构造二进制LDPC码实际上就是要找到一个稀疏矩阵H作为码的校验矩阵,基本方法是将一个全零矩阵的一小部分元素替换成1,使得替换后的矩阵各行和各列具有所要求的数目的非零元素。如果要使构造出的码可用,则必须满足几个条件,分别是无短环,无低码重码字,码间最小距离要尽可能大。

    1.3 Tanner图

    LDPC码常常通过图来表示,而Tanner图所表示的其实是LDPC码的校验矩阵。Tanner图包含两类顶点:n个码字比特顶点(称为比特节点),分别与校验矩阵的各列相对应和m个校验方程顶点(称为校验节点),分别与校验矩阵的各行对应。校验矩阵的每行代表一个校验方程,每列代表一个码字比特。所以,如果一个码字比特包含在相应的校验方程中,那么就用一条连线将所涉及的比特节点和校验节点连起来,所以Tanner图中的连线数与校验矩阵中的1的个数相同。以下图是矩阵
    在这里插入图片描述
    的Tanner图,其中比特节点用圆形节点表示,校验节点用方形节点表示,加黑线显示的是一个6循环:
    在这里插入图片描述
    Tanner图中的循环是由图中的一群相互连接在一起的顶点所组成的,循环以这群顶点中的一个同时作为起点和终点,且只经过每个顶点一次。循环的长度定义为它所包含的连线的数量,而图形的围长,也可叫做图形的尺寸,定义为图中最小的循环长度。如上图中,图形的尺寸,即围长为6,如加黑线所示。

    1.4 LDPC编码

    方法一:设H=[A | B],对H进行高斯消元可得到H=[I| P],设编码完成的码字为u=[c| s],其中c为监督位,s为信息位。因为Hu’ = uH’ = 0,可以得到Ic’ + Ps’ = 0 即 Ic’ = Ps’ (在GF(2)上),从而可求 c’ = P*s’。如果高斯消元过程中进行了列交换,则只需记录列交换,并以相反次序对编码后的码字同样进行列交换即可。解码时先求出u,再进行列交换得到u1=[c| s],后面部分即是想要的信息。
    在这里插入图片描述
    在这里插入图片描述
    1.5 LDPC码H矩阵的构造

    规则的LDPC码和非规则的LDPC码
    如果校验矩阵中各行非零元素的个数相同,各列中非零元素的个数也相同,这样的LDPC码称为规则码,与规则码对照,如果校验矩阵的各行中非零元素的个数不同或各列中非零元素个数不同,此时的LDPC码称为非规则的LDPC码。

    1.5.1 非规则的LDPC码
    构造方法:码率R=M/N=0.5,构造的H矩阵列重固定,而行重是随机的。下面通过一个大小为6*12,列重为2的H矩阵来说明。因为列重固定为2,所以其列坐标集合为[1,1,2,2,3,3,4,4…….12,12],而行坐标可以随机构造。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    1.5.2 规则的LDPC 码

    对于码率R=0.5的规则的LDPC码其行重与列重有关,行重是列重的2倍。以612的H矩阵为例,假设其列重为2,每列1的个数为2,总的1的个数为212=24,H矩阵有6行,行重相同则每行1的个数为24/6=4,即行重为4。假设其列重为3,其行重为6。

    构造方法:与构造行重类似,行重列重固定之后,其在矩阵中的位置坐标集合固定,如列重为2,行重为4,列坐标集合为[1,1,2,2,3,3,……],行坐标集合为[1,1,1,1,2,2,2,2,3,3,3,3,……],下面考虑的就是如何将行列坐标组合起来而不重复。这里采用的是保持行坐标集合不变,列坐标集合打乱重排。以构造大小5*10,列重为2,行重为4的H矩阵为例说明。

    1.6 LDPC译码

    Gallager 在描述 LDPC 码的时候,分别提出了硬判决译码算法和软判决译码算法两种。经过不断发展,如今的硬判决算法已在 Gallager 算法基础上进展很多,包含许多种加权比特翻转译码算法及其改进形式。硬判决和软判决各有优劣,可以适用于不同的应用场合。

    1.6.1 比特翻转算法(BF)

    硬判决译码算法最早是 Gallager 在提出 LDPC 码软判决算法时的一种补充。硬判决译码的基本假设是当校验方程不成立时,说明此时必定有比特位发生了错误,而所有可能发生错误的比特中不满足校验方程个数最多的比特发生错误的概率最大。在每次迭代时均翻转发生错误概率最大的比特并用更新之后的码字重新进行译码。具体步骤如下:
    在这里插入图片描述

    二、源代码

    close all;
    clc;
    clear all
    warning off
    %-----------------读入"隐藏的图片"---------------------
    I=imread('W.bmp');
    %-----------------------读入"载体图像"-------------------------
    cover_image=imread('lena.bmp');
    %------------------------------------------------------------------
    I0=rgb2gray(I);%灰度化
    
    cover_image=rgb2gray(cover_image);%灰度化
    [wm0,watermarked_image,wm]=ldpc_dct(I0,cover_image);%ldpc_dct嵌入提取
    e=wm0-wm;
    [m,n]=size(e);
    mse=sum((e(:).^2))/(m*n);
    psnr=10*log10(255^2/mse);%原始水印与提取水印的峰值信噪比
    % disp(['ldpc改进dct提取水印的峰值信噪比psnr=',num2str(psnr)])
    figure(1)
    subplot(221)
    imshow(cover_image);
    title('原图');
    subplot(222);
    imshow(I0);
    title('水印图');
    title('水印图');
    %显示嵌入水印后的图象
    subplot(223);
    uint8_watermarked_image=uint8(watermarked_image);
    imshow(uint8_watermarked_image)
    title('ldpc编码译码改进后嵌入水印图')  
    subplot(224);
    imshow(double(wm));
    title('ldpc编码译码改进后提取水印图')
    %% 剪切攻击
    I_jianqie=I0;%剪切图
    I_jianqie(20:30,20:40)=256;
    [wm_jianqie0,watermarked_image_jianqie,wm_jianqie]=ldpc_dct(I_jianqie,cover_image);%ldpc_dct嵌入提取
    e_jianqie=wm_jianqie0-wm_jianqie;
    [m,n]=size(e_jianqie);
    mse_jianqie=sum((e_jianqie(:).^2))/(m*n);
    psnr_jianqie=10*log10(255^2/mse_jianqie);%原始水印与提取水印的峰值信噪比
    % disp(['攻击后峰值信噪比psnr=',num2str(psnr_jianqie)])
    figure(2)
    subplot(221)
    imshow(cover_image);
    title('原图');
    subplot(222);
    imshow(I0);
    title('水印图');
    %显示嵌入水印后的图象
    subplot(223);
    uint8_watermarked_image_jianqie=uint8(watermarked_image_jianqie);
    imshow(uint8_watermarked_image_jianqie)
    title('剪切攻击后嵌入水印图')  
    subplot(224);
    imshow(double(wm_jianqie));
    title('剪切攻击后提取水印图')
    %% 高斯噪声
    I_gaosi=imnoise(I0,'gaussian',0,0.01);%高斯加噪
    [wm_gaosi0,watermarked_image_gaosi,wm_gaosi]=ldpc_dct(I_gaosi,cover_image);%ldpc_dct嵌入提取
    e_gaosi=wm_gaosi0-wm_gaosi;
    [m,n]=size(e_gaosi);
    mse_gaosi=sum((e_gaosi(:).^2))/(m*n);
    psnr_gaosi=10*log10(255^2/mse_gaosi);%原始水印与提取水印的峰值信噪比
    % disp(['高斯噪声攻击后峰值信噪比psnr=',num2str(psnr_gaosi)])
    figure(3)
    subplot(221)
    imshow(cover_image);
    title('原图');
    subplot(222);
    imshow(I0);
    title('水印图');
    
    %显示嵌入水印后的图象
    subplot(223);
    uint8_watermarked_image_gaosi=uint8(watermarked_image_gaosi);
    imshow(uint8_watermarked_image_gaosi)
    title('高斯噪声攻击后嵌入水印图')  
    subplot(224);
    imshow(double(wm_gaosi));
    title('高斯噪声攻击后提取水印图')
    %% 旋转攻击
    %%9.rotate 45 旋转
    I_xuanzhuan=imrotate(I0,45,'bilinear','crop');%旋转45[wm_xuanzhuan0,watermarked_image_xuanzhuan,wm_xuanzhuan]=ldpc_dct(I_gaosi,cover_image);%ldpc_dct嵌入提取
    e_xuanzhuan=wm_xuanzhuan0-wm_xuanzhuan;
    [m,n]=size(e_xuanzhuan);
    mse_xuanzhuan=sum((e_xuanzhuan(:).^2))/(m*n);
    psnr_xuanzhuan=10*log10(255^2/mse_xuanzhuan);%原始水印与提取水印的峰值信噪比
    % disp(['旋转攻击后峰值信噪比psnr=',num2str(psnr_xuanzhuan)])
    figure(4)
    subplot(221)
    imshow(cover_image);
    title('原图');
    subplot(222);
    imshow(I0);
    title('水印图');
    function H = makeLdpc(M, N, method, noCycle, onePerCol)
    % Create R = 1/2 low density parity check matrix
    %
    %  M        : Number of row
    %  N        : Number of column
    %  method   : Method for distributing non-zero element
    %             {0} Evencol : For each column, place 1s uniformly at random
    %             {1} Evenboth: For each column and row, place 1s uniformly at random
    %  noCyle   : Length-4 cycle
    %             {0} Ignore (do nothing)
    %             {1} Eliminate
    %  onePerCol: Number of ones per column
    %
    %  H        : Low density parity check matrix                   
    %
    %
    % Copyright Bagawan S. Nugroho, 2007 
    % http://bsnugroho.googlepages.com
    
    
    % Number of ones per row (N/M ratio must be 2)
    if N/M ~= 2
       fprintf('Code rate must be 1/2\n');
    end
    onePerRow = (N/M)*onePerCol;
    
    % fprintf('Creating LDPC matrix...\n');
    
    switch method
       % Evencol
       case {0}
          % Distribute 1s uniformly at random within column
          for i = 1:N
             onesInCol(:, i) = randperm(M)';
          end
            
          % Create non zero elements (1s) index
          r = reshape(onesInCol(1:onePerCol, :), N*onePerCol, 1);
          tmp = repmat([1:N], onePerCol, 1);
          c = reshape(tmp, N*onePerCol, 1);
          
          % Create sparse matrix H
          H = full(sparse(r, c, 1, M, N));
          
       % Evenboth
       case {1}
          % Distribute 1s uniformly at random within column
          for i = 1:N
             onesInCol(:, i) = randperm(M)';
          end
            
          % Create non zero elements (1s) index
          r = reshape(onesInCol(1:onePerCol, :), N*onePerCol, 1);
          tmp = repmat([1:N], onePerCol, 1);
          c = reshape(tmp, N*onePerCol, 1);
         
          % Make the number of 1s between rows as uniform as possible     
          
          % Order row index
          [r, ix] = sort(r);
          
          % Order column index based on row index
          for i = 1:N*onePerCol
             cSort(i, :) = c(ix(i));
          end
          
          % Create new row index with uniform weight
          tmp = repmat([1:M], onePerRow, 1);
          r = reshape(tmp, N*onePerCol, 1);
          
          % Create sparse matrix H
          % Remove any duplicate non zero elements index using logical AND
          S = and(sparse(r, cSort, 1, M, N), ones(M, N));
          H = full(S);     
          
    end % switch
    
    % Check rows that have no 1 or only have one 1
    for i = 1:M
       
       n = randperm(N);
       % Add two 1s if row has no 1
       if length(find(r == i)) == 0
          H(i, n(1)) = 1;
          H(i, n(2)) = 1;
       % Add one 1 if row has only one 1   
       elseif length(find(r == i)) == 1
          H(i, n(1)) = 1;
       end
    
    end % for i
    
    % If desired, eliminate any length-4 cycle
    if noCycle == 1
       
       for i = 1:M
          % Look for pair of row - column
          for j = (i + 1):M         
             w = and(H(i, :), H(j, :));
             c1 = find(w);
             lc = length(c1);
             if lc > 1
                           
                % If found, flip one 1 to 0 in the row with less number of 1s
                if length(find(H(i, :))) < length(find(H(j, :)))
                   % Repeat the process until only one column left 
                   for cc = 1:lc - 1
                      H(j, c1(cc)) = 0;
                   end
    

    三、运行结果

    在这里插入图片描述
    在这里插入图片描述

    四、备注

    版本:2014a

    展开全文
  • 共三个文件。一个文件夹,里面是源程序,一个DIP_Homework.exe可执行文件,如果要运行它.则必须安装.net framwork 2.0,可上网搜索一个下载安装即可。一个记事本,就是现在你看到的。 .net framework2.0参考下载地址...
  • %原始水印与提取水印的峰值信噪比 % disp(['ldpc改进dct提取水印的峰值信噪比psnr=',num2str(psnr)]) figure(1) subplot(221) imshow(cover_image); title('原图'); subplot(222); imshow(I0); title('水印图'); ...
  • DCT数字水印

    2013-04-10 23:31:52
    一直DCT数字水印的源代码!可以对64*64的黑白图像进行嵌入二维图像的水印
  • dct图像水印处理

    2012-03-17 19:57:53
    dct图像水印处理,基于图像预处理的DCT数字水印算法及其MATLAB实现
  • DCT数字水印实现

    2015-06-05 16:45:08
    DCT数字水印算法的matlab实现,该程序反映了DCT算法的强健性和鲁棒性。
  • DCT数字水印matlab源码

    2018-06-19 12:12:40
    DCT数字水印matlab源码,自己准备与代码中规格一样图片能够顺利运行
  • dct数字水印算法

    2015-05-25 08:42:15
    本算法基于DCT域,以图像为背景,以二进制比特位为水印,有提取有嵌入
  • vc++ dct 数字水印

    2011-05-27 21:52:15
    vc++ dct变换实现数字水印程序,~~~~~~
  • matlab DCT水印,去水印

    千次阅读 2019-06-02 20:16:57
    dct_img = dct2(img1); k1=2; k2=20; [rm,cm]=size(mark); after=dct_img; for f=1:rm for d=1:cm if mark(f,d)==0 k=k1; else k=k2; end after(f,d)=dct_img(f,d)+k; end end new_img = idct2(after); ...
  • 数字水印DCT

    2013-05-07 13:33:42
    数字水印 基于DCT的数字水印研究代码 可运行
  • 基于DCT域的数字水印matlab源码

    热门讨论 2008-12-28 22:03:26
    基本的DCT水印嵌入、提取,简单攻击和攻击之后水印的检测 相似度计算
  • DCT数字水印算法

    2014-04-04 20:37:50
    :近年来,随着数字与网络技术的发展,作为一...数字水印已成为国内外的研究热 点同时拥有广阔的应用前景。本文简要介绍了数字水印的概念、特点以及应用。同时列举了几种典型算法.最后对数 字水印的发展趋势进行了展望

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 671
精华内容 268
关键字:

dct水印