图像隐写基于matlab DWT+DCT+LSB数字水印隐藏提取比较含Matlab源码 1623期

Posted 紫极神光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像隐写基于matlab DWT+DCT+LSB数字水印隐藏提取比较含Matlab源码 1623期相关的知识,希望对你有一定的参考价值。

一、DCT数字水印嵌入与提取简介

1 基本DCT变换
目前,基于DCT域的水印方法已经成为数字水印算法研究的热点,它的核心思想就是通过离散傅立叶变换对图像块进行处理后,再选择变换域中的一些系数值依据一定规则来嵌入水印。
由于图像块中DCT系数频带分布由左上角的直流分量DC往下对应的系数频率由低频升至高频,因此在不影响原图质量的前提下,可将水印信息根据能量大小嵌入相应系数频带中。通过图像块量化与水印嵌入结合的处理方法将水印信息均匀分布在图像的整个空间域,在图像裁剪和滤波方面,变换域的水印比在空间域的更能表现出一定的鲁棒性。

2 水印算法描述
2.1 水印嵌入算法
该算法采用加性嵌入的方式在经过DCT变换后的子图像块的中频域中,选取隐秘位置嵌入水印信息,具体的嵌入流程如下图1所示:

图1 分块水印嵌入流程
(1)分块处理:设宿主图像为P,将其分块处理为8*8的K个子块。
(2)水印预处理:设水印图像为W,对其进行互补变换,变换后的水印图像和变换前的水印图像相互补。
(3)对水印图像进行Arnold置乱变换,并依据混沌映射规则,选取密钥混沌序列并与水印序列异或运算,将置换次数和异或运算处理后的结果分别作为水印嵌入算法的密钥1和密钥2。
(4)DCT变换:对各子块内做DCT变换,利用zig-zag对DCT系数进行扫描,得到第k块子图像块的序列为Zk(i),i=0,1,2,…63.
(5)水印嵌入算法:依据zig-zag排序,在各子块的中、低频段选取特定系数x(m)和x(n),在系数坐标(a,b)和(c,d)处嵌入水印信息图像W,并将其作为密钥3。同理,嵌入互补水印图片W’,并将嵌入的位置作为密钥4。水印嵌入的方法如下:


(6)IDCT变换:将每一个子图像块作二维DCT逆变换。
(7)子块合并:将每一个子块合并成嵌入水印的图像P’。

2.2 水印提取算法
将嵌入水印的图像P’分块处理,并对各子块进行二维DCT变换,由密钥3和4推断所选择的水印系数,若x(m)≤x(n),则水印信息为0,若x(m)>x(n),则水印信息为1,再利用密钥1和2将初步水印的信息解密再进行Arnold逆变换,最终提取出水印信息。

2.3 水印检测算法
本文通过计算峰值信噪比PSNR的值评价嵌入水印的宿主图像的质量,一幅m和n的图像,PSNR度量标准定义为:

归一化相关系数NC的值判断嵌入水印的图像与宿主图像的相似度,其定义为:

二、部分源代码

%读取要隐藏的灰度图
img1=imread('images/yang1.bmp');
%读取载体图片
imghide=imread('images/lenaRGB.bmp');

%获取载体图片R值矩阵
image_r = imghide(:,:,1);
%获取载体图片G值矩阵
image_g = imghide(:,:,2);
%获取载体图片B值矩阵
image_b = imghide(:,:,3);
%置乱
img2 = zhiluan(img1);
[h w e]=size(img2);
img2 = double(img2);

%将图像的每个像素点转换成8位二进制
matrixImg = reshape(cellstr(dec2bin(img2,8)),size(img2));

%生成三个二维矩阵存放转换后的二进制串
matrixR=zeros(64,64);
matrixG=zeros(64,64);
matrixB=zeros(64,64);
%二进制个数
num = 1;
%将置乱的图像存入三个64*64的矩阵中,方便后续进行的加密算法(隐藏进入彩色图片R\\G\\B的三个二维矩阵)
for row = 1:h
    for column = 1:w
        for pos = 8:-1:1
            if(num<=64*64)
                %将前面64*64个比特隐藏进R二维矩阵
                if(mod(num,64)~=0)
                    matrixR(floor(num/64+1),mod(num,64)) = bitget(bin2dec(matrixImg(row,column)),pos);
                    num = num+1;
                else
                    matrixR(floor(num/64),64) = bitget(bin2dec(matrixImg(row,column)),pos);
                    num = num+1;
                end
            elseif(num<=64*64*2)
                %将中间64*64个比特隐藏进G二维矩阵
                if(mod(num,64)~=0)
                    matrixG(floor(num/64+1)-64,mod(num,64)) = bitget(bin2dec(matrixImg(row,column)),pos);
                    num = num+1;
                else
                    matrixG(floor(num/64)-64,64) = bitget(bin2dec(matrixImg(row,column)),pos);
                    num = num+1;
                end
            elseif(num<=64*64*3)
                %将最后64*64-120个比特隐藏进B二维矩阵,后面的120位不隐藏数据,因此全是2
                if(mod(num,64)~=0)
                    matrixB(floor(num/64+1)-128,mod(num,64)) = bitget(bin2dec(matrixImg(row,column)),pos);
                    num = num+1;
                else
                    matrixB(floor(num/64)-128,64) = bitget(bin2dec(matrixImg(row,column)),pos);
                    num = num+1;
                end
            end    
        end
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%调用三种隐藏算法分别在彩色图片的三个二维矩阵中隐藏matrixR、matrixG、matrixB
%最终三种隐藏算法后输出一张藏有隐藏图片的彩色图片
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

subplot(1,1,1)
imshow(imghide);
title('信息隐藏后的图片')
%保存隐藏信息后的图片
imwrite(imghide,'images/hide.bmp');
function image_g = DCT(original,watermark)
M=512; % 原图像长度  b=zeros(size(a),'uint8');
I=zeros(M,M);	% 原图数据
D=zeros(M,M);	
D1=zeros(M,M,'uint8');
J=zeros(M,M); % 水印图片的信息
N=64;                   % 水印信息长度
W=zeros(N,N);	%恢复的水印
L=zeros(M,M);
block_dct1=zeros(M,M);
block_idct=zeros(M,M);
K=8;                     % 分块系数


%隐藏矩阵存到I中,隐藏信息存到J中
I=original;
J=watermark;
for m=1:N                               %N=64为隐藏信息矩阵大小
    for n=1:N 
        x=(m-1)*K+1;                    %K=8为分块的大小
        y=(n-1)*K+1;
        block_dct=I(x:x+K-1,y:y+K-1);   %取出一个8*8分块
        block_dct1=dct2(block_dct);     %对分块进行二维离散余弦变换 
		if(J(m, n)==0)
			%和斜下角的对比 小于就插入0
			if(block_dct1(4,4)>block_dct1(5,5))
                if(abs(block_dct1(4,4)-block_dct1(5,5))<4)
                    block_dct1(5,5) = block_dct1(5,5) - 4;
                end
				temp = block_dct1(4,4);
				block_dct1(4,4) = block_dct1(5,5);
				block_dct1(5,5) = temp;
			end
        else
			%大于斜下角的就插入1
			if(block_dct1(4,4)<block_dct1(5,5))
                if(abs(block_dct1(4,4)-block_dct1(5,5))<4)
                    block_dct1(4,4) = block_dct1(4,4) - 4;
                end
			
			end
		end
        block_idct=idct2(block_dct1);     %逆离散余弦变换
        
        D(x:x+K-1,y:y+K-1)=block_idct;    %保存嵌入秘密信息后的逆变换结果
    end
end
image_g = uint8(D);
return

三、运行结果



四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]万谊丹.基于Arnold和DCT的抗剪切攻击图像水印研究[J].网络安全技术与应用. 2021,(08)

以上是关于图像隐写基于matlab DWT+DCT+LSB数字水印隐藏提取比较含Matlab源码 1623期的主要内容,如果未能解决你的问题,请参考以下文章

图像隐写基于matlab DWT+FFT+DCT水印攻击+提取含Matlab源码 2411期

图像隐写基于matlab GUI DWT+DCT+SVD数字水印嵌入+提取+攻击(带面板)含Matlab源码 1664期

图像隐写基于LSB+DCT实现数字水印嵌入提取带攻击测试matlab源码含GUI

语音隐写基于DCT+DWT音频数字水印嵌入提取matlab源码含GUI

语音隐写基于matlab DCT+DWT+SVD音频数字水印嵌入提取含Matlab源码 1408期

多种隐写基于matlab GUI LSB+DCT文本图片嵌入+提取含Matlab源码 1851期