You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用3 LSB实现图像不可见水印且不调用MATLAB现有相关函数

3 LSB图像水印嵌入失败问题排查与修复

核心错误原因

你代码中bitset函数的调用逻辑错误:MATLAB的bitset不会直接修改输入的变量值,而是返回修改指定位后的新数值。原代码里没有将bitset的返回值赋值给C(i,j),修改结果直接被丢弃,因此C全程和原始输入图像完全一致,做差后结果自然全为0。

可优化的冗余逻辑

循环内的if-else判断完全多余,可以直接将水印对应位的取值作为bitset的第三个输入参数,简化代码。

修正后的完整代码

function [C] = Q2(image,watermark)
% clc;
% image=imread('moon.tif');
% watermark=imread('cameraman.tif');

[X,Y] = size(image);
rewatermark = imresize(watermark,[X,Y]); % 调整水印尺寸匹配载体图像

C = image;
for i = 1:X
    for j = 1:Y
        for k = 1:3
            % 直接将水印的第k位写入载体图像的第k位,同时接收bitset返回的修改后值
            C(i,j) = bitset(C(i,j),k, bitget(rewatermark(i,j),k));
        end
    end
end

subplot(1,3,1)
imshow(image);
title('原始载体图像');
subplot(1,3,2);
imshow(rewatermark) 
title('待嵌入水印');
subplot(1,3,3)
imshow(C)
title('嵌入水印后图像'); 
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
set(gcf,'name','Q2 - 结果展示','numbertitle','off')
end

额外注意事项

  • 确保输入的灰度图像为uint8类型(imread默认读取的灰度图就是该类型),如果是归一化的double类型需要先转回uint8再做位操作,否则会出现异常。
  • 提取水印时只要取水印图像每个像素的低3位,即可还原嵌入的水印内容。

内容的提问来源于stack exchange,提问作者Kobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 04:54:03