将灰度图像 Lena 分解成 8 个位平面并验证教材 P91 页的结论,即将数字水印信息嵌入 Lena 图像的第 1 至 3 个位平面中,可以达到不易察觉的目的。matlab代码
时间: 2024-03-25 09:40:00 浏览: 62
好的,这里提供一份 MATLAB 代码,用于将灰度图像 Lena 分解成 8 个位平面,并将数字水印信息嵌入前 3 个位平面中:
```matlab
% 读入灰度图像 Lena
lena = imread('lena_gray.bmp');
% 分解 Lena 图像成 8 个位平面
bitplanes = zeros(size(lena,1), size(lena,2), 8);
for i = 1:8
bitplanes(:,:,i) = bitget(lena,i);
end
% 生成数字水印信息,这里假设数字水印信息为一个长度为 100 的 01 串
watermark = randi([0,1],1,100);
% 将数字水印信息嵌入 Lena 图像的前 3 个位平面中
for i = 1:3
bitplanes(:,:,i) = bitset(bitplanes(:,:,i),1,watermark((i-1)*33+1:i*33));
end
% 合成嵌入数字水印信息的位平面为一幅图像
watermarked = uint8(bitplanes(:,:,1)*2^0 + bitplanes(:,:,2)*2^1 + bitplanes(:,:,3)*2^2 + ...
bitplanes(:,:,4)*2^3 + bitplanes(:,:,5)*2^4 + bitplanes(:,:,6)*2^5 + ...
bitplanes(:,:,7)*2^6 + bitplanes(:,:,8)*2^7);
% 显示原始 Lena 图像和嵌入数字水印信息后的图像
figure;
subplot(1,2,1), imshow(lena), title('Original Lena');
subplot(1,2,2), imshow(watermarked), title('Watermarked Lena');
```
需要注意的是,这段代码中的数字水印信息是随机生成的,如果需要嵌入特定的数字水印信息,可以将 `watermark` 替换为相应的二进制序列。另外,如果需要将数字水印信息嵌入到其他位平面中,可以将 `for` 循环中的索引范围修改为相应的位平面。
阅读全文