我正在尝试使用numpy和scipy编写代码生成视差图,但是存储在我的numpy数组中的图像值与实际显示在输出图像中的值完全不同,这些值是使用misc.imsave保存的。例如,在数组中,没有任何值大于22,但在图像中,我拥有从0到255的完整值范围。我认为可能是imsave将值拉伸,使得最大值在图像中显示为255,但我使用imsave创建的其他图像具有低于255的最大值。
这些是我用来创建视差图的函数,给定已沿x轴移动的两个pgm图像:
忽略SAD/SADstore的返回值,我已确保这些不会影响我的当前进程。
这是我用来获取输出的代码:
这些是我用来创建视差图的函数,给定已沿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的数字。我做错了什么?