Matlab DWT子带数据的提取

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:'; [

我试图从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');
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等,但我已经把它注释掉了,它不应该影响它吗?