运行后显示索引超出边界要怎么解决呀,有人教教我吗
clc;
clear;
% 读取原始图像
I = imread('lena.bmp');
I = rgb2gray(I);
% 将图像进行小波变换
[cA, cH, cV, cD] = dwt2(I, 'haar');
% 将小波系数进行FFT变换
fft_cA = fft2(cA);
fft_cH = fft2(cH);
fft_cV = fft2(cV);
fft_cD = fft2(cD);
% 生成随机的数字水印
watermark = randi([0 1], 1, 64);
% 将数字水印嵌入到小波系数中
alpha = 0.1;
for i = 1:8
for j = 1:8
block = fft_cA((i-1)*64+1:i*64, (j-1)*64+1:j*64);
block(33:64) = block(33:64) + alpha * watermark((i-1)*8+j);
fft_cA((i-1)*64+1:i*64, (j-1)*64+1:j*64) = block;
end
end
% 将嵌入了数字水印的小波系数进行逆FFT变换
idwt_cA = ifft2(fft_cA);
idwt_cH = ifft2(fft_cH);
idwt_cV = ifft2(fft_cV);
idwt_cD = ifft2(fft_cD);
% 将逆变换后的小波系数合并成一张图像
I_watermark = idwt2(idwt_cA, idwt_cH, idwt_cV, idwt_cD, 'haar');
% 显示原始图像和带有数字水印的图像
figure;
subplot(1, 2, 1);imshow(I);
title('Original Image');
subplot(1, 2, 2);
imshow(I_watermark);
title('Watermarked Image');
% 从带有数字水印的图像中提取出数字水印
extracted_watermark = zeros(1, 64);
for i = 1:8
for j = 1:8
block = fft_cA((i-1)*64+1:i*64, (j-1)*64+1:j*64);
extracted_watermark((i-1)*8+j) = abs(corr2(block(33:64), watermark((i-1)*8+j)));
end
end
% 显示提取出的数字水印
figure;
subplot(1, 2, 1);
imshow(I_watermark);
title('Watermarked Image');
subplot(1, 2, 2);
bar(extracted_watermark);
title('Extracted Watermark');
这个错误可能是因为在嵌入数字水印时,小波系数的大小与数字水印的大小不匹配导致的。
可以检查一下代码中的循环是否正确,以及数字水印的大小是否与小波系数的大小匹配。
可以使用方括号在字符向量后面追加文本。但是,如果使用方括号向字符串数组添加文本,新文本将作为字符串数组的新元素进行串联。要为字符串追加文本,请使用plus
运算符或strcat
函数。
例如,如果串联两个字符串,则结果是一个 1×2 字符串数组。
str = ["Hello" "World"]
str = 1×2 string array
"Hello" "World"
但是,如果串联两个字符向量,则结果是一个更长的字符向量。
str = ['Hello' 'World']
chr = 'HelloWorld'
要为字符串(或字符串数组的元素)追加文本,请使用 plus
运算符而不是方括号。
str = "Hello" + "World"
str = "HelloWorld"
另外,也可以使用 strcat
函数。无论输入参数是字符串还是字符向量,都可以使用 strcat
追加文本。
str = strcat("Hello","World")
str = "HelloWorld"
不管使用方括号、plus
还是 strcat
,都可以指定任意数量的参数。在 Hello
和 World
之间追加一个空白字符。
str = "Hello" + " " + "World"
str = "Hello World"