我創建了一個 numpy 陣列形狀(11 x 11),其中所有像素為 0,不包括填充為 1 的一列。
[[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 0 0 ]]
使用 matplotlib.imsave 將陣列保存為 png 影像,從而產生預期的影像 - 黑色背景,中間有一條白線。
當嘗試重新匯入保存的 png 影像時,skipy.imread 和 Pil.Image.Open 產生一個表單陣列
[[[ 68 1 84 255]
[ 68 1 84 255]
[ 68 1 84 255]
[ 68 1 84 255]
[ 68 1 84 255]
[253 231 36 255]
[ 68 1 84 255]
[ 68 1 84 255]
[ 68 1 84 255]
[ 68 1 84 255]
[ 68 1 84 255]]
...
]
這種檔案格式是什么意思(在 scikit 影像檔案中找不到解釋)?
以及如何將其轉換回二進制輸入影像?
uj5u.com熱心網友回復:
您所看到的解釋如下:
- 你的資料是灰度的
- 然后你用顏色圖繪制了它 ——線條看起來是黃色的,背景看起來是深藍色/紫色?
- 然后你告訴 matplotlib 保存那張假彩色圖片
- 然后你讀回那張假彩色圖片
- 現在你有了 RGBA 像素資料。您會看到第一行像素,以及每個顏色像素的每個值
如果您想保持資料的灰度外觀,您將有一些選擇。
Use plt.imshow(arr, cmap="gray"),它使用灰色地圖而不是彩色地圖。
在讀取影像并將任何顏色轉換為灰度時,您可以選擇 scikit-image 或 OpenCV。OpenCV 有cv.imread(fname, cv.IMREAD_GRAYSCALE). scikit-image 提供skimage.io.imread(fname, as_gray=True).
實際上,您首先應該使用 scikit-image 或 OpenCV 來撰寫您的圖片。Matplotlib 用于繪圖,而不是用于真實存盤資料。Matplotlib 獲取您的資料并重新調整它,使最大值和最小值變為 0 和 1,這對于graycmap 來說是黑白的。
uj5u.com熱心網友回復:
在灰度上,值為 1 的像素不會顯示為白色 - 這只是因為 matplotlib 在顯示影像之前對其進行了標準化。
選擇:
a)保留原始二進制值,然后保存的影像中間不會有白線
b)中間有白線,但是您必須在保存之前和加載之后修改陣列它。
廣告 b)
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
# This is the array you have
arr = np.zeros((11, 11), dtype=np.uint8)
arr[:, 5] = 1
plt.figure()
plt.imshow(arr, cmap='gray')
plt.show()
# This will ensure that the line appears white in the .png
arr_png = arr * 255 # 2**8 - 1
# Write to disk
cv.imwrite('line.png', arr_png)
# Load from disk
arr_from_disk = np.array(cv.imread('line.png', 0), dtype=np.uint8)
# Rescale
arr_from_disk = np.divide(arr_from_disk, 255)
assert np.array_equal(arr, arr_from_disk), 'Oops'
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/489335.html
標籤:Python opencv matplotlib 图像处理 scikit 图像
