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)
%此函数提取提取最低的 8-m 层的图像
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格式