从 DWT 子带中提取数据



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

相关内容

  • 没有找到相关文章

最新更新