Matlab DWT子带数据的提取
我试图从DWT子带中提取数据。我能够正确地嵌入数据(我在调试器中遵循了它)、cal PSNR等。PSNR率似乎非常高76.2??然而,我有很多困难提取数据回来!它有时会提取数字128??有人能帮忙或知道这是为什么吗?我会非常感激的。我已经为此工作了一整天&运气不好!我很想知道 数据嵌入:Matlab DWT子带数据的提取,matlab,steganography,dwt,Matlab,Steganography,Dwt,我试图从DWT子带中提取数据。我能够正确地嵌入数据(我在调试器中遵循了它)、cal PSNR等。PSNR率似乎非常高76.2??然而,我有很多困难提取数据回来!它有时会提取数字128??有人能帮忙或知道这是为什么吗?我会非常感激的。我已经为此工作了一整天&运气不好!我很想知道 数据嵌入: coverImage = imread('lena.bmp'); message = importdata('minutiaTest.txt'); %message = 'Bifurcations:'; [
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');
coverImage=imread('lena.bmp');
message=importdata('minitiatest.txt');
%消息='分支:';
[LL,LH,HL,HH]=dwt2(封面图像,'haar');
如果大小(信息)>大小(封面图片,1)*大小(封面图片,2)
错误(“消息太大,无法嵌入”);
终止
比特计数=0;
steg_系数=[4,4.75,5.5,6.25,7];
对于jj=1:大小(消息,2)+1
如果jj>大小(消息,2)
字符位=[0,0,0,0,0,0,0];
其他的
charbits=dec2bin(消息(jj),8');
字符位=字符位(:)'-'0';
终止
对于ii=1:8
比特计数=比特计数+1;
如果字符位(ii)=1
如果HH(位计数)=0
HH(位计数)=-1*阶跃系数(randi(numel(阶跃系数));
终止
终止
终止
终止
stego_image=idwt2(LL,LH,HL,HH,'haar');
imwrite(uint8(stego_图像),'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
new_Stego=imread('newStego.bmp');
[LL,LH,HL,HH]=dwt2(new_Stego,'haar');
信息=“”;
msgbits='';
对于ii=1:尺寸(HH,1)*尺寸(HH,2)
如果HH(ii)>0
msgbits=strcat(msgbits,'1');
elseif HH(ii)<0
msgbits=strcat(msgbits,'0');
其他的
回来
终止
如果mod(ii,8)=0
msgChar=bin2dec(msgbits);
如果msgChar==0
打破
终止
msgChar=char(msgChar);
message=[message msgChar];
msgbits='';
终止
终止
使用importdata
读取数据时会出现问题
此命令将数据加载到数组中。由于您有39行和2列(跳过任何空行),因此其大小将为39 2
。但是,程序假定您的消息是字符串。例如,“我是一个字符串”
的大小为113
。与您实际提供的数据相比,对程序的这种期望会产生各种各样的问题
您想要的是将数据作为单个字符串读取,其中数字230不是一个元素,而是3个单独的字符。选项卡和换行符也将被读入
要读取您的文件,请执行以下操作:
message = fileread('minutiaTest.txt');
提取邮件后,要将其保存到文件中,请执行以下操作:
fid = fopen('myFilename.txt','w');
fprintf(fid,message);
fclose(fid);
我已经编辑了上面的代码。对不起,我应该包括我所有的代码。还是不走运!似乎还是在提取时得到了128。有什么想法吗?当在脱胶机中运行时,它肯定是在检索数据,但我只得到了128!您好,minitiatest.txt包含指纹细节的x和y坐标。i、 e 247 25。如果你愿意,我可以寄给你。还是我可以把它挂在这里?我每次都得到128分。你是在告诉我代码对你有用吗?你得到准确的数据了吗?尝试将其上载到pastebin上,但出现以下错误:“对不起,但是你发送的文件中包含超过10%的二进制字符。我们猜测这意味着它是一个二进制文件,而不是文本文件。它将被忽略。”我使用了filebin,这是链接:Ok,非常感谢。我将尝试这个并提供更新。最后一个问题,所以我替换了行message=importdata('minitiatest.txt');带有message=fileread('minitiatest.txt');然后在数据提取过程之后,我包括了另外两行。我猜这两行代码将创建一个名为myFilename.txt的txt文件,并将提取的数据保存到其中,然后将提取的数据(我称之为消息)打印到屏幕??是的,您可以将命令
importdata
替换为fileread
,以更改读取数据的方式。另外两行将提取的数据保存到文件中fid
创建对所创建文件的引用,并将数据写入该文件。仅当要将数据保存到文本文件时才执行此操作。如果您只想将其打印到屏幕上,在控制台/脚本中键入message
(注意没有分号)就可以了。您好,我已经尝试了您的建议,现在我只在提取后获得以下数据,它似乎没有检索到嵌入的所有数据。有什么想法吗?对我来说很好。除了将importdata
更改为fileread
以及使用您上面提供的minitiatest.txt
之外,我完全按照提供的方式使用您的代码。如何运行代码?你有两个独立的脚本吗?两个功能?全部在一个文件中?我在一个脚本中有所有代码。我也插清楚了;在我剧本的顶端。我有一些其他的代码来计算PSNR,MSE等,但我已经把它注释掉了,它不应该影响它吗?