2017-09-15 6 views
-1

私は現在機械学習のためにpandasとpythonを教えています。これまでのテキストデータではうまくいっていますが、pythonやpandasの知識が限られている画像データを扱うことは私を驚かせています。パンダとPythonの画像をnumpyの配列

pandasデータフレームに.csvファイルを読み込み、その列の1つに画像のURLが含まれています。これは、データフレームから情報を取得するときに表示されます。

dataframe = pandas.read_csv("./sample.csv") 
dataframe.info() 

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 5000 entries, 0 to 4999

Data columns (total of 5 columns):

name 5000 non-null object

...

image 5000 non-null object

画像の列には画像へのURLが含まれています。問題は、私はこれからイメージデータをインポートする方法を知らず、処理のためにnumpy配列として保存します。

何か助けていただければ幸いです。前もって感謝します!

+0

あなたはCSV – johnashu

+0

ようこそのスニペットを投稿することができますSOに。残念ながら、これはコード作成サービスではありません。チャンスがなかったら、[ask]と[mcve]を読んでください。 Pythonのドキュメントを少し研究して勉強すれば、URLを使ってWebから画像を取得するのに役立つツールが見つかるはずです。あなたが解決策を思いついて立ち往生した場合は、戻って来てください。 – wwii

+0

使用しているPythonのバージョンは?あなたは他の目的のためにDataFrameを使用していますか?それとも、csvファイルを解析するための中間ステップですか? – wwii

答えて

1

あなたがウェブから画像をダウンロードして、例えば、あなたのデータフレームからあなたのイメージを回転させて、保存したい場合は結果は次のコードを使用できます:

import pandas as pd 
import matplotlib.pylab as plt 
import numpy as np 
from PIL import Image 
import urllib2 as urllib 
import io 

df = pd.DataFrame({ 
"name": ["Butterfly", "Birds"], 
"image": ["https://upload.wikimedia.org/wikipedia/commons/0/0c/Two-tailed_pasha_%28Charaxes_jasius_jasius%29_Greece.jpg", 
           'https://upload.wikimedia.org/wikipedia/commons/c/c5/Bat_cave_in_El_Maviri_Sinaloa_-_Mexico.jpg']}) 

def rotate_image(image, theta): 
    """ 
    3D rotation matrix around the X-axis by angle theta 
    """ 
    rotation_matrix = np.c_[ 
     [1,0,0], 
     [0,np.cos(theta),-np.sin(theta)], 
     [0,np.sin(theta),np.cos(theta)] 
    ] 
    return np.einsum("ijk,lk->ijl", image, rotation_matrix) 

for i, imageUrl in enumerate(df.image): 
    print imageUrl 
    fd = urllib.urlopen(imageUrl) 
    image_file = io.BytesIO(fd.read()) 
    im = Image.open(image_file) 
    im_rotated = rotate_image(im, np.pi) 
    fig = plt.figure() 
    plt.imshow(im_rotated) 
    plt.axis('off') 
    fig.savefig(df.name.ix[i] + ".jpg") 

結果の画像はここにも見ることができbirdsbutterflyある

plt.show() 

:あなたはあなたが行うことができます写真を見せたいnstead Butterfly Birds

+0

ありがとうCedirc!私は別の方法を使用しましたが、これもうまくいき、私の方法よりもはるかにクリーンなようです!良い一日を過ごしてください。再度、感謝します。 –

1

あなたのcsvファイルがわからないので、あなたの場合はpd.read_csv()を調整する必要があります。

ここで私はrequestsを使って、のメモリ内をダウンロードしています。

これらは、scipyの助けを借りてデコードされます(既に持っていなければなりません:そうでない場合:Pillowも使用できます)。

デコードされた画像は生のnumpy配列であり、matplotlibで示されます。

ここでは一時ファイルを使用しておらず、すべてがメモリに保持されていることに注意してください。 this(jfsの回答)も読んでください。いくつかの必要なLIBSの行方不明者については

、1はで同じことを行うことができるはずです(コードはもちろん変更する必要があります):

  • 要求がurllib(標準のlib)に置き換えることができ
  • でインメモリ処理の話頭の
  • パンダは
  • matplotlibのは単なるデモの目的(枕は、画像を表示可能にするかどうかわからないためですcsv(内部ストレージは、その後、異なるかもしれませんが)
  • scipyのダウンロードがPillowに置き換えることができ
  • (標準のlib)に置き換えることができます。 編集:それはそれ canらしい)

私はちょうど some german newspageからいくつかのランダムな画像を選択しました。

編集:ウィキペディアからの自由な画像が使用されました!

コード:

import requests     # downloading images 
import pandas as pd    # csv-/data-input 
from scipy.misc import imread # image-decoding -> numpy-array 
import matplotlib.pyplot as plt # only for demo/plotting 

# Fake data -> pandas DataFrame 
urls_df = pd.DataFrame({'urls': ['https://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Rescue_exercise_RCA_2012.jpg/500px-Rescue_exercise_RCA_2012.jpg', 
           'https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Clinotarsus_curtipes-Aralam-2016-10-29-001.jpg/300px-Clinotarsus_curtipes-Aralam-2016-10-29-001.jpg', 
           'https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/US_Capitol_east_side.JPG/300px-US_Capitol_east_side.JPG']}) 

# Download & Decode 
imgs = [] 
for i in urls_df.urls:    # iterate over column/pandas Series 
    r = requests.get(i, stream=True) # See link for stream=True! 
    r.raw.decode_content = True  # Content-Encoding 
    imgs.append(imread(r.raw))  # Decoding to numpy-array 

# imgs: list of numpy arrays with varying shapes of form (x, y, 3) 
#  as we got 3-color channels 
# Beware!: downloading png's might result in a shape of (x, y, 4) 
#  as some alpha-channel might be available 
# For more options: https://docs.scipy.org/doc/scipy/reference/generated/scipy.misc.imread.html 

# Plot 
f, arr = plt.subplots(len(imgs)) 
for i in range(len(imgs)): 
    arr[i].imshow(imgs[i]) 
plt.show() 

出力:

enter image description here

+0

ありがとうサシャ!デコードは本当に私が助けが必要な部分でした。情報が不十分ですみませんでした。私は今私が知らないことがわからない段階にいるので、私の質問はあいまいになってしまいました。あなたの助けをもう一度ありがとう! –

関連する問題