2017-09-15 118 views
-1

我目前在教自己的熊猫和python机器学习。到目前为止,我对文本数据的处理还不错,但是处理图像数据的时候,对python和pandas的了解有限,这让我感到沮丧。熊猫和Python图像到numpy阵列

我已经将.csv文件读入熊猫数据框,其中一列包含图像的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

图像列包含图像的网址。问题是,我不知道如何从中导入图像数据并将其保存为numpy数组进行处理。

任何帮助表示赞赏。提前致谢!

+0

你可以张贴CSV – johnashu

+0

欢迎的一个片段到SO。不幸的是,这不是一个代码写作服务。如果你没有机会,请阅读[问]和[mcve]。通过一点研究和学习Python文档,你应该找到一些工具来帮助你从网络中抓取一个带有URL的图像。如果您想出解决方案并卡住,请回来问问。 – 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") 

如果我nstead你要显示的图片,你可以这样做:

plt.show() 

得到的图片是birdsbutterfly可以在这里看到,以及: Butterfly Birds

+0

谢谢Cedirc!我用了一种不同的方法,但是这个方法也运行得很好,似乎比我的方法要干净得多!祝你有美好的一天。再次感谢。 –

1

由于我们不知道您的csv文件,您必须根据您的情况调整您的pd.read_csv()

这里我使用requests下载一些图像内存

然后在scipy的帮助下解码(如果没有的话,你也可以使用Pillow)。

解码图像然后是原始numpy数组,并由matplotlib显示。

请记住,我们在这里没有使用临时文件,并且所有内容都保存在内存中。另请阅读this(由jfs回答)。

对人缺少一些必需的lib,一个应该能够做同样的(需要改变课程代码):

我只是选择一些随机图片来自 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

谢谢sascha!解码真的是我需要帮助的部分。我很抱歉信息不足。我想我现在正处于一个我不知道我不知道什么的阶段,所以我的问题最终变得模糊。再次感谢你的帮助! –