1、密码学实验第八组实验报告云南大学数学与与统计学院上机实践报告课程名称:密码学实验学期:2013-2014学年第一学期成绩:指导教师: 陆正福学生姓名:卢富毓 学生学号:20101910072实验名称:数字水印实验要求:必做实验学时:4学时实验编号: No.8实验日期:2013/12/15完成日期:2012/12/30学院:数学与统计学院专业 : 信息与计算科学年级: 2010级 一、实验目的熟悉并掌握数字水印的内容。二、实验内容 用Matlab实现图像数字水印的离散余弦变换嵌入和提取。三、实验环境Win 7, Matlab, Java&Eclipse四、实验过程(请学生认真填写):1. 预备知
2、识:二维DCT变换原理: MN矩阵的二维离散余弦变换定义为: 其中,f(m, n)是MN矩阵中坐标为(m, n)元素的原始值, F(u, v)是经离散余弦 变换后对应值。 对应的DCT逆变换定义为: 其中: 2. 实验过程A、 原理分析: 水印嵌入思路:(1)选用灰色图像lena.jpg作为宿主图像,选用二值图像c.jpg作为水印图像。(2)提取原始图像lena的像素矩阵A和嵌入图像c的像素矩阵B;(3)对像素矩阵A进行8*8分块,然后进行(快速)DCT变换;(4)在进行DCT像素矩阵中的特定位置嵌入水印信息(如果B中对应位置是1则加一个系数d,否则减d)。水印提取思路:(1)获得原始图像的像
3、素矩阵A和水印的嵌入图像的像素矩阵A*;(2)对A和A*进行8*8分块,并进行(快速)DCT变换。(3)比较进行DCT像素矩阵中嵌入水印的5个位置系数大小,如果A*对应位置上系数大则水印信息为1,相反为0。B、实验结果:可以看出,Matlab处理图像变换,造成图像的失真度很小,效果很好。这个实验最开始我想用Java实现的,但在实验过程中遇到很多问题,虽然最后从理论上弄懂了,但是实现起来并不容易,最后完成了代码,却没有得到好的结果。五、实验总结1遇到的问题、分析并的出方案(列出遇到的问题和解决办法):遇到问题: 如何Java中将图像信息提取成为矩阵块,以及如何将像素矩阵还原成图像分析并解决:只是
4、由于过于急于编写程序,对文献1中的细节部分没有仔细研究,只是对离散余弦变换这块阅读了一下,在编写代码过程中遇到一些Java调用包之类的问题,都查看文档跟参考文献尝试解决。 2体会和收获。 由于准备考研的事情导致了这学期编写的实验质量不是很高。由于对数字水印处理这方面没有花太多时间深究,阅读文献也并不全面,导致最后的实现有问题,没有得到较好的结果,但在这个过程中,通过阅读文献还是学到很多东西,比如学长讲的是灰色图像如何嵌入水印和提取水印,在学习过程中,我还了解到如何在彩色图像中进行水印的嵌入和提取。六、参考文献应用密码学 林岱岳密码学概论wade trapeJAVA实现图像处理七、教师评语:八、
5、代码/Matlab代码clc;clear;M=256; N=32; d=5; NewPrint=zeros(N,N,uint8);InsertImage = zeros(M,M,uint8);D=zeros(M,M); I=imread(d.jpg);subplot(2,2,1);imshow(I);title(); Origin=imread(c.jpg);subplot(2,2,3);imshow(Origin);title(); % for i=1:N for j=1:N II=zeros(8,8);% for k=1:8 for l=1:8 II(k,l)=I(8*(i-1)+k,8*
6、(j-1)+l); end end Idct=dct2(II);%Dct if (Origin(i,j)=0) Idct(4,4)= Idct(4,4)-d; Idct(4,5)= Idct(4,5)-d; Idct(4,6)= Idct(4,6)-d; Idct(5,4)= Idct(5,4)-d; Idct(5,5)= Idct(5,5)-d; Idct(5,6)= Idct(5,6)-d; else Idct(4,4)= Idct(4,4)+d; Idct(4,5)= Idct(4,5)+d; Idct(4,6)= Idct(4,6)+d; Idct(5,4)= Idct(5,4)+d;
7、 Idct(5,5)= Idct(5,5)+d; Idct(5,6)= Idct(5,6)+d; end Bidct=idct2(Idct);%Idct for k=1:8 for l=1:8 InsertImage(8*(i-1)+k,8*(j-1)+l)= Bidct(k,l); end end endendfor i=1:256 for j=1:256 InsertImage(i,j)=round(InsertImage(i,j); endendsubplot(2,2,2);imshow(InsertImage);title(); %imwrite(InsertImage,e.jpg,q
8、uality,100);IV=imread(e.jpg);for i=1:N for j=1:N a=0; b=0; II=zeros(8,8); IX=zeros(8,8); for k=1:8 for l=1:8 II(k,l)=I(8*(i-1)+k,8*(j-1)+l); IX(k,l)=IV(8*(i-1)+k,8*(j-1)+l); end end Idct=dct2(II); Idct2=dct2(IX); if (Idct(4,4)Idct2(4,4) a=a+1; else b=b+1; end if (Idct(4,5)Idct2(4,5) a=a+1; else b=b+
9、1; end if (Idct(5,4)Idct2(5,4) a=a+1; else b=b+1; end if (Idct(5,5)Idct2(5,5) a=a+1; else b=b+1; end if (ab) NewPrint(i,j)=0; else NewPrint(i,j)=255; end endendimwrite(NewPrint,f.jpg,quality,100);subplot(2,2,4);imshow(NewPrint);title();/Java 代码/嵌入水印package FDCT;import java.awt.image.BufferedImage;im
10、port java.awt.image.WritableRaster;/FDCT水印嵌入public class m3_2a private static final int d = 5; public static void main(String args) m3_2a embed = new m3_2a(); embed.start(); public void start() BufferedImage oImage = ImageAssistance.getImage(Picturea.jpg, jpeg); BufferedImage wImage = ImageAssistanc
11、e.getImage(Picturezhong.jpg, jpeg); int type = oImage.getType(); WritableRaster oRaster = oImage.getRaster(); WritableRaster wRaster = wImage.getRaster(); int oWidth = oRaster.getWidth(); int oHeight = oRaster.getHeight(); int wWidth = wRaster.getWidth(); int wHeight = wRaster.getHeight(); int oPixe
12、ls = new int3 * oWidth * oHeight; int wPixels = new int3*wWidth * wHeight; oRaster.getPixels(0, 0, oWidth, oHeight, oPixels); wRaster.getPixels(0, 0, wWidth, wHeight, wPixels); int RGBPixels = ImageAssistance.getRGBArrayToMatrix(oPixels, oWidth, oHeight); / 得到RGB图像的三层矩阵表示 double rPixels = MathTool.i
13、ntToDouble(RGBPixels1); int wDMatrix = MathTool.arrayToMatrix(wPixels, wWidth, wHeight); double result = rPixels; / 嵌入算法 for (int i = 0; i wWidth; i+) for (int j = 0; j wHeight; j+) double blk = new double88; / 对原始图像8 * 8 分块 for (int m = 0; m 8; m+) for (int n = 0; n 8; n+) blkmn = rPixels8 * i + m8
14、 * j + n; double dBlk = FDct.fDctTransform(blk); if (wDMatrixij = 0) dBlk33 = dBlk33 - d; dBlk34 = dBlk34 - d; dBlk35 = dBlk35 - d; dBlk43 = dBlk43 - d; dBlk53 = dBlk53 - d; else dBlk33 = dBlk33 + d; dBlk34 = dBlk34 + d; dBlk35 = dBlk35 + d; dBlk43 = dBlk43 + d; dBlk53 = dBlk53 + d; blk = IFDct.iFDc
15、tTransform(dBlk); /8 block 恢复 for (int m = 0; m 8; m+) for (int n = 0; n 8; n+) result8 * i + m8 * j + n = blkmn; double temp = new double3oWidthoHeight; temp0 = MathTool.intToDouble(RGBPixels0); temp2 = MathTool.intToDouble(RGBPixels2); temp1 = result; double rgbResult = ImageAssistance.getRGBMatri
16、xToArray(temp); / 把嵌入水印的结果写到BufferedImage对象 BufferedImage outImage = new BufferedImage(oWidth, oHeight, type); WritableRaster outRaster = outImage.getRaster(); / 将像素写入到Raster outRaster.setPixels(0, 0, oWidth, oHeight, rgbResult); / 将BufferedImage对象写入磁盘 ImageAssistance.setImage(outImage, Picturer.jpg
17、, jpg); / end/提取水印package FDCT;/ 程序名 : m3_2b.java/ 目的 : 用于FDCT水印提取实验 / 编写时间: 2008年10月13日import java.awt.image.*;public class Distill public static void main(String args) Distill distill = new Distill(); distill.start(32, 32); public void start(int wWidth, int wHeight) String fnm = Picturer.jpg; Stri
18、ng fnm1 = Pictured.jpg; / mImage是嵌入水印后的图像 BufferedImage mImage = ImageAssistance.getImage(fnm, jpeg); / 原始图像 BufferedImage oImage = ImageAssistance.getImage(fnm1, jpeg); WritableRaster oRaster = oImage.getRaster(); WritableRaster mRaster = mImage.getRaster(); int oWidth = oRaster.getWidth(); int oHe
19、ight = oRaster.getHeight(); int oPixels = new int3 * oWidth * oHeight; int mPixels = new int3 * oWidth * oHeight; oRaster.getPixels(0, 0, oWidth, oHeight, oPixels); mRaster.getPixels(0, 0, oWidth, oHeight, mPixels); / 得rgb图像三层矩阵,mRgbPixels0表示b层分量 int mRgbPixels = ImageAssistance.getRGBArrayToMatrix(
20、mPixels, oWidth, oHeight); int oRgbPixels = ImageAssistance.getRGBArrayToMatrix(oPixels, oWidth, oHeight); double oDPixels = MathTool.intToDouble(mRgbPixels2); double mDPixels = MathTool.intToDouble(oRgbPixels2); double result = new doublewWidthwHeight; for (int i = 0; i wWidth; i+) for (int j = 0;
21、j wHeight; j+) resultij = 0; /提取水印算法 for (int i = 0; i wWidth; i+) for (int j = 0; j wHeight; j+) double oBlk = new double88; double mBlk = new double88; int d = 0; int f = 0; for (int m = 0; m 8; m+) for (int n = 0; n 8; n+) oBlkmn = oDPixels8 * i + m8 * j + n; mBlkmn = mDPixels8 * i + m8 * j + n;
22、double dOBlk = FDct.fDctTransform(oBlk); double dMBlk = FDct.fDctTransform(mBlk); if (dOBlk33 dMBlk33) d+; else f+; if (dOBlk34 dMBlk34) d+; else f+; if (dOBlk35 dMBlk35) d+; else f+; if (dOBlk43 dMBlk43) d+; else f+; if (dOBlk53 = f) resultij = 0; else resultij = 1; int outResult = MathTool.matrixT
23、oArray(result); / 把嵌入水印的结果写到BufferedImage对象 BufferedImage outImage = new BufferedImage(wWidth, wHeight, BufferedImage.TYPE_3BYTE_BGR); WritableRaster outRaster = outImage.getRaster(); outRaster.setPixels(0, 0, wWidth, wHeight, outResult); ImageAssistance.setImage(outImage, Picturemark.jpg, jpeg);/ 将BufferedImage对象写入磁盘 / end
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1