从DWT子带中提取数据

时间:2015-01-06 01:42:18

标签: matlab steganography dwt

我正在尝试从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

1 个答案:

答案 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);