随机间隔法:
function [row,col]=randinterval(matrix,count,key)
[m,n]=size(matrix);
interval1=floor(m*n/count)+1;
interval2=interval1-2;
if interval2==0
error('载体小不能秘信息藏进去');
end
rand('seed',key);
a=rand(1,count);
row=zeros([1 count]);
col=zeros([1 count]);
r=1;
c=1;
row(1,1)=r;
col(1,1)=c;
for i=2:count
if a(i)>=0.5
c=c+interval1;
else
c=c+interval2;
end
if c>n
r=r+1;
if r>m
error('载体小不能秘信息藏进去');
end
c=mod(c,n);
if c==0
c=1;
end
end
row(1,i)=r;
col(1,i)=c;
end
嵌入:
function [count,msg,result]=hidedctadv(image,imagegoal,msg,key,alpha)
%image='lena.jpg';
%imagegoal='lenahide.jpg';
%msg='1.txt';
%key=1982;
%alpha=1;
frr=fopen(msg,'r');
[msg,count]=fread(frr,'ubit1');
fclose(frr);
data0=imread('lena.jpg');
data0=double(data0)/255;
data=data0(:,:,1);
T=dctmtx(8);
DCTrgb=blkproc(data,[8 8],'P1*x*P2',T,T');
[row,col]=size(DCTrgb);
row=floor(row/8);
col=floor(col/8);
a=zeros([row col]);
[k1,k2]=randinterval(a,count,key);
for i=1:count
k1(1,i)=(k1(1,i)-1)*8+1;
k2(1,i)=(k2(1,i)-1)*8+1;
end
temp=0;
for i=1:count
if msg(i,1)==0
if DCTrgb(k1(i)+4,k2(i)+1)>DCTrgb(k1(i)+3,k2(i)+2)
temp=DCTrgb(k1(i)+4,k2(i)+1);
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+3,k2(i)+2);
DCTrgb(k1(i)+3,k2(i)+2)=temp;
end
else
if DCTrgb(k1(i)+4,k2(i)+1)<DCTrgb(k1(i)+3,k2(i)+2)
temp=DCTrgb(k1(i)+4,k2(i)+1);
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+3,k2(i)+2);
DCTrgb(k1(i)+3,k2(i)+2)=temp;
end
end
if DCTrgb(k1(i)+4,k2(i)+1)>DCTrgb(k1(i)+3,k2(i)+2)
DCTrgb(k1(i)+3,k2(i)+2)=DCTrgb(k1(i)+3,k2(i)+2)-alpha;
else
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+4,k2(i)+1)-alpha;
end
end
DCTrgb1=DCTrgb;
data=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T);
result=data0;
result(:,:,1)=data;
imwrite(result,imagegoal);
提取:
function result=extractdctadv(image,msg,key,count)
data0=imread(image);
data0=double(data0)/255;
data=data0(:,:,1);
T=dctmtx(8);
DCTcheck=blkproc(data,[8 8],'P1*x*P2',T,T');
[row,col]=size(DCTcheck);
row=floor(row/8);
col=floor(col/8);
a=zeros([row col]);
[k1,k2]=randinterval(a,count,key);
for i=1:count
k1(1,i)=(k1(1,i)-1)*8+1;
k2(1,i)=(k2(1,i)-1)*8+1;
end
frr=fopen(msg,'a');
for i=1:count
if DCTcheck(k1(i)+4,k2(i)+1)<=DCTcheck(k1(i)+3,k2(i)+2)
fwrite(frr,0,'bit1');
result(i,1)=0;
else
fwrite(frr,1,'bit1');
result(i,1)=1;
end
end
fclose(frr);
test:
function test()
key=1982;
count=0;
alpha=0.5;
[count,msg,data]=hidedctadv('lena.jpg','lenahide.jpg','1.txt',key,alpha);
tt=extractdctadv('lenahide.jpg','2.txt',key,count);
相关推荐
《基于DCT变换的数字水印算法》 在信息技术领域,数字水印技术是一种重要的版权保护手段,它通过在原始数据中嵌入不可见或难以察觉的信息,来证明数据的所有权或者验证其真实性。本项目重点探讨了一种利用离散余弦...
总的来说,DCT域图像数字水印算法结合了DCT变换的优势,能够在保证图像质量的同时实现水印的有效隐藏。通过阅读和理解源代码,读者可以进一步了解这一技术的实现细节,并根据实际需求进行调整和优化。
在DCT数字水印算法中,原始图像首先被分割成多个小块,每个小块进行DCT变换。水印信息通过修改DCT系数来嵌入,通常是在高频或中频系数上添加微小的扰动。这种扰动对人类视觉系统来说是不可见的,但可以通过逆变换和...
在MATLAB环境中,我们可以利用其强大的图像处理和数值计算功能来实现这种DCT变换的数字水印算法。MATLAB提供了DCT函数`dct2()`,以及各种图像处理和分析工具,如图像的读取、显示、滤波和统计分析等,这使得在实验和...
本文提出的一种基于DCT变换域的数字水印设计方案,不仅考虑了人眼视觉特性的多方面因素,还充分利用了DCT变换的优势,实现了在保护图像视觉质量的同时,增强了水印的鲁棒性和嵌入能力。未来的研究方向可以进一步探索...
在实现DCT数字水印的过程中,可以利用MATLAB的函数高效地进行DCT变换、系数操作和反变换,大大简化了算法的实现。 5. **数字水印算法与imagewatermark**: "imagewatermark"可能指的是用于图像水印处理的一种特定...
DCT(Discrete Cosine Transform,离散余弦变换)数字水印算法是一种基于DCT域的数字水印技术,本算法利用图像的频域特性来嵌入和提取水印信息。该算法的核心思想是将水印信息嵌入到图像的DCT系数中,以达到隐蔽性和...
通过MATLAB编程实现了上述基于DCT域的数字水印嵌入与提取算法。实验结果表明,该算法对常见的压缩编码方法具有良好的稳健性。即使图像经过了JPEG等压缩处理,水印信息仍然可以被准确地提取出来。此外,算法还展示了...
2. DCT变换:对小块图像进行DCT变换,将图像从空间域转换到频域。 3. 水印信息嵌入:将水印信息嵌入到频域中的低频部分。 4. 反变换:将频域中的图像反变换回空间域。 5. 重构图像:将所有的小块图像组合起来,形成...
基于DCT变换的数字水印算法 carry_x.bmp 为载体图片 water_x.bmp 为水印图片 test.fig 为图形界面 main.m 为程序执行入口 test.m 为程序主函数 ispsnr.m 为计算峰值信噪比函数(不会再程序中体现) nc.m ...
下面我们将深入探讨这个“基于DCT变换的数字水印嵌入算法”。 一、离散余弦变换(DCT) 离散余弦变换是一种信号处理技术,常用于图像和音频压缩,如JPEG和MP3编码。DCT将图像从像素空间转换到频率空间,将空间信息...
本资源提供了一个基于DCT域的数字水印算法的Matlab实现代码,涵盖了水印的生成、嵌入和检测三个主要步骤。该代码可以为数字水印技术的研究和应用提供有价值的参考。 知识点: 1. 数字水印技术:数字水印是一种将...
描述中提到的“一个基于dct变换的数字水印算法的源程序.rar”,暗示了这个压缩包包含的是用某种编程语言(可能是C、C++、Python等)实现的DCT数字水印算法的源代码文件。通过分析这些源代码,我们可以深入了解如何在...
在MATLAB实现DCT变换域数字水印时,需要注意以下几点: - **选择合适的水印**:水印可以是文本、图像或者其他形式的标识,关键是要保证其在被嵌入后不影响原始媒体的质量。 - **选择合适的嵌入位置和强度**:根据...
音频数字水印技术的一种算法,利用DCT变换实现,载入的水印为图像