对图像应用压缩后无法提取嵌入的隐写消息?
Cant extract embedded stego message after compression is applied to image?
我正在尝试提取已使用 DWT steganograpy.Then 隐藏的隐藏数据,当我应用压缩时,没有任何反应!
我已使用以下代码压缩我的 .bmp 图像,但在应用压缩后没有提取隐藏消息。我在调试器中尝试了 运行 ,它似乎只是在循环一次之后跳到代码的末尾。对问题的任何想法。在应用压缩之前数据提取正常。
%%%%%%%%%%%%%%%%%%DECODING%%%%%%%%%%%%%%%%%%%%%%%
%clear;
filename='newStego.bmp';
stego_image=imread(filename);
compression=90;
file_compressed=sprintf('compression_%d_percent.jpg',compression);
imwrite(imread(filename),file_compressed,'Quality',compression);
new_Stego = double(imread (file_compressed));
[LL,LH,HL,HH] = dwt2(new_Stego,'haar');
message = '';
msgbits = '';
for ii = 1:size(HH,1)*size(HH,2)
if HH(ii) > 0
msgbits = strcat (msgbits, '1');
elseif HH(ii) < 0
msgbits = strcat (msgbits, '0');
else
return;
end
if mod(ii,8) == 0
msgChar = bin2dec(msgbits);
if msgChar == 0
break;
end
msgChar = char (msgChar);
message = [message msgChar];
msgbits = '';
disp(message);
end
end
您的压缩方案是有损的,这意味着您在压缩数据时不可逆转地丢失了一些信息。
具体而言,jpeg 压缩将像素数据转换为频域并将许多高频分量置零。 DWT 详细系数(LH、HL 和 HH)与频率系数有一些相似之处,因此会受到这种压缩的强烈影响(HH 系数更是如此)。请记住,即使是 100% 质量的 jpeg 压缩也是有损的,但失真自然会最小化。
如果您仍想压缩数据,则必须以不破坏嵌入信息的方式进行压缩。您有两个选择:
- 使用无损压缩方案,例如png 或 zip。
- 使用对 jpeg 压缩具有鲁棒性的不同隐写算法。
Extra:你的解码过程之所以只循环一次,是因为前几个HH系数之一为0,导致过早终止。要么,要么前 8 个系数为负,这导致提取的字符为 0,这是您的消息结束条件。
我正在尝试提取已使用 DWT steganograpy.Then 隐藏的隐藏数据,当我应用压缩时,没有任何反应! 我已使用以下代码压缩我的 .bmp 图像,但在应用压缩后没有提取隐藏消息。我在调试器中尝试了 运行 ,它似乎只是在循环一次之后跳到代码的末尾。对问题的任何想法。在应用压缩之前数据提取正常。
%%%%%%%%%%%%%%%%%%DECODING%%%%%%%%%%%%%%%%%%%%%%%
%clear;
filename='newStego.bmp';
stego_image=imread(filename);
compression=90;
file_compressed=sprintf('compression_%d_percent.jpg',compression);
imwrite(imread(filename),file_compressed,'Quality',compression);
new_Stego = double(imread (file_compressed));
[LL,LH,HL,HH] = dwt2(new_Stego,'haar');
message = '';
msgbits = '';
for ii = 1:size(HH,1)*size(HH,2)
if HH(ii) > 0
msgbits = strcat (msgbits, '1');
elseif HH(ii) < 0
msgbits = strcat (msgbits, '0');
else
return;
end
if mod(ii,8) == 0
msgChar = bin2dec(msgbits);
if msgChar == 0
break;
end
msgChar = char (msgChar);
message = [message msgChar];
msgbits = '';
disp(message);
end
end
您的压缩方案是有损的,这意味着您在压缩数据时不可逆转地丢失了一些信息。
具体而言,jpeg 压缩将像素数据转换为频域并将许多高频分量置零。 DWT 详细系数(LH、HL 和 HH)与频率系数有一些相似之处,因此会受到这种压缩的强烈影响(HH 系数更是如此)。请记住,即使是 100% 质量的 jpeg 压缩也是有损的,但失真自然会最小化。
如果您仍想压缩数据,则必须以不破坏嵌入信息的方式进行压缩。您有两个选择:
- 使用无损压缩方案,例如png 或 zip。
- 使用对 jpeg 压缩具有鲁棒性的不同隐写算法。
Extra:你的解码过程之所以只循环一次,是因为前几个HH系数之一为0,导致过早终止。要么,要么前 8 个系数为负,这导致提取的字符为 0,这是您的消息结束条件。