gpt4 book ai didi

python - scipy imsave 保存错误的值

转载 作者:行者123 更新时间:2023-12-04 19:02:48 26 4
gpt4 key购买 nike

我正在尝试编写将使用 numpy 和 scipy 生成视差图的代码,但是我存储在我的图像的 numpy 数组中的值与我的输出图像中实际显示的值完全不同,用 misc 保存。保存。例如,在数组中,没有一个值大于 22,但在图像中,我有从 0 到 255 的完整值范围。我认为 imsave 可能正在拉伸(stretch)值,以便最大值显示为图像中的 255,但我使用 imsave 创建的其他图像的最大值低于 255。

这些是我用来创建视差图的函数,给定两个沿 x 轴移动的 pgm 图像:

def disp(i, j, winSize, leftIm, rightIm): #calculate disparity for a given point
width = leftIm.shape[1]
height = leftIm.shape[0]
w = winSize / 2
minSAD = 9223372036854775807 #max int
for d in range(23):
SAD = 0.0 #SAD
k = i - w
v = i + w
m = j - w
n = j + w
for p in range(k, v+1): #window - x
for q in range(m, n+1): #window y
if(p - d > 0 and p < width and q < height):
SAD += abs((int(leftIm[q][p]) - int(rightIm[q][p - d])))
if(SAD < minSAD):
minSAD = SAD
disp = d
# print "%d, %d" % (i, j)
return (disp, SAD)

def dispMap(winSize, leftIm, rightIm):
width = leftIm.shape[1]
height = leftIm.shape[0]
outIm = np.zeros((height, width))
SADstore = np.zeros((height, width))
w = winSize / 2
for i in range(w, width-w):
for j in range(w, height/3-w):
dispout = disp(i, j, winSize, leftIm, rightIm)
outIm[j][i] = 1 * dispout[0] #should normally multiply by 4
SADstore[j][i] = dispout[1]
return (outIm, SADstore)

忽略 SAD/SADstore 返回值,我确保这些不会影响我当前的流程。

这是我用来获取输出的代码:
disp12 = dispMap(9, view1, view2)
disp12im = disp12[0]
misc.imsave('disp121.pgm', disp12im)

按照目前的情况, disp12im 中的任何值都不应大于 23。如果我运行一个 for 循环来检查数组,这仍然是正确的。但是,如果我加载保存的图像并在值上运行相同的 for 循环,我会得到大量超过 23 的数字。我做错了什么?

最佳答案

dtype 时,数据会重新缩放。数组的大小从 np.float64 更改(disp12im 的数据类型)到存储在图像中的 8 位值。

为避免这种情况,请将您的图像转换为数据类型 np.uint8在给 imsave 之前:

misc.imsave('disp121.pgm', disp12im.astype(np.uint8))

例如,我将保存此 x作为 PGM 图像:
In [13]: x
Out[13]:
array([[ 1., 3., 5.],
[ 21., 23., 25.]])

In [14]: x.dtype
Out[14]: dtype('float64')

保存 x不变,然后读回来:
In [15]: imsave('foo.pgm', x)

In [16]: imread('foo.pgm')
Out[16]:
array([[ 0, 21, 42],
[212, 234, 255]], dtype=uint8)

这些值已按比例放大到完整的 8 位范围。

相反,转换 xnp.uint8保存之前,然后读回:
In [17]: imsave('foo.pgm', x.astype(np.uint8))

In [18]: imread('foo.pgm')
Out[18]:
array([[ 1, 3, 5],
[21, 23, 25]], dtype=uint8)

关于python - scipy imsave 保存错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33529401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com