2016-10-12 6 views
0

を放送し、私はLSB numpyのアレイを介したステガノグラフィ方法をコーディングしようとしています。私は、ウィッヒはxor_maskを構築するために、よりコンパクトな方法があります。1.リメイクforループnumpyのに

import numpy as np 
from scipy.misc import imread 
import matplotlib.pyplot as plt 

message = 'Hello, World!' 
message_bits = np.array(map(bool, map(int, (''.join(map('{:b}'.format, bytearray(message)))))), dtype=np.bool) 
img = imread('screenshot.png') 
xor_mask = np.zeros_like(img, dtype=np.bool) 
ind = 0 
for j, line in enumerate(xor_mask): 
    for i, column in enumerate(line): 
     if ind < len(message_bits): 
      xor_mask[j, i, 0] = message_bits[ind] 
      ind += 1    
     else: 
      break 
    else: 
     continue 
    break   
img[xor_mask] ^= 1 

とXORする必要があり、赤チャンネルのこれらのビットを、与えるブール・インデックス・マスクを作るコードを得ましたか。たぶん、numpyの放送を通じて

はUPD: 私のforループこれまで低減:

for j, line in enumerate(xor_mask): 
    if ind < len(message_bits): 
     xor_mask[j, :, 0] = message_bits[ind] 
     ind += len(xor_mask[j]) 
    else: 
     break 

答えて

1

xor_maskの画素が、それは簡単なにつれて、あなたはパッドmessage_bitsなど、多くの要素を持っている場合:

xor_mask = np.zeros_like(img, dtype=np.bool) 
xor_mask[:, :, 0] = np.reshape(message_bits, xor_mask.shape[:2]) 

埋め込みなしの別の方法:

xor_mask[:, :, 0].flat[:len(message_bits)] = message_bits 
+1

私はdこれはパッディングなしで「フラット」を使用しています。しかし、この場合、 'np.reshape'があなたに与えるように、行と列の大小順序を選択することはできません。 – szym