将灰度图像Lena分解成8个位平面,将数字水印信息嵌入Lena图像的第1至3个位平面中
时间: 2024-03-25 11:40:36 浏览: 68
好的,以下是一个简单的MATLAB代码示例,展示如何将数字水印信息嵌入Lena图像的第1至3个位平面中:
```matlab
% 读取Lena图像
lena = imread('lena.png');
lena_gray = rgb2gray(lena);
% 将图像数据存储在三维数组中
lena_3d = repmat(lena_gray, [1, 1, 8]); % 8位图像
% 删除单维度
lena_3d = squeeze(lena_3d);
% 将数字水印信息转换成二进制位串
watermark = 'Hello, world!'; % 水印信息
watermark_bin = dec2bin(watermark, 8); % 每个字符转换为8位二进制串
% 将二进制位串嵌入Lena图像的第1至3个位平面中
for i = 1:size(watermark_bin, 1)
for j = 1:3 % 第1至3个位平面
bit_idx = 8 - j + 1; % 位平面索引
watermark_bit = str2double(watermark_bin(i, bit_idx)); % 水印信息的当前位
if watermark_bit == 1 % 如果当前位为1,将像素值的最低位设为1
lena_3d(:,:,j) = bitset(lena_3d(:,:,j), i, 1);
else % 如果当前位为0,将像素值的最低位设为0
lena_3d(:,:,j) = bitset(lena_3d(:,:,j), i, 0);
end
end
end
% 将修改后的图像显示出来
figure;
for i = 1:3
subplot(1,3,i);
imshow(bitget(lena_3d, i));
title(sprintf('Bit Plane %d', i));
end
% 将修改后的图像保存到文件中
lena_watermarked = uint8(lena_3d);
imwrite(lena_watermarked, 'lena_watermarked.png');
```
请注意,这只是一个简单的示例,您可能需要根据自己的需求进行修改和优化。另外,嵌入水印信息可能会影响图像质量,因此需要谨慎处理。
阅读全文