【问题标题】:Pandas and Python image to numpy array [closed]Pandas和Python图像到numpy数组[关闭]
【发布时间】:2018-02-24 19:20:56
【问题描述】:

我目前正在自学 pandas 和 python 以进行机器学习。到目前为止,我在处理文本数据方面做得很好,但是处理图像数据时对 python 和 pandas 的了解有限。

我已将 .csv 文件读入 pandas 数据帧,其中一列包含图像的 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数组进行处理。

感谢任何帮助。提前致谢!

【问题讨论】:

  • 你能发布一个 csv 的 sn-p
  • 欢迎来到 SO。不幸的是,这不是代码编写服务。如果您还没有机会,请阅读How to Askminimal reproducible example。通过一些研究和 Python 文档,您应该会找到一些工具来帮助您获取来自网络的带有 url 的图像。如果您想出解决方案但遇到困难,请回来询问。
  • 您使用的是哪个版本的 Python?您是将 DataFrame 用于其他目的还是只是解析 csv 文件的中间步骤?
  • 感谢 johnashu 和二战!我已经阅读了这些链接,对于我的问题含糊不清且信息不足,我深表歉意。下次我会尽力更好地提问。感谢您花时间阅读我的问题!

标签: python image pandas numpy


【解决方案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")

如果你想展示你可以做的图片:

plt.show()

生成的图片是birdsbutterfly,也可以在这里看到:

【讨论】:

  • 谢谢塞迪尔克!我使用了另一种方法,但这个方法也很有效,而且似乎比我的方法更干净!祝你有美好的一天。再次感谢。
【解决方案2】:

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

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

然后在 scipy 的帮助下对这些进行解码(您应该已经拥有;如果没有:您也可以使用 Pillow)。

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

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

对于缺少一些必需库的人,应该能够做同样的事情(当然需要更改代码):

我刚刚从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()

输出:

【讨论】:

  • 谢谢你,萨沙!解码确实是我需要帮助的部分。很抱歉信息不足。我想我目前正处于一个我不知道我不知道什么的阶段,所以我的问题最终变得模糊。再次感谢您的帮助!
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2020-10-07
  • 2021-05-20
  • 2019-02-02
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2016-05-22
相关资源
最近更新 更多