如何使用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
相关产品推荐
相关产品推荐

