利用LSB算法隐藏图片信息的MATLAB实现

前一篇博客中介绍了利用LSB算法隐藏文字信息的MATLAB实现:
http://blog.csdn.net/csdn_moming/article/details/50936687
在此基础上,下面介绍利用LSB算法隐藏图片信息的MATLAB实现。


补充说明

  1. 图片数据量较大,一个 1920×1080 1920 × 1080 的图片就有 2073600 个RGB值需要储存
  2. 依旧利用之前改进的算法,对 8-bitRGB 值增加一位以便于储存和作为结束标记(实验表明,对多个字符串进行 strcat 会影响速度,这是一个缺陷,也许有更高效的实现方法)
  3. 提取出来的图片矩阵为double型,一定要转化为 uint8 型保存才能正常显示出来
  4. 为了把图片的分辨率隐藏进去以便于恢复,先计算出该图片分辨率值转为二进制后的长度,把长度信息隐藏在图片的最后一个像素点内(只要图片分辨率最大值不超过 2999
  • 15
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
LSB算法可以用来实现数字水印的隐藏。下面是一个简单的LSB算法隐藏水印的MATLAB实现: ```matlab % 读取载体图像和水印图像 carrier_image = imread('carrier_image.png'); watermark_image = imread('watermark_image.png'); % 获取载体图像的宽度和高度 [height, width, ~] = size(carrier_image); % 将水印图像转换为灰度图像,并将其缩放到与载体图像相同的大小 watermark_image = imresize(watermark_image, [height, width]); watermark_image = rgb2gray(watermark_image); % 将水印图像的每个像素转换为一个二进制位,组成一个长向量 watermark_bits = reshape(de2bi(watermark_image), [], 1); % 在载体图像的最后一个像素的最低有效位写入0作为结束标志 carrier_image(end, end, :) = 0; % 将水印向量的每个位写入载体图像的最低有效位 for i = 1:length(watermark_bits) % 计算当前像素的行和列索引 row_index = ceil(i / (width * 3)); col_index = mod(i - 1, width * 3) + 1; % 获取当前像素的RGB值并将其转换为二进制形式 pixel_value_binary = dec2bin(carrier_image(row_index, col_index), 8); % 将水印向量的当前位写入当前像素的最低有效位 pixel_value_binary(end) = num2str(watermark_bits(i)); % 将修改后的二进制像素值转换为十进制形式并写回载体图像 carrier_image(row_index, col_index) = bin2dec(pixel_value_binary); end % 将修改后的载体图像保存到新文件 imwrite(carrier_image, 'watermarked_image.png'); ``` 以上实现的步骤如下: 1. 读取载体图像和水印图像。 2. 将水印图像转换为灰度图像,并将其缩放到与载体图像相同的大小。 3. 将水印图像的每个像素转换为一个二进制位,组成一个长向量。 4. 在载体图像的最后一个像素的最低有效位写入0作为结束标志。 5. 将水印向量的每个位写入载体图像的最低有效位。 6. 将修改后的载体图像保存到新文件。 需要注意的是,这个实现只能在无损的图像格式(如PNG)隐藏水印,因为在图像压缩过程会导致信息的丢失。此外,该实现虽然简单,但对水印图像的嵌入效果并不理想,还有可能受到图像处理操作的影响而失效。更加高效和鲁棒的数字水印嵌入算法还需要进一步的研究。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值