实验1:图像处理基础及数字水印软件认识实验

1. 实验类别

        设计型实验:熟悉matlab在多媒体内容特别是图像处理方面的操作,并给出实验结果。

2. 实验目的

        了解matlab有关图像的基本操作,如图像的读写,显示等。掌握二维DFT变换、离散余弦变换及其物理意义。
        了解数字水印的原理,体验一些典型的数字水印软件,完成基于Bmp图像、Wav音频文件的水印嵌入和提取。

3. 实验条件

  • Windows等操作系统;
  • Matlab软件;
  • 图像库;
  • 音频文件。

4. 实验原理

点击查看         Matlab是广泛使用的一种可视化科学计算软件,它具有语法结构简单、数值计算高效、图形功能完备和图像处理方便的特点,是信号处理和信息隐藏处理中使用最多的软件。离散傅里叶变换、离散余弦变换和离散小波变换是图像、音视频信号处理的基础操作。时域信号转换到不同变换域以后,会导致不同程度的能量集中。
        自然形式下的图像是不能直接由计算机进行分析的,一幅图像在用计算机分析前必须先转化为数字形式。一幅二维平面图像可用一个二元函数I=f(x,y)来表示,(x,y)表示二维空间坐标系中的一个坐标点的位置,f表示相应实际物体在该点的某个性质的度量值,所有点的度量值的有序集合构成图像I。例如,对于一幅灰度图像,f表示灰度值,即相应物体在每个坐标点的明暗程度。一般认为,I=f(x,y)所表示的图像是连续的。为了能用计算机对图像处理,则将f,x,y的值域从实数域映射到整数域,离散化之后即为数字图像。离散化的方法就是从水平和垂直两个方向上同时进行采样,这些采样点称为像素。因此,可以用一个数字阵列来表示一幅图像。像素是构成图像的最小基本单位,图像的像素有两个基本的属性:像素位置和像素值两个属性。像素位置由像素所在的行和列的坐标值决定,即(x,y);像素值即该像素对应的亮度值。
        根据像素值的取值可以分为二值图像、灰度图、彩色图。二值图即黑白图,每个像素值取两个离散值(0或1)中的一个,0表示黑色,1表示白色。灰度图是包含灰度级的图像,灰度即亮度,一般用一个字节来表示,即灰度值的取值范围为0-255(0为黑色,255为白色,中间为灰色)。对于彩色图片,一个像素都用R、G、B三个分量来表示,每个分量都有256个亮度级,所以每个像素需要用3个字节来表示。因此,一个彩色图像可表示为I=f(x,y,z)(z=1时表示R分量,z=2时表示G分量,z=3时表示B分量)。

5. 实验要求

5.1.Matlab图像读取操作

        熟悉MATLAB语言中对图像数据读取,显示等基本函数。特别需要熟悉下列命令:熟悉imread()函数、imwrite()函数、size()函数、Subplot()函数、Figure()函数。

  1. 将文件夹中的lena_256.tiff图像文件读出。用到imread,imfinfo等函数,观察一下图像数据,了解一下数字图像在MATLAB中的处理就是处理一个矩阵。将这个图像显示出来(用imshow)。将新图像存储成bmp, png格式并显示出来(imwrite)

    1
    2
    3
    4
    5
    6
    7
    img = imread('lena_256.tiff');%读取
    info = imfinfo('lena_256.tiff');%img详细信息
    imshow(img)%窗口展示
    imwrite(img,'../图片自操/lena_256.bmp')%相应位置将img存储为bmp格式
    imwrite(img,'../图片自操/lena_256.png')%相应位置将img存储为png格式
    imshow('../图片自操/lena_256.bmp')
    imshow('../图片自操/lena_256.png')

  1. 将文件夹中的lena.bmp图像文件读出,用rgb2gray()将其转化为灰度图像,在同一窗口显示原图像与灰度图像。并在同一窗口输出原图像及R, G, B三个分量图像。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    figure('NumberTitle', 'off', 'Name', '图像变换:灰度图即RGB分量')
    img_bmp = imread('lena.bmp');
    img_gray = rgb2gray(img_bmp);
    img_R = img_bmp(:,:,1);%红色分量
    img_G = img_bmp(:,:,2);%绿色分量
    img_B = img_bmp(:,:,3);%蓝色分量
    imwrite(img_gray,'../图片自操/img_gray.bmp');
    imwrite(img_R,'../图片自操/img_R.bmp');
    imwrite(img_G,'../图片自操/img_G.bmp');
    imwrite(img_B,'../图片自操/img_B.bmp');
    %subplot(231)表示窗口分为2行3列第1格中
    subplot(231),imshow(img_bmp),title('原图');
    subplot(232),imshow(img_gray),title('灰度图');
    subplot(233),imshow(img_R),title('R分量');
    subplot(234),imshow(img_G),title('G分量');
    subplot(235),imshow(img_B),title('B分量');

  2. 读取两幅图像,进行加,减,乘,除运算,并显示原图像与运算结果。

    ADD=imadd(I1,I2); %两个图像相加

    SUB=imsubtract(I1,I2);%两个图像相减

    MUL=immultiply(I1,I1);%两个图像相乘

    DIV=imdivide(I1,I2);%两个图像相除

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    figure('NumberTitle', 'off', 'Name', '图像变换:四则运算 ')
    %读取
    M = imread('lena_256.tiff');
    N = imread('gold_contrast.tiff');
    %图之间做运算需要有相同分辨率
    M = imresize(M,[256,256]);
    N = imresize(N,[256,256]);
    %运算
    ADD= imadd(M,N);%两个图像相加
    SUB=imsubtract(M,N);%两个图像相减
    MUL=immultiply(M,N);%两个图像相乘
    DIV=imdivide(M,N);%两个图像相除
    %窗口
    subplot(321),imshow(M),title('原图1');
    subplot(322),imshow(N),title('原图2');
    subplot(323),imshow(ADD),title('加');
    subplot(324),imshow(SUB),title('减');
    subplot(325),imshow(MUL),title('乘');
    subplot(326),imshow(DIV),title('除');

  3. 把灰度图转换为二值图,取阈值为0.7、0.5、0.4、0.2将lena_256.tiff图像转换为二值图像,并在同一窗口输出原图像及对应二值图。I2 = im2bw(I1, 0.5);%I1为原图,0.5为阈值,I2为转换后的二值图。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    figure('NumberTitle', 'off', 'Name', '图像变换:二值图 ')
    %读取
    I1 = imread('lena_256.tiff');
    %生成二值图
    I7 = im2bw(I1,0.7);
    I5 = im2bw(I1,0.5);
    I4 = im2bw(I1,0.4);
    I2 = im2bw(I1,0.2);
    %窗口
    subplot(231),imshow(I1),title('灰度图');
    subplot(232),imshow(I7),title('阈值为0.7的二值图');
    subplot(233),imshow(I5),title('阈值为0.5的二值图');
    subplot(234),imshow(I4),title('阈值为0.4的二值图');
    subplot(235),imshow(I2),title('阈值为0.2的二值图');

  4. 灰度直方图描述了一副图像的灰度级统计信息。从数学角度来说,图像直方图描述图像各个灰度级的统计特性,它是图像灰度值的函数,统计一幅图像中各个灰度级出现的次数或概率。给出lena_256.tiff图像的灰度直方图。

    1
    2
    3
    4
    5
    6
    7
    8
    figure('NumberTitle', 'off', 'Name', '图像变换:灰度直方图 ')
    %读取
    I1 = imread('lena_256.tiff');
    %计算直方图
    I1_hist=imhist(I1);
    %窗口
    subplot(121),imshow(I1);
    subplot(122),bar(I1_hist);

5.2.Matlab图像变换操作

  1. 在Matlab workspace中生成一幅大小为512×512像素的8位灰度图, 背景为黑色,中心有一个宽40像素高20像素的白色矩形。如下图所示:

  2. 将这幅图像保存为文件test.bmp。

  3. 从文件test.bmp中读出图像到变量I。

  4. 在Matlab图形界面中显示变量I所代表的图像。

  5. 对I分别作二维DFT变换,结果保存到变量F。注意将频域原点调整至中心位置。fftshift

  6. 将傅立叶频谱,即|F|的取值范围调整为0-255并显示。abs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    figure('NumberTitle', 'off', 'Name', 'Matlab图像变换操作 ');
    %零矩阵
    array = zeros(512,512);
    %按照x,y要求给中间赋值为255,即为白色
    array(256-10:256+10,256-20:256+20)=255;
    %图像矩阵的归一化操作,每个元素在0,1之间
    img = mat2gray(array);
    %保存,读取到I,显示变量I
    imwrite(img,'../图片自操/test.bmp');
    I = imread('../图片自操/test.bmp');
    subplot(221),imshow(I),title('变量I的图像');
    %对I分别作DFT变换
    F = fft2(I);
    %将变换的原点移动到频域矩阵的中心
    F = fftshift(F);
    %将傅立叶频谱,即|F|的取值范围调整为0-255并显示
    subplot(222),imshow(log(abs(F)),[1,10]),title('傅立叶频谱');
    %三维
    subplot(223),mesh(abs(F));
    subplot(224),imshow(I);

  7. 对频谱图的物理意义作简要说明。

            图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。傅里叶频谱图上看到的明暗不一的亮点,实际上图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅里叶变换后的频谱图,也叫功率图,首先就可以看出图像的能量分布,如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小),反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的,边界分明且边界两边像素差异较大的。对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。变换之后的图像在原点平移之前四角是低频,最亮,平移之后中间部分是低频,最亮,亮度大说明低频的能量大(幅角比较大)。

5.3.Matlab图像变换操作

        使用离散傅里叶变换、离散余弦变换对lena_256.tiff图像进行操作(dct2、idct2),观察这些变换的结果。将离散余弦变换后的图像只保留前40*40子矩阵,其余子矩阵赋值为0,在此基础上执行离散余弦逆变换得到压缩后的图,在同一窗口中将原图与压缩后的图显示出来,观察结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
figure('NumberTitle', 'off', 'Name', 'Matlab图像变换操作5.3 ');
%读取
I = imread('./lena_256.tiff');
%离散傅里叶变换和离散余弦变换
F1 = fftshift(fft2(I));
F2 = dct2(I);
%40*40子矩阵
for i=41:1:256
for j=41:1:256
F2(i,j)=0;
end
end
%离散余弦逆变换
F3 = idct2(F2);
%窗口
subplot(321),imshow(I),title('lena256原图');
subplot(322),imshow(log(abs(F1)),[1,10]),title('离散傅里叶变换');
subplot(323),imshow(F3,[]),title('对压缩的离散余弦逆变换');

5.4.数字水印软件Hide4Pgp

  1. 水印嵌入

    在cmd命令窗口下输入命令Hide4PGP datafile secretfile。其中:datafile为载体文件,可以为bmp图片、wav音频。secretfile 为水印信息文件,可以为任意文件。

  2. 水印提取

    在cmd命令窗口下输入命令Hide4PGP –x datafile secretfile。其中:datafile为嵌入水印后的载体文件。secretfile 为提取出水印的保存文件。

  3. 结果验证

    验证在水印嵌入后,原载体文件在视觉和听觉上是否发生了变化。验证在水印提取后,提取出的水印是否正确。

  • 图片操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Users>cd C:\Users\86159\Desktop\学习\4-数字内容安全实验\实验一\H4PGP20W

    H4PGP20W>Hide4PGP 1.bmp secret.txt
    Hide4PGP v2.0 - hides secret files in BMP/WAV/VOC
    (c) 1996-2000 by Heinz Repp

    Bitmap format <Windows 3.x> detected, True Color (16.7 Mio colors).
    Steganographic operation finished.

    H4PGP20W>Hide4PGP -x 1.bmp out_secret_pic.txt
    Hide4PGP v2.0 - hides secret files in BMP/WAV/VOC
    (c) 1996-2000 by Heinz Repp

    Bitmap format <Windows 3.x> detected, True Color (16.7 Mio colors).
    Steganographic operation finished.

    软件目录下查到生成txt内容:

  • 视频操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Users>cd C:\Users\86159\Desktop\学习\4-数字内容安全实验\实验一\H4PGP20W

    H4PGP20W>Hide4PGP 北京邮电大学Hide4PGP 北京邮电大学线上考试考场规则-宣传部录音版.wav secret.txt
    Hide4PGP v2.0 - hides secret files in BMP/WAV/VOC
    (c) 1996-2000 by Heinz Repp

    Microsoft RIFF / subtype WAVE format detected.
    Sample resolution: 16 bit.
    Steganographic operation finished.

    H4PGP20W>Hide4PGP -x 北京邮电大学线上考试考场规则-宣传部录音版.wav out_secret_wav.txt
    Hide4PGP v2.0 - hides secret files in BMP/WAV/VOC
    (c) 1996-2000 by Heinz Repp

    Microsoft RIFF / subtype WAVE format detected.
    Sample resolution: 16 bit.
    Steganographic operation finished.

    软件目录下查到生成txt内容:

6.可选实验:离散小波变换

        使用离散小波变换对lena_256.tiff图像进行操作,观察变换的结果。[cA1, cH1, cV1, cD1] = dwt2(I, 'bior3.7');

        说明:dwt2函数对输入参数进行二维一级离散小波变换并返回近似分量,水平细节分量,垂直细节分量和对角线细节分量。

        二维离散小波逆变换,在命令行中输入下述命令:xsync = uint8(idwt2(cA1, cH1, cV1, cD1, 'bior3.7'));

        说明:idwt2函数对输入参数进行二维离散小波逆变换并返回其系数。可以尝试仅使用近似分量,水平细节分量,垂直细节分量或对角线细节分量重构图像。

1
2
3
4
5
6
7
8
9
10
figure('NumberTitle', 'off', 'Name', '离散小波变换 ');
I = imread('./lena_256.tiff');
[cA1, cH1, cV1, cD1] = dwt2(I, 'bior3.7');
xsync = uint8(idwt2(cA1, cH1, cV1, cD1, 'bior3.7'));
subplot(2,3,1),imshow(uint8(I)),title('原图');
subplot(2,3,4),imshow(xsync),title('xsync');
subplot(2,3,2),imshow(uint8(cA1)),title('低频分量');
subplot(2,3,3),imshow(uint8(cH1)),title('水平细节分量');
subplot(2,3,5),imshow(uint8(cV1)),title('垂直细节分量');
subplot(2,3,6),imshow(uint8(cD1)),title('对角线细节分量');

鸣谢❀参考大佬文章