实验1. 图像的位平面分解实验。 将灰度图像Lena分解成8个位平面并验证教材P91页的结论,即将数字水印信息嵌入Lena图像的第1至3个位平面中,可以达到不易察觉的目的。 要求:给出教材P91图4.5中的各幅子图。 提示:获取指定位的值:bitget(A,i)。 用MATLAB实现
时间: 2024-03-25 17:40:10 浏览: 45
好的,以下是MATLAB实现代码:
```matlab
% 读取Lena图像
lena = imread('lena.bmp');
% 将灰度图像转换为double类型
lena = im2double(lena);
% 对Lena图像进行位平面分解
bit_plane = cell(1, 8);
for i = 1 : 8
bit_plane{i} = bitget(lena, i);
end
% 将数字水印信息嵌入前三个位平面
watermark = [1 0 1 0 1 0 1 0 1 0]; % 数字水印信息,长度为10
for i = 1 : 3
bit_plane{i}(1 : length(watermark)) = bitset(bit_plane{i}(1 : length(watermark)), 1, watermark);
end
% 将8个位平面合成为一幅图像
lena_watermarked = zeros(size(lena));
for i = 1 : 8
lena_watermarked = lena_watermarked + bit_plane{i} .* 2^(i-1);
end
% 显示结果
figure;
subplot(3, 3, 1); imshow(lena); title('原图');
for i = 1 : 3
subplot(3, 3, i+1); imshow(bit_plane{i}); title(['第', num2str(i), '个位平面']);
end
for i = 4 : 6
subplot(3, 3, i+1); imshow(bit_plane{i}); title(['第', num2str(i), '个位平面']);
xlabel('数字水印嵌入');
end
for i = 7 : 8
subplot(3, 3, i+1); imshow(bit_plane{i}); title(['第', num2str(i), '个位平面']);
end
figure; imshow(lena_watermarked); title('嵌入数字水印后的图像');
```
代码中首先读取Lena图像并将其转换为double类型,然后对其进行位平面分解,得到8个位平面图像。接着将数字水印信息嵌入前三个位平面中,这里使用的是简单的LSB算法,即将数字水印信息的每一位替换掉对应位平面上像素的最低位。最后将8个位平面合成为一幅图像,即得到了嵌入数字水印后的图像。
代码中还通过subplot函数将Lena图像、8个位平面图像和嵌入数字水印后的图像显示出来,可以直观地观察到嵌入数字水印后的效果。
阅读全文