2016-10-29 17 views
3

免責事項:これは宿題の一部でしたが、既に渡されています。私は単に将来のノウハウのための正しい解決策を探しています。OpenCV LSBメソッドを使用して画像を抽出する

このプログラムの目標は、Python OpenCVライブラリを使用してimage - > image steganography(他の画像に画像を埋め込む/抽出する)を実装することでした。これは、最下位ビット(LSB)法を使用して等しいサイズの2つの画像で行われる。

このプログラムでは、埋め込みに使用するビット数を選択できるので、埋め込まれた画像は人間の目にはほとんど検出されず、7では隠れた画像をはっきりと出力することができます。

秘密イメージから各RGBバイトの最上位ビット(MSB)を取り出し、カバーイメージのLSBの場所に設定することで、埋め込みを正しく実装しました。

私の問題は、埋め込まれた秘密のイメージを抽出することです。コードが実行された後、私が残したイメージはそれを青い表現にしか見えません。どこが間違っているのかは分かりませんが、私はビット操作技法やOpenCVライブラリの使用と関係があると感じています。どんな助けもありがとうございます。抽出するための

コード:

import cv2 
import numpy 
def extract(img1, bitsUsed): 
    print "Extracting..." 
    # Import image & get dimensions 
    img = cv2.imread(img1) 
    h = img.shape[0] 
    w = img.shape[1] 

    # Create new image to extract secret image 
    # Same dimensions, and rgb channel 
    secretImg = numpy.zeros((h,w,3), numpy.uint8) 

    x, y = 0, 0 
    # Loop thru each pixel 
    while x < w: 
      while y < h: 
        # Grab the LSB (based on bitsUsed from embedding) 
        lsb_B = img.item(y,x,0) & bitsUsed 
        lsb_G = img.item(y,x,1) & bitsUsed 
        lsb_R = img.item(y,x,2) & bitsUsed 
        # Place those bits into MSB positions on new img 
        secretImg.itemset((y,x,0), lsb_B << (8 - bitsUsed)) 
        secretImg.itemset((y,x,0), lsb_G << (8 - bitsUsed)) 
        secretImg.itemset((y,x,0), lsb_R << (8 - bitsUsed)) 
        y += 1 
      y = 0 
      x += 1 

    cv2.imwrite("extractedImg.png", secretImg) 
+1

埋め込み関数はどこですか?どのようにイメージを埋め込むのかわかりません。 – furas

+0

これは間違っています: 'bitsUsed'が[1,7]にあると仮定して、'&bitsUsed'はおそらく '&((1 << bitsUsed)-1)'でなければなりません。また、 'img.item(y、x、0)'には 'img.item(y、x、2)'があります。これは 'secretImg.itemset(y、x、0)'を 'secretImg ' itemset(y、x、2) 'を返します。 – njuffa

+0

これは(画像のテキストを隠すためのC++ステガノグラフィー)助けになるかもしれません:https://github.com/devkicks/HiddingDataInImages/blob/master/HiddenImageData/main.cpp#L82 – masad

答えて

2

njuffaは正しいです。抽出には、1ビットしか埋め込まれていない場合は0b00000001(1)、2ビットは0b00000011(3)、3ビットは0b00000111(7)などとなります。一般にk埋め込みビットの場合、マスク2**k - 1が必要です。

さらに、cv2.imread()はピクセルの数が少ない配列を生成します。各ピクセルをループする代わりに、計算をベクトル化することができます。全体として、これはあなたのコードがどのように見えるかを示しています。

import cv2 

def embed(cover_file, secret_file, k): 
    cover = cv2.imread(cover_file) 
    secret = cv2.imread(secret_file) 

    mask = 256 - 2**k 
    stego = (cover & mask) | (secret >> (8 - k)) 
    cv2.imwrite('stego.png', stego) 

def extract(stego_file, k): 
    stego = cv2.imread(stego_file) 

    mask = 2**k - 1 
    output = (stego & mask) << (8 - k) 
    cv2.imwrite('extracted.png', output) 
関連する問題