我有一個H_arr代表以下影像的 numpy 陣列:
(圖 1)
并且我希望將其值轉換為 [0,1] 范圍內的值,我們將這個新陣列稱為New_arr,以使原始影像保持不變。我的意思是當我使用plt.imshow(New_arr).
的資料型別H_arr是 float32,H_arr.min()給出-24.198463和H_arr.max()26.153196 。H_arr.shape給出 (960, 1280, 3)。
之前我以為我會使用以下公式將其轉換為 0-1 范圍:
newvalue= (new_max-new_min)/(max-min)*(value-max) new_max
并將其實作為:
New = np.zeros((H_arr.shape[0],H_arr.shape[1],H_arr.shape[2]),dtype = float)
for i in range(H_arr.shape[0]):
for j in range(H_arr.shape[1]):
for k in range(H_arr.shape[2]):
New[i][j][k]= (1-0)/(H_arr.max()-H_arr.min())*(H_arr[i][j][k]-H_arr.max()) 1
但這在計算上非常昂貴。感謝任何關于我應該如何轉換原始陣列的輸入。
編輯:合并下面的答案后,我可以在 [0,1] 范圍內很快完成,但影像急劇變化為

如何確保我的影像與以前保持一致?
uj5u.com熱心網友回復:
這是將陣列縮放到您想要的任何間隔的函式:
def minmax_scaler(arr, *, vmin=0, vmax=1):
arr_min, arr_max = arr.min(), arr.max()
return ((arr - arr_min) / (arr_max - arr_min)) * (vmax - vmin) vmin
以下是如何使用它:
import PIL
import numpy as np
import urllib
def read_image_from_url(ur):
return np.array(PIL.Image.open(urllib.request.urlopen(url)))
# Original
url = "https://i.stack.imgur.com/75y6Q.png"
arr = read_image_from_url(url).astype(np.float32)
print(f"{arr.min() = }")
print(f"{arr.max() = }")
# Scaling in [0, 1]
arr_scaled_01 = minmax_scaler(arr, vmin=0, vmax=1)
print(f"{arr_scaled_01.min() = }")
print(f"{arr_scaled_01.max() = }")
# Scaling into new [vmin, vmax]
vmin_new, vmax_new = -34, 34
arr_scaled = minmax_scaler(arr, vmin=vmin_new, vmax=vmax_new)
print(f"{arr_scaled.min() = }")
print(f"{arr_scaled.max() = }")
arr.min() = 0.0
arr.max() = 255.0
arr_scaled_01.min() = 0.0
arr_scaled_01.max() = 1.0
arr_scaled.min() = -34.0
arr_scaled.max() = 34.0
通常,使用 imshow 時,您可以設定 vmin 和 vmax,因此無論陣列值的范圍如何,繪圖都是相同的。但是,如果陣列是 RGB 影像,它們將被忽略,在這種情況下,您必須自己在 [0, 1] 中對浮點數進行縮放,或者在 [0, 255] 中對整數進行縮放。
import matplotlib.pyplot as plt
def imshow_minmax(arr, ax):
# vmin, vmax and cmap will be ignored if RGBA image
return ax.imshow(arr, vmin=arr.min(), vmax=arr.max(), cmap="gray")
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(8, 4))
axes[0, 0].set_ylabel("One band")
imshow_minmax(arr[..., 0], ax=axes[0, 0])
imshow_minmax(arr_scaled_01[..., 0], ax=axes[0, 1])
imshow_minmax(arr_scaled[..., 0], ax=axes[0, 2])
axes[1, 0].set_ylabel("RGB")
imshow_minmax(arr, ax=axes[1, 0])
imshow_minmax(arr_scaled_01, ax=axes[1, 1])
imshow_minmax(arr_scaled, ax=axes[1, 2])
axes[1, 0].set_xlabel(f"Original in {[arr.min(), arr.max()]}")
axes[1, 1].set_xlabel("Scaled in [0, 1]")
axes[1, 2].set_xlabel(f"Scaled in {[vmin_new, vmax_new]}")
fig.tight_layout()
plt.show()

uj5u.com熱心網友回復:
您可以一次將公式應用于整個陣列。不需要回圈,只需洗掉索引:
New= (1-0)/(H_arr.max()-H_arr.min())*(H_arr-H_arr.max()) 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511632.html
下一篇:修復傾斜/傾斜的文本Opencv
