0

以下のコードは、画像のハール変換を行い、係数の最下位ビットにビットごとに秘密のメッセージを埋め込みます。bitset 関数を使用するには、double 係数を uint64 に変換し、埋め込み後に元に戻します。

function DwtSteg(address,message)

      coverImage=imread(address);
      ascii=uint8(message);

      [LL LH HL HH]=dwt2(coverImage,'haar');

      LH=round(LH);
      HL=round(HL);

      subplot(1,2,1)
      imshow(LH)

      [r c]=size(LL);

      wc=1;
      bc=1;
      done=false;
      for i=1:r        
          if(done)
              break
          end
          for j=1:c                      

              if(bc==8)
                 bc=1;
                 wc=wc+1;

              end

              if(wc==length(message))
                  done=true;
                  break;
              end

              xb = typecast(LH(i,j), 'uint64' );
              xb=bitset(xb,1,bitget(ascii(wc),bc));
              xb%***
              LH(i,j)=typecast(xb, 'double');  
              bc=bc+1;                    
          end    

      end

      subplot(1,2,2)
      imshow(LH)

      stegoImage=idwt2(LL ,HL,LH, HH,'haar');

      figure(2)
      imshow(uint8(stegoImage));

      imwrite(uint8(stegoImage),'stegoImage.tiff');

end

しかし、以下のコードを実行して Image.The 係数からメッセージを抽出すると、変換されたものと同じではありません (両方の関数で '***' を考慮してください) :

function [ str ] = DwtDesteg( address)
    str='';
    image=imread(address);
    [LL LH HL HH]=dwt2(image,'haar');

      [r c]=size(LL);
      LH=round(LH);
      bc=1;
      ch=0;
      for i=1:r                
          for j=1:c                                                          
              if(bc==8)
                 bc=1;
                 str=strcat(str,ch);
                 char(ch)

              end
              xb = typecast(LH(i,j), 'uint64');
              xb%***
              ch=bitset(ch,bc,bitget(xb,1));
              bitget(xb,1)                        

              bc=bc+1;

          end    

      end

end
4

1 に答える 1

2

DWT 係数を整数として操作しているため、整数変換 IWT を使用することもできます。だから、代わりに

[LL LH HL HH]=dwt2(coverImage,'haar');

でリフティング スキームを使用しlwt2()ます。

% set up a Haar integer lifting scheme
els = {'p',[-0.125 0.125],0};
lshaarInt = liftwave('haar','int2int');
lsnewInt = addlift(lshaarInt,els);
% transform away!
[LL,LH,HL,HH] = lwt2(double(image),lsnewInt);

この時点で、丸めを行う必要はありませんLH = round(LH)。すぐに埋め込みに進んでください。

imread()イメージを uint8 タイプとしてロードします。それを に渡すとdwt2()、すべてが double に変換されます。ただし、 uint8 行列を に渡そうとすると、エラーが発生lwt2()するため、手動で double に変換する必要があります。逆変換の場合は、単純に

image = ilwt2(LH,LH,HL,HH,lsnewInt);
image = uint8(image);

LHここで、係数を型キャストしてビット設定をuint64台無しにするなど、コードに他のバグがいくつかあります。全部追いかけるのはちょっと面倒なので、関数を書き直しました。

埋め込み.m

function embed(filein,fileout,message)
image = imread(filein);
message = double(message);

els = {'p',[-0.125 0.125],0};
lshaarInt = liftwave('haar','int2int');
lsnewInt = addlift(lshaarInt,els);
[LL,LH,HL,HH] = lwt2(double(image),lsnewInt);

col = size(LH,2);
r = 1;
c = 1;

for i = 1:length(message);
    letter = message(i);
    for b = 8:-1:1;
        LH(r,c) = bitset(LH(r,c),1,bitget(letter,b));
        c = c + 1;
        if (c > col)
            r = r + 1;
            c = 0;
        end
    end
end

stego = uint8(ilwt2(LL,LH,HL,HH,lsnewInt));

imshow(stego);
imwrite(stego,fileout);
end

抽出.m

function extract(filename,messageLength)
image = imread(filename);

els = {'p',[-0.125 0.125],0};
lshaarInt = liftwave('haar','int2int');
lsnewInt = addlift(lshaarInt,els);
[LL,LH,HL,HH] = lwt2(double(image),lsnewInt);

col = size(LH,2);
r = 1;
c = 1;

secret = zeros(messageLength,1);
for i = 1:messageLength;
    letter = 0;
    for b = 8:-1:1;
        letter = bitset(letter,b,bitget(LH(r,c),1));
        c = c + 1;
        if (c > col)
            r = r + 1;
            c = 0;
        end
    end
    secret(i) = char(letter);
end

disp(char(secret'));
end

抽出関数には、パラメーターとしてメッセージの長さが必要であることがわかります。これは、埋め込みメソッドが、ビットの抽出をいつ停止するかをまったくエンコードしないためです。受信者がそのパラメーターの知識に依存するべきではないため、受信者をそのパラメーターの知識に依存させたくない場合は、いくつかのオプションがあります。ただし、この質問の範囲外であるため、その実装はお任せします。

  1. 埋め込み中に、メッセージ長に変換するビットをピクセルに入れます。たとえば、最初の 16 ビット/ウェーブレット係数です。したがって、抽出が開始されると、最初の 16 ビットが読み取られ、整数に変換されてから、メッセージの抽出が続行されます。
  2. メッセージに加えて、いくつかの余分なビット (たとえば 8 つのゼロ) を埋め込んで、秘密を抽出しているときにそれらに遭遇したら停止するようにします。
于 2016-03-24T19:29:52.303 に答える