>我正在尝试从DWT子带中提取数据。我能够正确嵌入数据(我已经在调试器中遵循了它),校准 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
使用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);