图像的位平面分解实验。 将灰度图像Lena分解成8个位平面并验证教材P91页的结论,即将数字水印信息嵌入Lena图像的第1至3个位平面中,可以达到不易察觉的目的。 要求:给出教材P91图4.5中的各幅子图。 提示:获取指定位的值:bitget(A,i)。MATLAB实现
时间: 2024-03-25 07:40:16 浏览: 62
好的,以下是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
% 获取第i个位平面
bit_i = bit_plane{i};
% 将数字水印信息嵌入到位平面中
bit_i(1:length(watermark)) = bitset(bit_i(1:length(watermark)), 1, watermark);
% 替换第i个位平面
bit_plane{i} = bit_i;
end
% 合成嵌入数字水印后的图像
lena_watermark = bit_plane{1};
for i = 2 : 8
lena_watermark = lena_watermark + 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_watermark); title('嵌入数字水印后的图像');
```
首先读取Lena图像并将其转换为double类型,然后对其进行位平面分解,得到8个位平面图像。接着生成数字水印信息,并将其嵌入前三个位平面中,这里使用的仍然是LSB算法。最后将8个位平面合成为一幅图像,即得到了嵌入数字水印后的图像。
代码中还通过subplot函数将Lena图像、8个位平面图像和嵌入数字水印后的图像显示出来,可以直观地观察到嵌入数字水印后的效果。
阅读全文