我正在尝试从DWT子带中提取数据。我能够正确地嵌入数据(我在调试器中跟着它),cal PSNR等.PSNR率似乎非常高76.2 ??但是,我在提取数据时遇到了很多麻烦!它有时会提取数字128?任何人都可以帮助或知道为什么会这样吗?我会非常感激。我一整天都在努力工作。没有运气!我很想知道??
数据嵌入:
coverImage = imread('lena.bmp');
message = importdata('minutiaTest.txt');
%message = 'Bifurcations:';
[LL,LH,HL,HH] = dwt2(coverImage,'haar');
if size(message) > size(coverImage,1) * size(coverImage,2)
error ('message too big to embed');
end
bit_count = 0;
steg_coeffs = [4, 4.75, 5.5, 6.25, 7];
for jj=1:size(message,2)+1
if jj > size(message,2)
charbits = [0,0,0,0,0,0,0,0];
else
charbits = dec2bin(message(jj),8)';
charbits = charbits(:)'-'0';
end
for ii=1:8
bit_count = bit_count + 1;
if charbits(ii) == 1
if HH(bit_count) <= 0
HH(bit_count) = steg_coeffs(randi(numel(steg_coeffs)));
end
else
if HH(bit_count) >= 0
HH(bit_count) = -1 * steg_coeffs(randi(numel(steg_coeffs)));
end
end
end
end
stego_image = idwt2(LL,LH,HL,HH,'haar');
imwrite(uint8(stego_image),'newStego.bmp');
数据提取:
new_Stego = imread('newStego.bmp');
[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 = '';
end
end
答案 0 :(得分:0)
使用importdata
读取数据会产生问题。
此命令将数据加载到数组。由于您有39行和2列(跳过任何空行),因此其大小为39 2
。但是,该程序假定您的消息将是一个字符串。例如,'i am a string'
的大小为1 13
。与您实际提供的数据相比,该程序的期望会产生各种各样的问题。
您想要的是将您的数据作为单个字符串读取,其中数字230不是一个元素,而是3个单独的字符。标签和换行也将被读入。
阅读你的文件:
message = fileread('minutiaTest.txt');
提取邮件后,将其保存到文件中:
fid = fopen('myFilename.txt','w');
fprintf(fid,message);
fclose(fid);