帮帮忙:matlab基于dct数字水印程序运行有问题

以下是我在网上搜的一个关于数字水印matlab实现dct域的程序,但运行时报错,不知道出错原因在哪里,程序源码如下:
clear all;
clc;
start_time=cputime;
%%%%%%%%%%%% 读取水印图像 %%%%%%%%
I=imread('mark.bmp');
I=rgb2gray(I);
I=double(I)/255;
I=ceil(I);
%%%%%%%%%%显示水印图像%%%%%%%%%%%%%
figure(1);
subplot(2,3,1);
imshow(I),title('水印图像')
dimI=size(I);
rm=dimI(1);cm=dimI(2);
%%%%%%%%%%%%%%%5 以下生成水印信息 %%
mark=I;
alpha=50,
k1=randn(1,8);
k2=randn(1,8);
a0=imread('lena.bmp');
psnr_cover=double(a0);
subplot(2,3,2),imshow(a0,[]),title('载体图像');
[r,c]=size(a0);
cda0=blkproc(a0,[8,8],'dct2');
%%%%%%%%%%%%%%%%%%%%% 嵌入 %%%%%%%%%%
cda1=cda0; % cda1 = 256_256
for i=1:rm % i=1:32
for j=1:cm % j=1:32
x=(i-1)*8;y=(j-1)*8;
if mark(i,j)==1
k=k1;
else
k=k2;
end
cda1(x+1,y+8)=cda0(x+1,y+8)+alpha*k(1);
cda1(x+2,y+7)=cda0(x+2,y+7)+alpha*k(2);
cda1(x+3,y+6)=cda0(x+3,y+6)+alpha*k(3);
cda1(x+4,y+5)=cda0(x+4,y+5)+alpha*k(4);
cda1(x+5,y+4)=cda0(x+5,y+4)+alpha*k(5);
cda1(x+6,y+3)=cda0(x+6,y+3)+alpha*k(6);
cda1(x+7,y+2)=cda0(x+7,y+2)+alpha*k(7);
cda1(x+8,y+1)=cda0(x+8,y+1)+alpha*k(8);

end
end
%%%%% 嵌入水印后图像 %%%%%%%%%%%%%%
。。。。。。。。
报错为On line 40 ==> cda1(x+1,y+8)=cda0(x+1,y+8)+alpha*k(1);
写不下那么多,程序运行结果只显示了水印图像和源图像,并未显示嵌入水印后图像和提取的水印,希望高手们指教下,小妹很着急
??? Index exceeds matrix dimensions.

Error in ==> D:\matlab\work\last\watermark.m
On line 40 ==> cda1(x+1,y+8)=cda0(x+1,y+8)+alpha*k(1);
你分析的挺对的,是矩阵越界的问题,但不知道怎么改,载体图像是按照8X8分块的。。。

第1个回答  推荐于2016-09-05
拜托,把matlab的错误提示全部粘上来
你看下cda1(x+1,y+8)和cda0(x+1,y+8)的下标越界没有,这个可能性很大
---------------------------------------------------------------------
我不知道你用的一些函数到底是怎么写的,所以只能给点建议:
首先,你看下cda0是几X几的矩阵.
for i=1:rm % i=1:32
for j=1:cm % j=1:32
x=(i-1)*8;y=(j-1)*8;这3句话是错误的根源,如果cda0是8X8的矩阵,而你在32X32的区间索引,那么必定出错.你需要做的是,仔细计算X,Y的值,让他们正好落在cda0的范围内句可以了.本回答被提问者采纳
第2个回答  2012-05-12
有木有提取部分的程序啊,我弄了半天不成功诶

基于DCT算法的数字水印MATLAB程序报错错哪了
Idct=dct2(II);%对子块进行DCT变换 if x==1&y==1 alfa=0.002;else alfa=0;for里面是错的,这个程序在好几年前就看到了,还在用。。。matlab运算便捷了很多,最好matlab里面不要用for,因为matlab本身就有很多for模块,所以在matlab里面用for会大大的降低速度。还有,matlab有严格的矩阵运算格式...

【基于DCT变换的数字图像水印研究】 数字图像水印
通过实验图片的效果显示,我们可以看到加入水印后的图像基本不影响原图片的质量,也看不出水印的图案,而且可以基本保持载体图片的原貌。从被攻击后的图像中也可以顺利恢复出来水印,并且能够识别原水印。因此,通过分块的离散余弦变换可以实现数字图像水印的嵌入与提取,并且有良好的抗攻击能力。[参考文献][1] ...

基于DCT域数字水印有几种方法 , 基于小波域数字水印方法有几种
检测所带来的问题是:在量化后的DCT系数上添加的水印(系数的变换)可能在解压缩的过 程中被放大,从而引起水印和图像的失真。好的水印算法必须综合水印的嵌入和图像压缩 技术使失真维持到最小。Cox等提出在图像全局DCT变换域中除Dc分量外系数幅值最大的n个系数中嵌入水印信 息,由于图像的主要能量均集中...

急需个基于DCT域数字水印程序
中频 用掩膜确定, d(3,4)就是第三行第四列那个数 d(2,6)同理,比较大啊 不过就这两个系数比较大小 你的嵌入信息只有1bit啊 ,

基于DCT数字水印的源代码,怎么弄那个水印图片
在画图工具中,自己生成,选择“属性”选择自己想要的大小64*64或32*32像素,选取黑白,选取自己想写的字或字母,确定字体和大小,就可以生成二值图形啦!

Matlab DWT与SVD数字水印【解析 参考源码】
Matlab中的DWT(离散小波变换)与SVD(奇异值分解)在数字水印技术中扮演着关键角色。它们基于变换域的特性,提供了一种稳健的水印嵌入和提取策略。DCT(离散余弦变换)利用图像高频信息的集中性,而SVD的稳定性则确保了水印在图像扰动时的可靠性。在水印嵌入过程中,首先对图像进行DCT变换,然后选择SVD分解...

...基于DCT域的屏蔽图像信息隐藏算法(Matlab实现)
DCT是一种频域变换方法,将图像分解为频率成分,捕获关键特性。待隐藏信息通常需进行编码,以安全嵌入图像中,可能涉及差错控制和加密技术。为了提高安全性,有时会在嵌入信息的同时嵌入水印,用于验证图像真实性和完整性。解码和提取过程包括识别和还原嵌入信息,以及解密编码信息(若有)。此算法在数字水印、...

在基于dct域的鲁棒水印程序中,midband有何具体作用
DCT变换和小波变换都属于数字水印的变换域算法。。。针对水印的不同特性,如:脆弱性,鲁棒性,不可感知性又有不同的算法。。DCT和DWT(小波)方法基本上是可以通用的。有基于量化的,扩频的,鲁棒的,自适应的,盲取的等各种算法

怎么用matlab从含有水印的图像中提取出水印
将Matlab应用于数字水印技术,其优点主要有以下几个方面:(1) 强大的数值计算功能视频水印技术是针对图像进行研究的,而图像是由矩阵表达的,将水印嵌入视频中及从视频中将水印提取出来都意味着大量的矩阵运算,而矩阵运算更是Matlab语言的核心,表达自然、直接。因此,利用Matlab强大的矩阵运算功能来实现图像水印技术非常合适。

我用MATLAB做的水印,怎么用stirmark进行攻击?急求
将Matlab应用于数字水印技术,其优点主要有以下几个方面:(1) 强大的数值计算功能视频水印技术是针对图像进行研究的,而图像是由矩阵表达的,将水印嵌入视频中及从视频中将水印提取出来都意味着大量的矩阵运算,而矩阵运算更是Matlab语言的核心,表达自然、直接。因此,利用Matlab强大的矩阵运算功能来实现图像水印技术非常合适。

相似回答