免責事項:これは宿題の一部でしたが、既に渡されています。私は単に将来のノウハウのための正しい解決策を探しています。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)
埋め込み関数はどこですか?どのようにイメージを埋め込むのかわかりません。 – furas
これは間違っています: '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
これは(画像のテキストを隠すためのC++ステガノグラフィー)助けになるかもしれません:https://github.com/devkicks/HiddingDataInImages/blob/master/HiddenImageData/main.cpp#L82 – masad