0

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
4

1 に答える 1

0

この問題は、でデータを読み取ることから発生しますimportdata

このコマンドは、データを配列にロードします。39 行と 2 列 (空の行をスキップ) があるため、サイズは になります39 2。ただし、プログラムはメッセージが文字列であると想定しています。たとえば、'i am a string'のサイズは1 13です。実際に与えるデータと比較したプログラムのこの期待は、あらゆる種類の問題を引き起こします。

必要なのは、データを 1 つの文字列として読み取ることです。230 という数字は 1 つの要素ではなく、3 つの個別の文字です。タブと改行も同様に読み込まれます。

ファイルを読み取るには:

message = fileread('minutiaTest.txt');

メッセージを抽出した後、ファイルに保存するには:

fid = fopen('myFilename.txt','w');
fprintf(fid,message);
fclose(fid);
于 2015-01-06T13:06:18.413 に答える