Dim*_*ims 11 python matplotlib amazon-s3 boto3
我有以下代码
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import boto3
s3 = boto3.resource('s3', region_name='us-east-2')
bucket = s3.Bucket('sentinel-s2-l1c')
object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2')
object.download_file('B01.jp2')
img=mpimg.imread('B01.jp2')
imgplot = plt.imshow(img)
plt.show(imgplot)
Run Code Online (Sandbox Code Playgroud)
它的工作原理.但它首先将文件下载到当前目录的问题.是否可以直接在RAM中读取文件并将其解码为图像?
小智 31
我建议使用io模块将文件直接读入内存,而不必使用临时文件.
例如:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import boto3
import io
s3 = boto3.resource('s3', region_name='us-east-2')
bucket = s3.Bucket('sentinel-s2-l1c')
object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2')
file_stream = io.StringIO()
object.download_fileobj(file_stream)
img = mpimg.imread(file_stream)
# whatever you need to do
Run Code Online (Sandbox Code Playgroud)
io.BytesIO如果您的数据是二进制的,您也可以使用.
bea*_*ker 25
从 Greg Merritt 的回答中进一步发展以解决评论部分中的所有错误,使用BytesIO代替StringIO,使用 PILImage代替matplotlib.image。
以下函数适用于python3和boto3。同样,write_image_to_s3功能也是一种奖励。
from PIL import Image
from io import BytesIO
import numpy as np
def read_image_from_s3(bucket, key, region_name='ap-southeast-1'):
"""Load image file from s3.
Parameters
----------
bucket: string
Bucket name
key : string
Path in s3
Returns
-------
np array
Image array
"""
s3 = boto3.resource('s3', region_name='ap-southeast-1')
bucket = s3.Bucket(bucket)
object = bucket.Object(key)
response = object.get()
file_stream = response['Body']
im = Image.open(file_stream)
return np.array(im)
def write_image_to_s3(img_array, bucket, key, region_name='ap-southeast-1'):
"""Write an image array into S3 bucket
Parameters
----------
bucket: string
Bucket name
key : string
Path in s3
Returns
-------
None
"""
s3 = boto3.resource('s3', region_name)
bucket = s3.Bucket(bucket)
object = bucket.Object(key)
file_stream = BytesIO()
im = Image.fromarray(img_array)
im.save(file_stream, format='jpeg')
object.put(Body=file_stream.getvalue())
Run Code Online (Sandbox Code Playgroud)
Hye*_*ung 14
我想建议在模块中使用Python的NamedTemporaryFiletempfile.它会创建临时文件,在文件关闭时将被删除(感谢@NoamG)
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import boto3
import tempfile
s3 = boto3.resource('s3', region_name='us-east-2')
bucket = s3.Bucket('sentinel-s2-l1c')
object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2')
tmp = tempfile.NamedTemporaryFile()
with open(tmp.name, 'wb') as f:
object.download_fileobj(f)
img=mpimg.imread(tmp.name)
# ...Do jobs using img
Run Code Online (Sandbox Code Playgroud)
使用客户端的方法略有不同:
import boto3
import io
from matplotlib import pyplot as plt
client = boto3.client("s3")
bucket='my_bucket'
key= 'my_key'
outfile = io.BytesIO()
client.download_fileobj(bucket, key, outfile)
outfile.seek(0)
img = plt.imread(outfile)
plt.imshow(img)
plt.show()
Run Code Online (Sandbox Code Playgroud)
通过指定文件格式,可以流式传输图像imread().
import boto3
from io import BytesIO
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
resource = boto3.resource('s3', region_name='us-east-2')
bucket = resource.Bucket('sentinel-s2-l1c')
image_object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2')
image = mpimg.imread(BytesIO(image_object.get()['Body'].read()), 'jp2')
plt.figure(0)
plt.imshow(image)
Run Code Online (Sandbox Code Playgroud)
小智 5
object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2')
img_data = object.get().get('Body').read()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19318 次 |
| 最近记录: |