2017-11-14 11 views
-3

もう一度イメージが必要ですが、返すグレースケール 私の先生は最初にカラーマップを行い、それがmatlabで起こったと言っていました。私は 助けてください私のコードを見ているされてあまりにも ここではPythonで同様の作業を行いたいPythonのmatlabカラーマップ

暗号化:

import numpy as np 
from PIL import Image 
x = Image.open('1.jpg', 'r') 
x = x.convert('L') 

y = np.asarray(x.getdata(), dtype=np.int).reshape((x.size[1], x.size[0]))#changed image to matrix getdata for matrix value                # dtype is int type reshape used to break 1d array into 2d array 
y = np.asarray(y, dtype=np.uint8)#if values still in range 0-255! 
#print(y) 
z = y 
w = Image.fromarray(y, mode='L') 
w.save('grey_scale.bmp') 
for i in range(len(z)): 
    for j in range(len(z[i])): 
     a = z[i][j] 
     p = int(bin(a)[2:]) 
     p = '%08d' % p 
     p = p[::-1] 
     z[i][j] = int(p, 2) 
#print(z) 

C = Image.fromarray(z) 
C.save('decryption.bmp') 
print("DONE") 

DECRYPTION:

import numpy as np 
from PIL import Image 
x = Image.open('decryption.bmp', 'r') 

y = np.asarray(x.getdata(), dtype=np.int).reshape((x.size[1], x.size[0]))#changed image to matrix getdata for matrix value 
#print(y)                # dtype is int type reshape used to break 1d array into 2d array 
y = np.asarray(y, dtype=np.uint8)#if values still in range 0-255! 
#print(y) 
z = y 
for i in range(len(z)): 
    for j in range(len(z[i])): 
     a = z[i][j] 
     p = int(bin(a)[2:]) 
     p = '%08d' % p 
     p = p[::-1] 
     z[i][j] = int(p, 2) 
#print(z) 

C = Image.fromarray(z) 
C.save('Final.bmp') 
print("DONE") 
+0

ここであなたの探しているものがわかりません。あなたの行x = x.convert( 'L')は画像をグレースケールに変換します。色情報が失われ、処理量が戻ってくることはありません。トーンマッピングについて質問している場合を除きますか? –

+0

上記の指定されたコードを変更して、RGBイメージを入力してからrgbイメージとして出力しますが、グレースケールで処理します – prashant

答えて

0

私が考える何を(?)探しているのはColour Mappingのような機能です:

def create_colourmap(colour, grey): 
    c_map = numpy.zeros((256,4), dtype=numpy.float64) 
    for i in range(colour.shape[0]): 
     for j in range(colour.shape[1]): 
      tone = grey[i,j] 
      c_map[tone,3] +=1 
      count = c_map[tone, 3] 
      c_map[tone,:3] = (c_map[tone,:3] * (count-1) + colour[i,j])/count 
    return c_map.astype(numpy.uint8)[:,:3] 

各グレースケール値(またはトーン)に対して1つのカラー値を与えます。

あなたの 'ビット反転' 手順が別の関数によって単純化することができます

def reverse_bits(arr): 
    for i in range(arr.shape[0]): 
     for j in range(arr.shape[1]): 
      arr[i][j] = int('{0:08b}'.format(arr[i][j])[::-1], 2) 
    return arr 

はすべて一緒にこれを置く、あなたの暗号化機能は、次のようになります。

def encrypt(infile, outfile): 

    with Image.open(infile, 'r') as colour_img: 
     colour_arr = numpy.array(colour_img) 
     grey_img = colour_img.convert('L') 

    grey_arr = numpy.array(grey_img) 
    c_map = create_colourmap(colour_arr, grey_arr) 

    with Image.fromarray(c_map) as cmap_img: 
     cmap_img.save(outfile[:-4]+'_cmap.bmp') 

    grey_arr = reverse_bits(grey_arr) 

    with Image.fromarray(grey_arr) as c: 
     c.save(outfile) 
    print("Encryption DONE") 

そして、あなたの復号化機能:

def decrypt(infile, outfile): 
    with Image.open(infile, 'r') as x: 
     y = numpy.array(x) 
    y = reverse_bits(y) 

    colour_arr = numpy.zeros((y.shape[0], y.shape[1], 3), dtype=numpy.uint8) 

    with Image.open(infile[:-4]+'_cmap.bmp') as cmap_img: 
     cmap = numpy.array(cmap_img) 

    for i in range(256): 
     colour_arr[y==i] = cmap[i] 

    with Image.fromarray(colour_arr) as c: 
     c.save(outfile) 
    print("Decryption DONE") 

カラーマッピングは完全には復元されません画像の色は変わりますが、画像に色相を与えます。私はあなたの割り当てについてはわかりませんが、暗号化されたイメージとともにカラーマップを送ったり、類似した色付けをした別のイメージを与えたりすることができます。

私はこれがあなたを助けてくれることを望んでいますが、これがどのように動作するのかを考え、何が起こっているのかを説明する必要がある場合はコメントする必要があります。

幸運を祈る!

関連する問題