2016-11-21 8 views
2

私はグレースケール、24 * 24ピクセルの画像ファイル(私はタイプを決めていないので、提案は大歓迎です)を取り、それを0(白)のピクセル値のリストに変換するPythonプログラムを作成しようとしています。 〜255(黒)。グレースケールイメージをピクセル値のリストに変換するにはどうすればよいですか?

このアレイを使用して、Tensor-Flow手書き認識アルゴリズムで認識できる画像のMNISTのようなバイトファイルを作成する予定です。

Iは、各画素を反復とPILインポートイメージ

img = Image.open('eggs.png').convert('1') 
rawData = img.load() 
data = [] 
for y in range(24): 
    for x in range(24): 
     data.append(rawData[x,y]) 

からアレイ に値を追加することによって、Pillow libraryこのタスクにおいて最も有用であることが判明しているけれども、この解決策は、(1 2つの問題があります)ピクセル値は整数として格納されるのではなく、それ以上数学的に操作することができないため、役に立たないピクセルオブジェクトです。 (2)枕の状態でも:

個々のピクセルへのアクセスはかなり遅いです。イメージ内のすべてのピクセルをループしている場合は、> Pillow APIの他の部分を使う方が速いでしょう。

+0

マシン上でコードを実行すると、 'data'は通常の整数のリストです。 – Kevin

+1

ドキュメントは[getdata](https://pillow.readthedocs.io/ja/3.4.x/reference/Image.html#PIL.Image.Image)を参照している可能性があります。getdata)は、ピクセル単位のアクセスより高速です。 – Kevin

+0

私は個々のピクセルアクセスでは遅くないPythonライブラリを認識していません。 – Douglas

答えて

3

あなたは、Pythonのリスト内に画像データを変換する(またはリストの一覧表示)することができます

from PIL import Image 

img = Image.open('eggs.png').convert('L') # convert image to 8-bit grayscale 
WIDTH, HEIGHT = img.size 

data = list(img.getdata()) # convert image data to a list of integers 
# convert that to 2D list (list of lists of integers) 
data = [data[offset:offset+WIDTH] for offset in range(0, WIDTH*HEIGHT, WIDTH)] 

# At this point the image's pixels are all in memory and can be accessed 
# individually using data[row][col]. 

# For example: 
for row in data: 
    print(' '.join('{:3}'.format(value) for value in row)) 

# Here's another more compact representation. 
chars = '@%#*+=-:. ' # Change as desired. 
scale = (len(chars)-1)/255. 
print() 
for row in data: 
    print(' '.join(chars[int(value*scale)] for value in row)) 

は、ここで私はテストのために使用される小型の24×24のRGB eggs.png画像の拡大版です。

ここで

enlarged version of eggs.png

は、アクセスの最初の例からの出力です:

screenshot output from test image

そしてここで第二の例の出力:データは今0..255の範囲の整数となるオブジェクトimg.load()戻る(および値を使用してより速くなければならない

@ @ % * @ @ @ @ % - . * @ @ @ @ @ @ @ @ @ @ @ @ 
@ @ . . + @ # .  = @ @ @ @ @ @ @ @ @ @ @ @ 
@ *    . . * @ @ @ @ @ @ @ @ @ @ @ @ 
@ #  . . . .  + % % @ @ @ @ # = @ @ @ @ 
@ %  . : - - - :  % @ % :  # @ @ @ 
@ #  . = = - - - = - . . = =   % @ @ @ 
@ =  - = : - - : - = . .  . : . % @ @ @ 
%  . = - - - - : - = . . - = = = - @ @ @ 
= . - = - : : = + - : . - = - : - = : * % 
- . . - = + = - . . - = : - - - = .  - 
= . : : . - - .  : = - - - - - = . . % 
% : : .  . : - - . : = - - - : = :  # @ 
@ # : . . = = - - = . = + - - = - . . @ @ 
@ @ #  . - = : - : = - . - = = : . .  # @ 
@ @ %  : = - - - : = -  : - . . . - @ 
@ @ *  : = : - - - = . . - . .  . + @ 
@ #  . = - : - = :  : : . - % @ @ @ 
*  . . . : = = - : . . - .  - @ @ @ @ @ 
* . .  . : . . . - = . = @ @ @ @ @ @ 
@ :  - -  . . . .  # @ @ @ @ @ @ @ @ 
@ @ = # @ @ *  . .  . - @ @ @ @ @ @ @ @ @ 
@ @ @ @ @ @ @ . . . # @ @ @ @ @ @ @ @ @ @ @ 
@ @ @ @ @ @ @ -  . % @ @ @ @ @ @ @ @ @ @ @ @ 
@ @ @ @ @ @ @ # . : % @ @ @ @ @ @ @ @ @ @ @ @ @ 

アクセス画素に)。

1

r、g、またはbの値にアクセスすると、各ピクセルのグレースケール値にアクセスできます。これらの値はグレースケールイメージですべて同じになります。

I.e.

img = Image.open('eggs.png').convert('1') 
rawData = img.load() 
data = [] 
for y in range(24): 
    for x in range(24): 
     data.append(rawData[x,y][0]) 

これはアクセス速度の問題を解決しません。

私は枕よりもscikit-imageに精通しています。すべてのユーザーがグレースケール値をリストしている場合は、numpy配列としてイメージを格納するscikit-imageを使用し、img_as_ubyteを使用してイメージを0〜255の値を含むuint配列として表すことができます。

Images are NumPy Arraysは、コードの外観を確認するのに適しています。このような

関連する問題