Matplotlib中將繪圖儲存到Numpy陣列的2種方法

banq發表於2024-03-08

在 Python 中將繪圖儲存到 NumPy 陣列是一種將資料視覺化與陣列操作聯絡起來的技術,允許將圖形繪圖直接儲存為陣列表示形式,從而促進在 Python 環境中進行進一步的計算分析或修改。讓我們學習如何使用 Matplotlib 將繪圖儲存到 NumPy 陣列

如何將繪圖儲存到 NumPy 陣列
要將繪圖儲存到 NumPy 陣列,必須首先使用 Matplotlib 等繪相簿建立繪圖,然後利用“canvas.tostring_rgb()”方法將繪圖捕獲為 RGB 字串,並將該資料重新整形為 NumPy 陣列:適當的尺寸。

基本步驟包括:

  • 繪製並捕獲繪圖的 RGB 表示
  • 將其重塑為陣列,確保視覺化無縫整合到資料分析工作流程中。

方法1:使用fig.canvas.tostring_rgb和numpy.fromstring

  • 在這種方法中,繪圖被建立並繪製在畫布上。繪製畫布以渲染繪圖,然後使用“ buf= Fig.canvas.tostring_rgb() ”將渲染的畫布轉換為原始 RGB 緩衝區。
  • 原始緩衝區被轉換為表示影像的 NumPy 陣列。最後,它列印影像陣列的形狀和一部分畫素值及其 RGB 值。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
fig.canvas.draw()

將畫布canvas 轉換為原始 RGB 緩衝區
buf = fig.canvas.tostring_rgb()
ncols, nrows = fig.canvas.get_width_height()
image = np.frombuffer(buf, dtype=np.uint8).reshape(nrows, ncols, 3)

print(<font>"Image shape:", image.shape)
print(
"First 3x3 pixels and RGB values:")
print(image[:3, :3, :])

輸出:
Image shape: (480, 640, 3)
First 3x3 pixels and RGB values:
[[[255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]]]

影像的尺寸為(480,640,3),這些數字表示:

  • 480: 這是影像的高度(以畫素為單位)。
  • 640: 這是影像的寬度(以畫素為單位)。
  • 3: 這表示影像中顏色通道的數量。由於該值為 3,因此它可能是 RGB 影像,其中每個畫素具有代表紅色、綠色和藍色強度的三個值。

方法 2:將繪圖儲存到 io.BytesIO 物件中

  • 這種方法是用 Matplotlib 建立一個繪圖,然後將其儲存到記憶體中的 BytesIO 物件(作為 PNG),即記憶體中的臨時緩衝區,而不是直接儲存到檔案中。
  • 然後使用 Pillow(PIL Fork)庫將 BytesIO 物件讀入 PIL 影像,並將其轉換為 NumPy 陣列。這種方法可以高效地將繪圖轉換為陣列,而無需從磁碟儲存和讀取。

import matplotlib.pyplot as plt
import numpy as np
import io
from PIL import Image

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])

# Create a bytes buffer to save the plot
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)

# 從緩衝區開啟 PNG 影像,並將其轉換為 NumPy 陣列
image = np.array(Image.open(buf))
# Close the buffer
buf.close()

print(<font>"Image shape:", image.shape)
print(
"First 3x3 pixels and RGB values:")
print(image[:3, :3, :])

輸出:
Image shape: (480, 640, 4)
First 3x3 pixels and RGB values:
[[[255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]]

 [[255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]]

 [[255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]]]

輸出 (480, 640, 4) 給出了一個 NumPy 陣列,表示高度為 480 畫素、寬度為 640 畫素和四個顏色通道(RGBA)的影像。雖然繪圖資料本身可能沒有明確使用 alpha 通道,但它的存在可能是 Matplotlib 處理 PNG 透明度或所用影像處理庫行為的結果。

  • 具有 PNG 透明度的 Matplotlib:使用 plt.savefig 將 Matplotlib 圖形儲存為 PNG 格式並啟用透明度時,即使圖形本身沒有明確使用透明度,生成的影像也可能有 Alpha 通道。這種行為取決於 Matplotlib 對 PNG 影像的內部處理。
  • 外部庫 (PIL):在使用 PIL 等外部庫開啟影像時,即使 Matplotlib 中的原始 PNG 沒有新增阿爾法通道,也可能會新增。某些影像處理庫(如 PIL)可能會預設設定或新增阿爾法通道,以保持一致性。

結論
總之,在 Python 中將繪圖轉換為 NumPy 陣列,透過將其與基於陣列的計算整合,增強了資料視覺化,為各種應用提供了靈活性。
 

相關文章