clear;
% 读入原始图像
image1 = imread( 'test.jpg' );
[ ydim,xdim,zdim ] = size(image1);
% 保存为不同JPEG质量
q1 = 90; % 篡改后图像的JPEG质量
imwrite( image1, 'tp1.jpg', 'quality', q1 );
q2 = 60; % 篡改区域的JPEG质量 (q2 < q1)
imwrite( image1, 'tp2.jpg', 'quality', q2 );
% image1与image2结合生成篡改图像
areasize = 200; % 篡改像素区域大小
image1 = imread( 'tp1.jpg' );
image2 = imread( 'tp2.jpg' );
xrange = round( [xdim/2-areasize/2 : xdim/2+areasize/2-1] ); % 篡改区域长度
yrange = round( [ydim/2-areasize/2 : ydim/2+areasize/2-1] ); % 篡改区域高度
image1(yrange,xrange,:) = image2(yrange,xrange,:); % 拼接
imwrite( image1, 'tp3.jpg', 'quality', q1 ); % 再次保存
% 读取篡改后图像
image3 = imread( 'tp3.jpg' );
[ydim,xdim,zdim] = size(image3);
% 计算篡改后的图像与它各个副本之间的差
qrange = [15 : 5 : 90]; % 保存副本的量化范围,步长为五
number = length(qrange); % 副本数量
map = zeros( ydim, xdim, number ); % 每个副本初始化为零
c = 1; % 循环变量
for q = qrange
imwrite( image3, 'tp4.jpg', 'quality', q ) ;
image4 = imread( 'tp4.jpg' );
% 计算RGB三个通道的差值,最后取平均
for z = 1 : zdim
map(:,:,c) = map(:,:,c) + ( double(image3(:,:,z)) - double(image4(:,:,z)) ).^2;
end
map(:,:,c) = map(:,:,c) / zdim;
c = c + 1;
end
% 对差值图像按块进行平均
b = 16; % 块大小
block = zeros( floor((ydim-b)/b), floor((xdim-b)/b), number );
for c = 1 : number
cy = 1;
for y = 1 : b : ydim-b
cx = 1;
for x = 1 : b : xdim-b
blk = map(y:y+b-1,x:x+b-1,c);
block(cy,cx,c) = mean(blk(:));
cx = cx + 1;
end
cy = cy + 1;
end
end
% 归一化
minmap = min( block, [], 3 );
maxmap = max( block, [], 3 );
for c = 1 : number
block(:,:,c) = block(:,:,c) - minmap;
block(:,:,c) = block(:,:,c) ./ (maxmap-minmap);
end
% 显示结果
dp = ceil( sqrt(number) );
imshow('tp3.jpg');
title('篡改后的图像');
figure;
for c = 1 : number
subplot(dp,dp,c);
imshow( block(:,:,c),[0 1] );
axis image off;
title( sprintf( '%d', qrange(c) ) );
drawnow;
end
评论0