画像を入力として、それに対応するRGBマトリックスを取得するにはどうすればよいですか? numpy.asarray関数をチェックアウトしました。それは私にrgb行列または他の行列を与えますか?
この回答は2018年の時点で古いことに注意してください。 scipy
はimread
を非推奨にしたため、imageio.imread
に切り替える必要があります。 2つの違いについては this transition doc をご覧ください。古いライブラリの代わりに新しいライブラリをインポートするだけであれば、以下のコードは変更なしで機能するはずですが、テストしていません。
最も簡単な答えは、PILの周りにNumPyおよびSciPyラッパーを使用することです。 素晴らしいチュートリアル がありますが、基本的な考え方は次のとおりです。
from scipy import misc
arr = misc.imread('lena.png') # 640x480x3 array
arr[20, 30] # 3-vector for a pixel
arr[20, 30, 1] # green value for a pixel
640x480 RGBイメージの場合、これはuint8
の640x480x3配列を提供します。
または、PILでファイルを開く(または、Pillow。PILを使用している場合、これが機能しないか、非常に遅い可能性があります)だけでNumPyに直接渡すことができます。
import numpy as np
from PIL import Image
img = Image.open('lena.png')
arr = np.array(img) # 640x480x4 array
arr[20, 30] # 4-vector, just like above
これにより、タイプuint8
の640x480x4配列が得られます(4番目はアルファです。PILは、透明度がない場合でも、PNGファイルを常にRGBAとしてロードします。不明な場合はimg.getbands()
を参照してください)。
NumPyをまったく使用したくない場合、PIL独自のPixelArray
型はより制限された配列です。
arr = img.load()
arr[20, 30] # Tuple of 4 ints
これにより、RGBA 4タプルの640x480 PixelAccess
配列が得られます。
または、画像上でgetpixel
を呼び出すことができます:
img.getpixel(20, 30) # Tuple of 4 ints
私はあなたがここで望んでいたことを正確にやっていないと感じているので、これが完全にオフかどうかを指定してください。このような画像を開き、ピクセルの配列を取得できます。
import Image
im = Image.open('Lenna.png')
pixels = list(im.getdata())
これにより、RGBデータのフラットリストが取得されます。
[(226, 137, 125), (226, 137, 125), (223, 137, 133), (223, 136, 128),
(226, 138, 120), (226, 129, 116), (228, 138, 123), (227, 134, 124),
(227, 140, 127), (225, 136, 119), (228, 135, 126), (225, 134, 121),...
これは、フラット配列のすべてのピクセルになります。2次元配列が必要な場合は、追加のコードが必要になります。 PILに直接機能があるかどうかはわかりません。
私は試した imageio.imread
そしてそれは素晴らしい働きをしましたが、1分後にmatplotlib
の関数に出会って、まったく同じ働きをし、n行m列のnumpy
配列を取得しました。
from matplotlib import pyplot as plot
image = plt.imread(path)
また、あなたや他の誰かがopencvを使用している場合は追加します。
imgc=cv2.imread(file)
またはグレースケールとして読み込む
imgc=cv2.imread(file,0)
画像間で比較を行う場合、ピクセルの配列をヒストグラムに変換してデータを正規化することを検討できます。
hist = np.histogram(img.flatten(),256,[0,256])[0]
上記の行は、最初にimg配列を平坦化するため、画像の次元が失われます。次に、0〜256のビン(グレースケールイメージの場合)を生成し、imgからのカウントをこれらのビンに追加し、それらをプロットできるhistとして返します。たとえば、100ビンの値が20の場合、画像の20ピクセルの値が100であることを意味します。
これにより、opencvを使い始めることを考えている人や考えている人に、別の可能性が加わることを願っています。
アバレネありがとう! imageio
は継続されていないため、scipy
の代わりにscipy
を使用してください。アバルネットの答えを簡素化:
Imageioをインストールする
_pip3 install imageto
_
python3コード:
画像のサイズが_260X340
_の場合、rgb_matrixはディメンション_260X340X3
_の配列です。
from imageio import imread rgb_matrix = imread('image13.png') print(rgb_matrix[15][23])
Pillow
でこれを行うことができます。getdata
メソッドはピクセルのフラット配列を提供します。その後、画像のsize
を使用して、そこからマトリックスを構築できます。
from PIL import Image
def getPixels(filename):
img = Image.open(filename, 'r')
w, h = img.size
pix = list(img.getdata())
return [pix[n:n+w] for n in range(0, w*h, w)]