web-dev-qa-db-ja.com

python-画像のRGBマトリックス

画像を入力として、それに対応するRGBマトリックスを取得するにはどうすればよいですか? numpy.asarray関数をチェックアウトしました。それは私にrgb行列または他の行列を与えますか?

19
Ojas

この回答は2018年の時点で古いことに注意してください。 scipyimreadを非推奨にしたため、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
14
abarnert

私はあなたがここで望んでいたことを正確にやっていないと感じているので、これが完全にオフかどうかを指定してください。このような画像を開き、ピクセルの配列を取得できます。

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に直接機能があるかどうかはわかりません。

12
Bemmu

私は試した imageio.imreadそしてそれは素晴らしい働きをしましたが、1分後にmatplotlibの関数に出会って、まったく同じ働きをし、n行m列のnumpy配列を取得しました。

from matplotlib import pyplot as plot
image = plt.imread(path)
1
Denziloe

また、あなたや他の誰かが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を使い始めることを考えている人や考えている人に、別の可能性が加わることを願っています。

1
mike

アバレネありがとう! imageioは継続されていないため、scipyの代わりにscipyを使用してください。アバルネットの答えを簡素化:

  1. Imageioをインストールする

    _pip3 install imageto_

  2. python3コード:

    画像のサイズが_260X340_の場合、rgb_matrixはディメンション_260X340X3_の配列です。

    from imageio import imread rgb_matrix = imread('image13.png') print(rgb_matrix[15][23])

0
Prabhat Soni

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)]
0
TitouanT