代码

发布时间:2015-11-23 11:05:02   来源:文档文库   
字号:

I=imread('cameraman.tif')

I=im2double(I)

J=dct2(I);

T=dctmtx(8)

a1=[16 11 10 16 24 40 51 61;

12 12 14 19 26 58 60 55;

14 13 16 24 40 57 69 56;

14 17 22 29 51 87 80 62;

18 22 37 56 68 109 103 77;

24 35 55 64 81 104 113 92;

49 64 78 87 103 121 120 101;

72 92 95 98 112 100 103 99 ];

for i=1:8:200

for j=1:8:200

P=I(i:i+7,j:j+7);

K=T*P*T';

I2(i:i+7,j:j+7)=K;

K=K./a1;

K(abs(K)<0.03)=0;

I3(i:i+7,j:j+7)=K;

end

end

figure;

imshow(I2);

title('DCT变换后的频域图像');

for i=1:8:200

for j=1:8:200

P=I3(i:i+7,j:j+7).*a1;

K=T'*P*T;

I4(i:i+7,j:j+7)=K;

end

end

figure;

imshow(I4);

title('复原图像');

B=blkproc(I,[8,8],'P1*x*P2',T,T')

mask=[1 1 1 1 0 0 0 0

1 1 1 0 0 0 0 0

1 1 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 ]

%二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10

B2=blkproc(B,[8 8],'P1.*x',mask)

I2=blkproc(B2,[8 8],'P1*x*P2',T',T)

figure

imshow(I)

title('原始图像');

figure

imshow(I2);

title('压缩图像');

figure

imshow(J);

figure

mesh(J)

colorbar('horiz')


num2=0; num3=0;

I = imread('cameraman.tif');

I = im2double(I)*255;

T = dctmtx(8);% 计算离散余弦变换矩阵

figure,imshow(I/255),

Q=10;

B = blkproc(I,[8 8],'P1*x*P2',T,T');%对图像进行不同的快处理

mask = [1 1 1 1 1 0 0 0

1 1 1 1 0 0 0 0

1 1 1 0 0 0 0 0

1 1 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0];

B2 = blkproc(B,[8 8],'P1.*x',mask);

B2=round(B2/Q);%round 功能为取整

for i=1:256

for j=1:256

if(B2(i,j)==0)

num3=num3+1;

end

end

end

B3=B2*Q;

I2 = blkproc(B3,[8 8],'P1*x*P2',T',T);

figure,imshow(I2/255)

for i=1:256

for j=1:256

if(abs(B(i,j))<40) B(i,j)=0;

num2=num2+1;

end

end

end

I3 = blkproc(B,[8 8],'P1*x*P2',T',T);

figure,imshow(I3/255)

a2=num2, a3=num3

JPEG 压缩程序:

clear all

clc

disp('Enter ...')

disp('0 (default) - load a 64 x 64 image, or ')

disp('1 - Use text book 8 x 8 data (example 8.28)')

chos=input('Enter your choice: ');

if isempty(chos)

chos=0; end

if chos==0,

load lena.mat

f=x;

imshow(mat2gray(f))

clear x

else

f=[139 144 149 153 155 155 155 155

144 151 153 156 159 156 156 156

150 155 160 163 158 156 156 156

159 161 162 160 160 159 159 159

159 160 161 162 162 155 155 155

161 161 161 161 160 157 157 157

162 162 161 163 162 157 157 157

162 162 161 161 163 158 158 158];

f1=[52 55 61 66 70 61 64 73

63 59 66 90 109 85 69 72

62 59 68 113 144 104 66 73

63 58 71 122 154 106 70 69

67 61 68 104 126 88 68 70

79 65 60 70 77 68 58 75

85 71 64 59 55 61 65 83

87 79 69 68 65 76 78 94];

end

if chos==0,

f=f-128; elseif chos==1,

f=f-128,

end

drawnow

[mf,nf]=size(f);

mb=mf/8; nb=nf/8;

if chos==0,

Ff=blkproc(f,[8 8],'dct');

Ff=blkproc(Ff',[8 8],'dct');

Ff=round(Ff');

elseif chos==1,

Ff=blkproc(f,[8 8],'dct'),

Ff=blkproc(Ff',[8 8],'dct'),

Ff=round(Ff')

End

Q =[16 11 10 16 24 40 51 61

12 12 14 19 26 58 60 55

14 13 16 24 40 57 69 56

14 17 22 29 51 87 80 62

18 22 37 56 68 109 103 77

24 35 55 64 81 104 113 92

49 64 78 87 103 121 120 101

72 92 95 98 112 100 103 99];

if chos==0,

Fq=round(blkproc(Ff,[8 8],'divq',Q));

elseif chos==1,

Fq=round(blkproc(Ff,[8 8],'divq',Q)),

end

if mb*nb > 1,

fdc=reshape(Fq(1:8:mf,1:8:nf)',mb*nb,1);

fdpcm=dpcm(fdc,1);

elseif chos==1,

fdpcm=Fq(1,1)-(-17);

else

fdpcm=Fq(1,1);

end

dccof=[];

for i=1:mb*nb,

dccof=[dccof jdcenc(fdpcm(i))];

end

if chos==1,

disp(['Differential DC coefficient (' num2str(fdpcm) ') is encoded as: ']);

disp(int2str(dccof));

end

z=[1 2 6 7 15 16 28 29

3 5 8 14 17 27 30 43

4 9 13 18 26 31 42 44

10 12 19 25 32 41 45 54

11 20 24 33 40 46 53 55

21 23 34 39 47 52 56 61

22 35 38 48 51 57 60 62

36 37 49 50 58 59 63 64];

acseq=[];

for i=1:mb

for j=1:nb

tmp(z)=Fq(8*(i-1)+1:8*i,8*(j-1)+1:8*j);

eobi=max(find(tmp~=0));

acseq=[acseq tmp(2:eobi) 999];

end

end

accof=jacenc(acseq);

disp(['DC coefficient after Huffman coding has ' int2str(length(dccof)) ...

' bits']);

disp(['AC coefficient after Huffman coding has ' int2str(length(accof)) ...

' bits']);

disp(['Compression Rate ' num2str((length(dccof)+length(accof))/(mb*nb*64)) ' Bits / pixel

'])

disp(['Compression Ratio ' num2str(8/((length(dccof)+length(accof))/(mb*nb*64))) ' : 1'])


clear all

close all

c=imread('main.tif');

m=imread('door.bmp');

ms=size(m);

s=LSB(c,m,1);

%利用 LSB 算法隐藏信息

imwrite(s,'inwatermarking.tif','Compression','none');

watermarkingnew=reLSB(s,ms(1),ms(2));

%提取秘密信息

imshow(watermarkingnew)

imwrite(watermarkingnew,'watermarkingnew.tif','Compression','none');

subplot(2,2,1)

imshow(c)

title('载体图像')

subplot(2,2,2)

imshow(s)

title('伪装图像')

subplot(2,2,3)

imshow(watermarkingnew)

title('秘密信息')

function y=LSB(c,m,n)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%此函数实现 LSB 算法的隐藏过程,参数 c 表示载体图像

%参数 m 表示秘密信息,n 表示在 8 层结构中最低的 n 层进行隐藏

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

cd=double(c);

cs=size(c);

hangc=cs(1);

liec=cs(2);

mbin=im2bin(m);

lm=length(mbin);

for i=1:n:lm-n+1

t=numdec2bin(cd(ceil(i/liec/n),ceil(i/n)-(ceil(i/liec/n)-1)*liec),8);

t(9-n:8)=mbin(i:i+n-1);

cd(ceil(i/liec/n),ceil(i/n)-(ceil(i/liec/n)-1)*liec)=numbin2dec(t);

end

y=uint8(cd);

function y=reLSB(x,m,n)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%此函数实现 LSB 算法的提取过程,参数 x 表示伪装图像

%参数 m 表示提取水印图片的行数,参数 n 表示提取水印图片的列数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

xd=double(x);

xs=size(x);

hang=xs(1);

lie=xs(2);

l=m*n;

for i=1:l

yd(i)=bitget(xd(ceil(i/lie),i-(ceil(i/lie)-1)*lie),1);

end

y=bin2im(yd,m,n);

function y=numdec2bin(x,n);

%从函数将十进制数 x 转化为 n 位二进制

y=zeros(1,n);

a=x;

i=n;

while a>0

y(i)=mod(a,2);

a=floor(a/2);

i=i-1;

end

function y=numbin2dec(x)

%将二进制数转换为十进制数

a=0;

lx=length(x);

for i=1:lx

a=a+x(i)*2^(lx-i);

end

y=a;

function y=im2bin(x)

%此函数将二值图像转换为一维的二进制的比特串,参数 x 表示输入的二值图像

xd=double(x);

xs=size(x);

hang=xs(1);

lie=xs(2);

for i=1:hang

for j=1:lie

y((i-1)*lie+j)=xd(i,j);

end

end

function y=bin2im(x,m,n)

%此函数将二进制比特串 x 转换成 m*n 的二值图像

for i=1:m

for j=1:n

yd(i,j)=x((i-1)*n+j);

end

end

y=yd;

clear all;

close all;

c=imread('im3.jpg');

cs=size(c);

row=cs(1);

column=cs(2);

for i=1:row

for j=1:column

cnewup(i,j)=abstract(c(i,j),2,8);

%提取最高层的图像

cnewdown(i,j)=abstractdown(c(i,j),7);

%提取最低层的图像

end

end

figure(1)

subplot(1,2,1)

imshow(cnewup)

subplot(1,2,2)

imshow(cnewdown)

function y=abstractdown(x,m)

%此函数提取提取最低的 8m 层的图像

xd=double(x);

numbin=ones(1,8);

numbin(1:m)=0;

numdec=numbin2dec(numbin);

yd=bitand(xd,numdec);

y=uint8(yd*2^m);

function y=abstract(x,m,n)

%此函数提取除了 m n 层的图像

xd=double(x);

numbin=ones(1,8);

numbin(m:n)=0;

numdec=numbin2dec(numbin);

y=uint8(bitand(xd,numdec));

function y=imcat3(x,n)

%此函数将图像 x 分成 n 层结构

xs=size(x);

lie=xs(2);

hang=xs(1);

for j=1:lie

for i=1:hang

xbin=numdec2bin(x(i,j),n);

for k=1:n

y(i,j,k)=xbin(k);

end

end

end

function hide = myhide(carry,signal,x,y)

%********************************************************************

% myhide DCT 域的隐藏函数

% carry 是载体文件,signal 是需要隐藏的信息

% carry signal 都必须是 '*.*' 的形式(注意不能省略单引号)

% x,y 是选取隐藏信息的位置坐标,在(x,y)和(y,x)处

%********************************************************************

tx3 = imread(carry);

tx1 = tx3(:,:,1);

tx = im2double(tx1);

[aa,bb] = size(tx);

c = aa-mod(aa,8);

d = bb-mod(bb,8);

%if aa~=c

%

tx(c+1:aa,:) = [];

%end

%if bb~=d

%

tx(:,d+1:bb) = [];

%end

ni1 = imread(signal);

ni = im2double(ni1);

[a,b] = size(ni);

if a*8>c

hide = [];

disp('Error! The picture you want to hide is too big!');

disp('The size must be no bigger than ');

disp(d/8);

disp('By');

disp(c/8);

elseif b*8>d

hide = [];

disp('The picture you want to hide is too big!');

disp('The size must be no bigger than ');

disp(d/8);

disp('By');

disp(c/8);

else

%**********************************************************************

DCT8 = zeros(c,d);

for i=0:c/8-1

for j=0:d/8-1

DCT8(i*8+1:i*8+8,j*8+1:j*8+8) = dct2(tx(i*8+1:i*8+8,j*8+1:j*8+8));

end

end

MAX = max(max(abs(DCT8)));

MIN = min(min(abs(DCT8)));

deta = (MAX-MIN)/100;

%[a,b] = size(ni);

for i = 0:a-1

for j = 0:b-1

if ni(i+1,j+1)==1

if DCT8(i*8+x,j*8+y)-DCT8(i*8+y,j*8+x)>=deta

temp1 = DCT8(i*8+y,j*8+x);

DCT8(i*8+y,j*8+x) = DCT8(i*8+x,j*8+y);

DCT8(i*8+x,j*8+y) = temp1;

elseif DCT8(i*8+x,j*8+y)-DCT8(i*8+y,j*8+x)>=0

DCT8(i*8+x,j*8+y) = DCT8(i*8+x,j*8+y)+deta;

temp1 = DCT8(i*8+y,j*8+x);

DCT8(i*8+y,j*8+x) = DCT8(i*8+x,j*8+y);

DCT8(i*8+x,j*8+y) = temp1;

elseif DCT8(i*8+x,j*8+y)-DCT8(i*8+y,j*8+x)>=(-1)*deta

DCT8(i*8+y,j*8+x) = DCT8(i*8+y,j*8+x)+deta;

end

else

if DCT8(i*8+x,j*8+y)-DCT8(i*8+y,j*8+x)<=(-1)*deta

temp1 = DCT8(i*8+y,j*8+x);

DCT8(i*8+y,j*8+x) = DCT8(i*8+x,j*8+y);

DCT8(i*8+x,j*8+y) = temp1;

elseif DCT8(i*8+x,j*8+y)-DCT8(i*8+y,j*8+x)<=0

DCT8(i*8+y,j*8+x) = DCT8(i*8+y,j*8+x)+deta;

temp1 = DCT8(i*8+y,j*8+x);

DCT8(i*8+y,j*8+x) = DCT8(i*8+x,j*8+y);

DCT8(i*8+x,j*8+y) = temp1;

elseif DCT8(i*8+x,j*8+y)-DCT8(i*8+y,j*8+x)<=deta

DCT8(i*8+x,j*8+y) = DCT8(i*8+x,j*8+y)+deta;

end

end

end

end

figure(1);imshow(DCT8);

hide1 = zeros(c,d);

for i=0:c/8-1

for j=0:d/8-1

hide1(i*8+1:i*8+8,j*8+1:j*8+8)

=

idct2(DCT8(i*8+1:i*8+8,j*8+1:j*8+8));

end

end

hide = tx;

hide(1:c,1:d) = hide1;

imwrite(cat(3,hide,hide,hide),'hide.bmp');

%*************************************************************

end


function behidden = myinhide(carry,x,y)

%**************************************************************************

% myinhide() 是用来提取 DCT 域隐藏的图像的

% carry 为隐藏了信息的图像文件,格式为

'*.*'(注意不要丢掉单引号);

% x,y 是选取隐藏信息的位置坐标,在(x,y)和(y,x)处

%**************************************************************************

hide3 = imread(carry);

hide1 = hide3(:,:,1); %有些文件读入后是三维矩阵

hide = im2double(hide1);

[c,d] = size(hide);

a = floor(c/8);

b = floor(d/8);

DCT8 = zeros(c,d);

for i=0:a-1

for j=0:b-1

DCT8(i*8+1:i*8+8,j*8+1:j*8+8) = dct2(hide(i*8+1:i*8+8,j*8+1:j*8+8));

end

end

behidden = zeros(a,b);

for i = 0:a-1

for j = 0:b-1

if DCT8(i*8+x,j*8+y)

behidden(i+1,j+1) = 1;

end

end

end

imwrite(cat(3,behidden,behidden,behidden),'behidden.bmp');

信息隐藏攻击方法

参考程序说明如下:

mycompress.m

JPEG有损压缩

qu=90; %压缩比

ysq=imread('watermarked.bmp');

imwrite(ysq,'watermarked2.jpg','quality',qu);

mycrop.m

剪切

%剪切攻击

W= imread('mccmj.bmp');

W2= imcrop(W);

imshow(W), figure, imshow(W2)

myhighpass.m 高通滤波器

%高通滤波器(不知道对不对)

U= imread('mccmj.bmp');

word/media/image1.gif

U1=im2double(U);

[N, Wn] = CHEB2ORD(2*pi*1000/FS,2*pi*900/FS,1,10);

[b,a] = cheby2(N,60,Wn,'high');

V= filter(b,a,U1);

imshow(U)

figure, imshow(V)

mylowpass.m 低通滤波器

%低通滤波器

U= imread('mccmj.bmp');

U1=im2double(U);

[N, Wn] = CHEB2ORD(2*pi*500/FS,2*pi*600/FS,1,60);

[b,a] = cheby2(N,60,Wn);

V= filter(b,a,U1);

imshow(U)

figure, imshow(V)

mynoise.m

高斯,椒盐噪声

%噪声攻击(高斯,椒盐)

W=imread('mccmj.bmp');

W1=IMNOISE(W,'gaussian',0,0.001);

W2=imnoise(W,'salt & pepper', 0.001);

imshow(W)

figure, imshow(W1)

figure,imshow(W2)

myresize.m

放缩

%几何失真(放缩)

W=imread('mccmj.bmp');

W1=imresize(W,4);

W2=imresize(W1,0.25);

imshow(W)

figure, imshow(W1)

figure,imshow(W2)

myrotate.m

旋转

%旋转攻击

W= imread('mccmj.bmp');

W1 = imrotate(W,35,'bilinear');

W2=

imrotate(W1,325,'bilinear');

imshow(W)

figure, imshow(W1)

figure, imshow(W2)

mywiener.m

维纳滤波

%维纳滤波

W = imread('mccmj.bmp');

%W1 = imnoise(W,'gaussian',0,0.005);

W2= wiener2(W,[5 5]);

imshow(W), figure, imshow(W2)

myattack.m

以上所有攻击的集合

%数字水印的攻击方法

ori=imread('hide.bmp');

[ll,vv]=size(ori);

%%%%%%%%%%%%%%%jepg 有损压缩

qu=80;%有损压缩的程度

imwrite(ori,'newcom.jpg','quality',qu);

%%%%%%%%%%%%%%%%%%几何放缩

mysize=0.25;%将图像大小变为原图像的 mysize

newsize1=imresize(ori,mysize);

newsize2=imresize(newsize1,[ll,vv]);%变为原来大小

imwrite(newsize2,'newsize.tif');

%%%%%%%%%%%%%%%%%%%平滑滤波

%%%%%%%%%%%%%%%图像剪切

mycrop=imcrop(ori);

imwrite(mycrop,'newcrop.tif');

%%%%%%%%%%%%%%%%%图像旋转

ang=60;%欲旋转角度

myrotate=imrotate(ori,ang,'bilinear');

imwrite(myrotate,'newrotate.tif');

%%%%%%%%%%%%%%%%%%%加入高斯噪声

ave=0;%噪声均值

ver=0.01;%噪声方差

mynoise=IMNOISE(ori,'gaussian',ave,ver);

imwrite(mynoise,'newnoise.tif');

(使用时请注意文件名,在代码的相应行略作改动即可)

本文来源:https://www.2haoxitong.net/k/doc/e8ac107dad51f01dc381f16a.html

《代码.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式