毕业论文-基于小波变换的数字水印技术研究_第1页
毕业论文-基于小波变换的数字水印技术研究_第2页
毕业论文-基于小波变换的数字水印技术研究_第3页
毕业论文-基于小波变换的数字水印技术研究_第4页
毕业论文-基于小波变换的数字水印技术研究_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于小波变换的数字水印技术研究摘要:算法基于Haar小波变换,把小波系数分块,并计算每个块的平均值。在一系列信号处理之后,这些块(尤其是大的块)的平均值不会有很大改变,否则,重构的图像就与原始图像有很大差别。通过对这些块的平均值进行量化来嵌入水印;提取时也依赖于相应块的平均值,所以不需要原始图像参与。算法对有损压缩、小波压缩、噪声、中值滤波和剪裁等操作有较好的鲁棒性。关键词:信息隐藏;数字水印;小波变换引言随着计算机和网络的飞速发展,人们的许多创作和成果都以数字形式进行存储和发布。然而,数字作品极易被非法拷贝、伪造和窜改,使得很多版权所有者不愿意利用网络公开其作品,从而阻碍其自身发展。目前,数字作品的版权保护不仅仅是立法问题,也是一个很重要的技术难题。从技术上看,数字媒体版权信息的嵌入和检测问题,是数字作品版权保护的两个关键问题,它综合了传统密码学的认证和鉴别问题的特点,又加入了稳健性要求。版权保护信息必须与被保护的数据密切结合,版权保护信息的鉴别过程必须具有了抗干扰能力。在这种情况下,数字水印技术应运而生。1.数字水印技术概述提到水印,人们都会想到钞票中的水印。钞票水印具有两条特性,首先,水印在通常情况下不可见,只有在特殊的观察条件下才可见(钞票中水印在光下可见)。其次,水印信息必须与载体对象相关(在这里表示纸币的真实性)。1.1数字水印技术的特性可证明性:能够为受到版权保护的数字产品提供完全可靠的证据。不可见性:即被嵌入水印信息的数字产品不会出现明显的质量下降,隐藏的数据不易被察觉;另外,不能用统计的方法恢复出水印。鲁棒性:添加的数字水印必须对施加于宿主图象的攻击具有一定的免疫能力,不能因为对宿主图象的某种操作而导致水印信息丢失。1.2数字水印技术的应用水印技术的应用极为广泛,主要有以下7种应用领域:广播监控、所有者识别、所有权验证、交易跟踪、内容真伪鉴别、拷贝控制以及设备控制。2.小波变换理论自1986年以来,小波分析的理论、方法与应用的研究一直方兴未艾。作为一种数学工具,小波变换是对人们熟知的傅立叶变换和窗口傅立叶变换的一个重大突破,为信号分析、图像处理及其它非线性科学研究领域带来了革命性的影响。人类视觉系统(HVS)的文理特性和照亮掩蔽特性表明,纹理越复杂,背景的亮度越亮,人类视觉对其轻微变化就越不敏感。大量的研究表明,人眼在处理图像信号时,将图像滤波成若干的子带信号,他们占据不同的频率范围,即图像在HVS中被认为是由不同频率范围的信息组成。其特征为:人眼对反映局部结构的边缘和轮廓不敏感;对低频信号,表现出较高的灵敏度。HVS在同一品大范围对不同方向纹理细节信号等表现出不同的灵敏度,这一特点与小波变换的多分辨率分析具有一定的相似性。小波变换是傅立叶变换的发展,是空间和频率的局部变换,它在频域和时域同时具有良好的局部化特征。小波变换在图像处理中的基本思想是把图像进行多分辨率分解成不同的空间和独立的频率带的子图像,然后对子图像的系数进行处理。根据S.Mallat的塔式分解算法,图像经过小波变换后分解成四个子图:水平方向LH、垂直方向HL和对角线方向HH的中高频细节子图和低频逼近子图LL。低频部分还可以继续分解,产生三个高频带系列LHn、HLn、HHn(n=1,2,3)和一个低频带LL3(见图1)。图1中的LL3表示小波变换分解级数决定的最大尺度、最小分辨率下对原始图像的最佳逼近,它的同级特征和原理图相似,图像大部分能量集中于此。高频带系列代表图像的边缘和纹理。3.DWT变换域数字水印技术3.1数字水印嵌入技术图像的水印技术根据水印嵌入的方式可以分为两类:时/空域技术(水印被直接嵌入在图像的亮度值中)和变换域技术(将图像做某种数学变换,然后水印被嵌入于变换系数中)。早期人们对水印的研究基本上是基于时空域的,算法相对简单,实时性较强,但在鲁棒性上不如变换域算法。目前变换域方法正日益普遍,有DCT、DWT、DFT变幻域算法。变换域算法的优点是:1、水印信息分布到空间域的所有像素上,有利于提高水印的不可见性。2、能方便的与HVS(人类视觉系统)的某些特性结合。3、很好的鲁棒性,对图像压缩、常用的图像滤波以及噪声均有一定的抵抗力。离散余弦变换是从图像空间到频率空间的全局变换,由于离散余弦变换的全局本质,在变换空间中任何一个数据的误差都会影响到图像中的每一个像素。利用小波变换把原始图像分解成多频段的图像,能适应人眼的视觉特性且使得水印的嵌入和检测可分多个层次进行,小波变换域数字水印方法见具有时空域方法和DCT变换域方法的优点。在一系列信号处理后,如果观察者的主观感觉图像的变化不大,那么图像处理前后低、中频的小波系数的改变幅度同样有限,另外系数幅值改变的方向(变大或变小)在多数情况下也不同,因此,低、中频系数的平均改变幅度十分有限。本算法选取部分低、中频系数并分成一定大小的系数块,通过量化系数块的平均值来嵌入水印序列。3.1.1选择系数设X(m,n)是一幅大小为M*N灰度级为2“的灰度图像(1≤m≤M,1≤n≤N),其中M,N,a为正整数。对X(m,n)进行l层(l为正整数)小波分解,得到3×l个细节图像和一个低频近似图像,用Xk,l(mi,nj)k=h,v,d;l=1,2,…,l;mi=1,2,…,M/2l;nj=1,2,…,N/2l表示选择的小波系数,其中l表示分解的层次,k=h,v,d分别表示第l层水平、垂直和对角方向的子图像。考虑到量化低频子图可能产生较大失真,因此不在其中嵌入水印,而选择除低频外的中频系数3.1.2分块并计算每块的平均值根据嵌入的信息量和对算法鲁棒性的要求,块越大,水印的鲁棒性越好,但嵌入的水印比特少。把XK,l(mi,nj)分成一定大小的块,用Block(s,t)表示XK,l(mi,nj)中大小为s×t的系数块,其中s=1,2,…,mi,t=1,2,…,nj,b为正整数,代表该块的编号。其平均值为Ave=∑Block(s,t)/(s*t):其中∑Block为块内系数幅值的累计和。3.1.3量化水印序列w的嵌入是通过对Ave的量化完成的,例如:量化成奇数代表嵌入“1”,量化成偶数相当于嵌入“0”。根据对鲁棒性和隐藏性的折中考虑,设量化间隔△l,l=1,2,…,l表示分解层数,对于低频的第l层,由于系数幅值极大,可以作较大间隔的量化,对第l-1,…,1层次作间隔逐渐减小的量化,量化按下图进行:根据wi={0,1}将Ave量化到与之最近的奇、偶点。用Dat(i,j)表示Block中的一个小波系数,量化后的该系数用Dat′(i,j)表示,其中i=1,2,…,s;j=1,2,…,t。设T=Ave/△l,Turdat=rem([T],2)其中[]表示四舍五入取整,rem表示求[T]除以2的余数。若Turdat与wi相同,则量化的小波系数为Dat′(i,j)=Dat(i,j)+[T]×△l-Ave若Turdat与wi不同,小波系数按下列量化Dat′(i,j)=Dat(i,j)+([T]+1)×△l–Ave,T≥[T]Dat′(i,j)=Dat(i,j)+([T]-1)×△l–Ave,T<[T]3.1.4重构使用相同的小波基,通过小波逆变换生成含有水印的图像,并将小波基、小波分解层数、选择的系数区域、分块方法、量化间隔、奇偶对应关系记录形成密钥[4]。3.2数字水印提取技术水印的提取由嵌入方式来决定,它是嵌入方式的逆过程。首先对要检测的图像进行小波变换,根据密钥确定嵌入水印的位置,并对水印进行置乱处理的逆运算。可以通过计算归一化互相关函数Nc和峰值信噪比Rpsnr来度量该水印算法的鲁棒性和透明性。归一化互相关函数Nc的定义式为峰值信噪比Rpsnr的定义式为上两式中,Wij为原始水印,Wij‘为提取出来的数字水印,i,j分别是行和列的个数。4.实验结果分析在原图像中加入水印图像后,原图像与含水印图像相关系数为0.9644,原图像与提取水印后图像相关系数为0.9308。当对原图和含水印图进行JPEG压缩后,原图峰值信噪比为33.70dB,含水印图峰值信噪比为31.95dB。在对嵌入水印的图像进行JPEG压缩、污染、裁剪、添加高斯噪声、均匀噪声等常见破坏性实验后,仍检测出水印。从实验数据中可以看出,本文提出的算法对JEPG压缩、剪切、中值滤波具有较强的鲁棒性。同时嵌入水印的图像也有较好的透明性。在本文算法中仅仅根据小波系数块的特点来嵌入和提取水印,由于对图像水印的攻击手段多种多样,不同的攻击手段对小波系数块的改变幅度不同,会影响本文算法提取水印的可靠性;另外,小波系数分块后,对嵌入水印数据量有较大地限制。参考文献[1]数字水印技术及应用,孙圣和,陆哲明,科学出版社[2]基于离散小波变换的图像数字水印算法,刘淑青,于工,青岛科技大学学报[3]基于小波变换的彩色图像数字水印算法,严继利,陈明明,计算机与数字工程[4]基于小波多分辨率分解的数字图像水印算法,姜明新,迟学芬,吉林大学学报DigitalImageWatermarkingAlgorithmBaseonHaarWaveletTransformAbstract:ThealgorithmdealswiththecalculatingmethodthatwaveletmodulesaredividedintoblockcalculatingtheaverageofeveryonebasisonHaarwavelettransform.Havingbeenwipedwithbyaseriesofsignals,theimageofreconstructionhavegreatdifferencesfromtheoriginaloneunlesstheaverageofthepieces(especiallythebigones)canbechangedgreatly.Bybeingquantizedandimplantedwatermark,theaverageofthepiecesaredependedonwhencollectedsoasnottoinvolveintheoriginalimage.Thealgorithmhaveperfectrobusttotheoperationdamagingcompression,waveletcompression,noise,medianfiltering,cropping.Keywords:informationhiding;digitalwatermarking;wavelettransform附录1.matlab代码lena=imread('lena.bmp','bmp');subplot(2,2,1);imshow(lena);title('原图像');bict=imread('bict.bmp','bmp');subplot(2,2,2);imshow(bict);title('水印图像');lena1=double(lena);bict1=double(bict);[Cwr,Swr]=WAVEDEC2(bict1,1,'haar');[Cr,Sr]=WAVEDEC2(lena1,2,'haar');a=0.06;fork=0:1:size(Cr,2)/size(Cwr,2)-1Cr(1+size(Cr,2)/4+k*size(Cwr,2)/4:size(Cr,2)/4+(k+1)*size(Cwr,2)/4)=Cr(1+size(Cr,2)/4+k*size(Cwr,2)/4:size(Cr,2)/4+(k+1)*size(Cwr,2)/4)+a*Cwr(1+size(Cwr,2)/4:size(Cwr,2)/2);Cr(1+size(Cr,2)/2+k*size(Cwr,2)/4:size(Cr,2)/2+(k+1)*size(Cwr,2)/4)=Cr(1+size(Cr,2)/2+k*size(Cwr,2)/4:size(Cr,2)/2+(k+1)*size(Cwr,2)/4)+a*Cwr(1+size(Cwr,2)/2:3*size(Cwr,2)/4);Cr(1+3*size(Cr,2)/4+k*size(Cwr,2)/4:3*size(Cr,2)/4+(k+1)*size(Cwr,2)/4)=Cr(1+3*size(Cr,2)/4+k*size(Cwr,2)/4:3*size(Cr,2)/4+(k+1)*size(Cwr,2)/4)+a*Cwr(1+3*size(Cwr,2)/4:size(Cwr,2));end;Cr(1:size(Cwr,2)/4)=Cr(1:size(Cwr,2)/4)+a*Cwr(1:size(Cwr,2)/4);lena1=WAVEREC2(Cr,Sr,'haar');output=uint8(round(lena1));subplot(2,2,3);imshow(output,[]);title('嵌入水印后的图像');J1=imnoise(output,'salt&pepper',0.04);subplot(2,2,4);imshow(J1);title('加椒盐噪声后的图像');[Ca,Sa]=WAVEDEC2(lena1,2,'haar');lena0=imread('lena.bmp','bmp');lena01=double(lena0(:,:,1));[Ca1,Sa1]=WAVEDEC2(lena01,2,'haar');Cwr(1:size(Cwr,2)/4)=(Ca(1:size(Cwr,2)/4)-Ca1(1:size(Cwr,2)/4))/a;bict1=WAVEREC2(Cwr,Swr,'haar');output=uint8(round(bict1));figure,subplot(2,2,1);imshow(output,[]);title('提取的水印图像');[Ca2,Sa2]=WAVEDEC2(J1,2,'haar');Cwr(1:size(Cwr,2)/4)=(Ca(1:size(Cwr,2)/4)-Ca1(1:size(Cwr,2)/4))/a;bict1=WAVEREC2(Cwr,Swr,'haar');output2=uint8(round(bict1));subplot(2,2,2);imshow(output2,[]);title('提取加噪声后的水印图像');2.vc++代码#include"stdafx.h"#include"resource.h"#defineMAX_LOADSTRING100#include<windows.h>#include<math.h>#include"dibfile.h"#include"resource.h"#definePI3.1415926typedefstructtagComplex{ floatre; floatim;}Complex;intfix(floatt);voidFFT(Complex*t,longnUm);voidDCT(float*t,unsignednUm);voidIDCT(float*t,unsignednUm);voidDCT2(float*Cpic,unsignednUm);voidIDCT2(float*Cpic,unsignednUm);ComplexcomplexAdd(Complexa,Complexb);ComplexcomplexMul(Complexa,Complexb);ComplexcomplexSub(Complexa,Complexb);LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);voidiWvltTrans(BYTE*tmp,longnWide,longnHeight,intn);voidcWvltTrans(BYTE*tmp,longnWide,longnHeight,intn);voidshade(BYTE*pic,BYTE*tmp,longwide,longheight,longnWide,longnHeight,intn);voidgetshade(BYTE*tpic,BYTE*tmp,longwide,longheight,longnWide,longnHeight,intn);voidnoise(BYTE*tpic,longwide,longheight);BYTEgetvalue(BYTE*t,intn);voidDITONG(BYTE*pic,longwide,longheight,intn);TCHARszAppName[]="ShowDib1";TCHARszAppName1[]="ShowDib2";int picopen=0;int shadeopen=0;int getopen=0;int donoise=0;int dozz=0;intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){ HACCEL hAccel; HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style =CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc =WndProc; wndclass.cbClsExtra =0; wndclass.cbWndExtra =0; wndclass.hInstance =hInstance; wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor =LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName =(LPCTSTR)IDC_DIBFILE; wndclass.lpszClassName =szAppName; if(!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!"), szAppName,MB_ICONERROR); return0; } hwnd=CreateWindow(szAppName,TEXT("ShowDIB"),WS_OVERLAPPEDWINDOW|WS_SYSMENU, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); hAccel=LoadAccelerators(hInstance,szAppName); while(GetMessage(&msg,NULL,0,0)) { if(!TranslateAccelerator(hwnd,hAccel,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } returnmsg.wParam;}LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){ static BITMAPFILEHEADER *pbmfh,*pbmfh1; static BITMAPINFO *pbmi,*pbmi1; static BYTE *pBits; static BYTE *pBits1,*pBits2; static BYTE *pic; static BYTE *sPic; static long cxClient,cyClient,cxDib,cyDib; static TCHARszFileName[MAX_PATH],szTitleName[MAX_PATH],szFileName1[MAX_PATH],szTitleName1[MAX_PATH]; BOOL bSuccess; HDC hdc; PAINTSTRUCT ps; int x,y,n=1; staticlong wide,height; staticlong nWide,nHeight;//水印图像 // wide=height=nWide=nHeight=0; switch(message) { case WM_CREATE: DibFileInitialize(hwnd); return0; case WM_SIZE: cxClient=LOWORD(lParam); cyClient=HIWORD(lParam); return0; case WM_INITMENUPOPUP: EnableMenuItem((HMENU)wParam,IDM_FILE_SAVE,pbmfh?MF_ENABLED:MF_GRAYED); return0; case WM_COMMAND: switch(LOWORD(wParam)) { case IDM_FILE_OPEN: //ShowtheFileOpendialogbox if(!DibFileOpenDlg(hwnd,szFileName,szTitleName)) return0; //Ifthere'sanexistingDIB,freethememory if(pbmfh) { free(pbmfh); pbmfh=NULL; } //LoadtheentireDIBintomemory SetCursor(LoadCursor(NULL,IDC_WAIT)); ShowCursor(TRUE); pbmfh=DibLoadImage(szFileName); ShowCursor(FALSE); SetCursor(LoadCursor(NULL,IDC_ARROW)); //Invalidatetheclientareaforlaterupdate if(pbmfh==NULL) { MessageBox( hwnd,TEXT("CannotloadDIBfile"), szAppName,0); return0; } //Getpointerstotheinfostructure&thebits pbmi =(BITMAPINFO*)(pbmfh+1); //theimage'sinformation //pBits存放图像的信息 pBits =(BYTE*)pbmfh+pbmfh->bfOffBits; //GettheDIBwidthandheight if(pbmi->bmiHeader.biSize==sizeof(BITMAPCOREHEADER)) { cxDib =((BITMAPCOREHEADER*)pbmi)->bcWidth; cyDib =((BITMAPCOREHEADER*)pbmi)->bcHeight; } else { cxDib = pbmi->bmiHeader.biWidth; cyDib = abs(pbmi->bmiHeader.biHeight); } wide=cxDib; height=cyDib; picopen=1; sPic=newBYTE[wide*height]; for(x=0;x<height;x++) for(y=0;y<wide;y++) sPic[x*wide+y]=pBits[x*wide+y]; shadeopen=0; getopen=0; InvalidateRect(hwnd,NULL,TRUE); return0; caseIDD__WVLT: cWvltTrans(pBits,cxDib,cyDib,n); InvalidateRect(hwnd,NULL,TRUE); return0; caseID__IWVLT: iWvltTrans(pBits,cxDib,cyDib,n); InvalidateRect(hwnd,NULL,TRUE); return0; caseIDD_SHADE: if(!DibFileOpenDlg(hwnd,szFileName1,szTitleName1)) return0; //Ifthere'sanexistingDIB,freethememory if(pbmfh1) { free(pbmfh1); pbmfh1=NULL; } //LoadtheentireDIBintomemory SetCursor(LoadCursor(NULL,IDC_WAIT)); ShowCursor(TRUE); pbmfh1=DibLoadImage(szFileName1); ShowCursor(FALSE); SetCursor(LoadCursor(NULL,IDC_ARROW)); //Invalidatetheclientareaforlaterupdate if(pbmfh1==NULL) { MessageBox( hwnd,TEXT("CannotloadDIBfile"), szAppName1,0); return0; } //Getpointerstotheinfostructure&thebits pbmi1 =(BITMAPINFO*)(pbmfh1+1); //theimage'sinformation //pBits存放图像的信息 pBits1 =(BYTE*)pbmfh1+pbmfh1->bfOffBits; //GettheDIBwidthandheight if(pbmi1->bmiHeader.biSize==sizeof(BITMAPCOREHEADER)) { nWide =((BITMAPCOREHEADER*)pbmi1)->bcWidth; nHeight =((BITMAPCOREHEADER*)pbmi1)->bcHeight; } else { nWide = pbmi1->bmiHeader.biWidth; nHeight = abs(pbmi1->bmiHeader.biHeight); } //nWide=cxDib; //nHeight=cyDib; shadeopen=1; if(picopen==1&&shadeopen==1) { // shade(pBits,pBits1,wide,height,nWide,nHeight,n); } InvalidateRect(hwnd,NULL,TRUE); return0; caseIDD__GETSHADE: getopen=1; if(picopen==1) { pBits2=newBYTE[wide*height/64]; getshade(pBits,pBits2,wide,height,wide/8,height/8,n); } InvalidateRect(hwnd,NULL,TRUE); return0; caseID_32779://noise donoise=1; noise(pBits,wide,height); InvalidateRect(hwnd,NULL,TRUE); return0; caseID_32780://滤波 dozz=1; DITONG(pBits,wide,height,3); InvalidateRect(hwnd,NULL,TRUE); return0; caseID_32778: if(picopen==1&&shadeopen==1) { shade(pBits,pBits1,wide,height,nWide,nHeight,n); } MessageBox( hwnd,TEXT("完成"), szAppName,0); InvalidateRect(hwnd,NULL,TRUE); return0; case IDM_FILE_SAVE: //ShowtheFileSavedialogbox if(!DibFileSaveDlg(hwnd,szFileName,szTitleName)) return0; //SavetheDIBtomemory SetCursor(LoadCursor(NULL,IDC_WAIT)); ShowCursor(TRUE); bSuccess=DibSaveImage(szFileName,pbmfh); ShowCursor(FALSE); SetCursor(LoadCursor(NULL,IDC_ARROW)); if(!bSuccess) MessageBox( hwnd,TEXT("CannotsaveDIBfile"),szAppName,0); return0; } break; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); if(pbmfh) SetDIBitsToDevice(hdc, 5, //xDst 5, //yDst wide, //cxSrc height, //cySrc 0, //xSrc 0, //ySrc 0, //firstscanline height, //numberofscanlines pBits,//addressofarraywithDIBbits pbmi,//addressofstructurewithbitmapinfo. DIB_RGB_COLORS); if(shadeopen==1) SetDIBitsToDevice(hdc, wide+15, //xDst 5, //yDst nWide, //cxSrc nHeight, //cySrc 0, //xSrc 0, //ySrc 0, //firstscanline nHeight, //numberofscanlines pBits1,//addressofarraywithDIBbits pbmi1,//addressofstructurewithbitmapinfo. DIB_RGB_COLORS); if(getopen==1) SetDIBitsToDevice(hdc, wide+15, //xDst height/8+25, //yDst wide/8, //cxSrc height/8, //cySrc 0, //xSrc 0, //ySrc 0, //firstscanline height/8, //numberofscanlines pBits2,//addressofarraywithDIBbits pbmi1,//addressofstructurewithbitmapinfo. DIB_RGB_COLORS); EndPaint(hwnd,&ps); return0; case WM_DESTROY: if(pbmfh) free(pbmfh); if(picopen) deletesPic; PostQuitMessage(0); return0; } returnDefWindowProc(hwnd,message,wParam,lParam);}voidcWvltTrans(BYTE*tmp,longnWide,longnHeight,intn){ inti,j,k; longwide,height; BYTE*tmp2,*tmp1; tmp1=newBYTE[nWide*nHeight]; for(i=0;i<nHeight;i++) for(j=0;j<nWide;j++) { tmp1[i*nWide+j]=tmp[(nWide-1-i)*nWide+j]; } for(k=0;k<n;k++) { wide=nWide>>k; height=nHeight>>k; tmp2=newBYTE[height*wide]; //行变换 for(i=0;i<wide;i++) for(j=0;j<height;j++) { tmp2[i*wide+j]=tmp1[i*nWide+j]; } for(i=0;i<wide;i++) for(j=0;j<height/2;j++) { tmp1[i*nWide+j]=tmp2[i*wide+2*j]; tmp1[i*nWide+height/2+j]=tmp2[i*wide+2*j+1]-tmp2[i*wide+2*j]+128; } //列变换 for(i=0;i<wide;i++) for(j=0;j<height;j++) tmp2[i*wide+j]=tmp1[i*nWide+j]; for(i=0;i<wide/2;i++) for(j=0;j<height;j++) { tmp1[i*nWide+j]=tmp2[2*i*wide+j]; tmp1[(i+wide/2)*nWide+j]=tmp2[(2*i+1)*wide+j]-tmp2[2*i*wide+j]+128; } deletetmp2; } for(i=0;i<nWide;i++) for(j=0;j<nHeight;j++) tmp[i*nWide+j]=tmp1[(nWide-1-i)*nWide+j]; deletetmp1;}voidiWvltTrans(BYTE*tmp,longnWide,longnHeight,intn){ inti,j; longwide,height; BYTE*tmp2,*tmp1; tmp1=newBYTE[nHeight*nWide]; for(i=0;i<nWide;i++) for(j=0;j<nHeight;j++) { tmp1[i*nWide+j]=tmp[(nWide-1-i)*nWide+j]; } for(intk=n-1;k>=0;k--) { wide=nWide>>k; height=nHeight>>k; tmp2=newBYTE[height*wide]; //列变换 for(i=0;i<wide;i++) for(j=0;j<height;j++) tmp2[i*wide+j]=tmp1[i*nWide+j]; for(i=0;i<wide/2;i++) for(j=0;j<height;j++) { tmp1[2*i*nWide+j]=tmp2[i*wide+j]; tmp1[(2*i+1)*nWide+j]=tmp2[(i+wide/2)*wide+j]+tmp2[i*wide+j]-128; } //行变换 for(i=0;i<wide;i++) for(j=0;j<height;j++) { tmp2[i*wide+j]=tmp1[i*nWide+j]; } for(i=0;i<wide;i++) for(j=0;j<height/2;j++) { tmp1[i*nWide+2*j]=tmp2[i*wide+j]; tmp1[i*nWide+2*j+1]=tmp2[i*wide+height/2+j]+tmp2[i*wide+j]-128; } deletetmp2; } for(i=0;i<nWide;i++) for(j=0;j<nHeight;j++) tmp[i*nWide+j]=tmp1[(nWide-1-i)*nWide+j]; deletetmp1;}voidshade(BYTE*pic,BYTE*sPic,longwide,longheight,longnWide,longnHeight,intn){ inti,j,x,y; longw,h; BYTE*tmp; w=wide/8; h=height/8; for(i=0;i<height;i++) for(j=0;j<wide;j++) { if(pic[i*wide+j]>250)pic[i*wide+j]=250; if(pic[i*wide+j]<5)pic[i*wide+j]=5; } tmp=newBYTE[64]; for(i=0;i<h;i++) for(j=0;j<w;j++) { for(x=0;x<8;x++) for(y=0;y<8;y++) tmp[x*8+y]=pic[(x+i*8)*wide+j*8+y]; cWvltTrans(tmp,8,8,n); for(x=0;x<8;x++) for(y=0;y<8;y++) if(y>3)tmp[x*8+y]=128; tmp[36]=sPic[i*nWide+j]/16+128; tmp[37]=tmp[36]; tmp[38]=tmp[36]; tmp[39]=tmp[36]; tmp[44]=tmp[36]; tmp[45]=tmp[36]; tmp[46]=tmp[36]; tmp[47]=tmp[36]; tmp[52]=tmp[36]; tmp[53]=tmp[36]; tmp[54]=tmp[36]; tmp[55]=tmp[36]; tmp[60]=tmp[36]; tmp[61]=tmp[36]; tmp[62]=tmp[36]; tmp[63]=tmp[36];// elsetmp[37]=128; iWvltTrans(tmp,8,8,n); for(x=0;x<8;x++) for(y=0;y<8;y++) pic[(x+i*8)*wide+j*8+y]=(BYTE)tmp[x*8+y]; } deletetmp;}voidgetshade(BYTE*pic,BYTE*sPic,longwide,longheight,longnWide,longnHeight,intn){ inti,j,x,y; longw,h; BYTE*tmp; BYTEt[16]; w=wide/8; h=height/8; tmp=newBYTE[64]; for(i=0;i<h;i++) for(j=0;j<w;j++) { for(x=0;x<8;x++) for(y=0;y<8;y++) tmp[x*8+y]=pic[(x+i*8)*wide+j*8+y]; cWvltTrans(tmp,8,8,n); t[0]=(tmp[36]-128); t[1]=(tmp[37]-128); t[2]=(tmp[38]-128); t[3]=(tmp[39]-128); t[4]=tmp[44]-128; t[5]=tmp[45]-128; t[6]=tmp[46]-128; t[7]=tmp[47]-128; t[8]=tmp[52]-128; t[9]=tmp[53]-128; t[10]=tmp[54]-128; t[11]=tmp[55]-128; t[12]=tmp[60]-128; t[13]=tmp[61]-128; t[14]=tmp[62]-128; t[15]=tmp[63]-128; sPic[i*w+j]=0; for(x=0;x<16;x++) sPic[i*w+j]+=t[x];//+t[1]+t[2]+t[3]; if(donoise==1||dozz==1) sPic[i*w+j]=getvalue(t,16); pic[i*wide+j]=sPic[i*w+j]; } deletetmp;}voidnoise(BYTE*pic,longwide,longheight){ intinnoise; longi,j; for(i=0;i<height;i++) for(j=0;j<wide;j++) { innoise=rand(); if(innoise>31500) pic[i*wide+j]=0; }}voidDITONG(BYTE*pic,longwide,longheight,intn){ inti,j; longw,h; float*tmp; w=wide/8; h=height/8; tmp=newfloat[wide*height]; for(i=0;i<height;i++) for(j=0;j<wide;j++) tmp[i*wide+j]=pic[i*wide+j]; DCT2(tmp,wide); for(i=0;i<height;i++) for(j=0;j<wide;j++) if(i>(height/8)&&j>(wide/8)) tmp[i*wide+j]=tmp[i*wide+j]/i; IDCT2(tmp,wide); for(i=0;i<height;i++) for(j=0;j<wide;j++) pic[i*wide+j]=(BYTE)fix(tmp[i*wide+j]); deletetmp;}BYTEgetvalue(BYTE*t,intn){ inti,j; BYTEk; for(i=0;i<n;i++) for(j=i+1;j<n;j++) { if(t[i]<t[j]) { k=t[i]; t[i]=t[j]; t[j]=k; } } return(t[n/2]+t[n/2-1])*16;}voidFFT(Complex*t,longnUm){ unsignedn; unsignedi,j,p; Complex*Wn,*a; floatangle; Wn=newComplex[nUm/2]; a=newComplex[nUm]; i=nUm; for(n=0;i>1;n++) i=i/2; for(i=0;i<nUm/2;i++) { angle=-(i*PI*2)/nUm; Wn[i].re=cos(angle); Wn[i].im=sin(angle); } for(j=0;j<nUm;j++) { a[j]=t[j]; } for(j=0;j<nUm;j++) { p=0; for(i=0;i<n;i++) { if(j&(1<<i)) p+=1<<(n-i-1); } t[j]=a[p]; } deletea; unsignedlonguLength=1;//段的长度 unsignedlonguHalf=0;//段长度

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论