Python Numpy 3d阵列-规范化行
我一直致力于用水平暗/亮线条规范化图像数据 请在下面找到我的最小工作示例。 设一个3d阵列(三幅图像): 例如,图像#2Python Numpy 3d阵列-规范化行,python,arrays,numpy,array-broadcasting,Python,Arrays,Numpy,Array Broadcasting,我一直致力于用水平暗/亮线条规范化图像数据 请在下面找到我的最小工作示例。 设一个3d阵列(三幅图像): 例如,图像#2a[:,:,1]由 [[1 1 1] [4 4 4] [7 7 7]] 并显示水平条纹。为了消除条纹,我计算了行的中位数、总体中位数和差分矩阵 row_median = np.median(a, axis=1) bg_median= np.tile(np.median(a, axis=[0,1]),(3,1)) difference_matrix= bg_median-
a[:,:,1]
由
[[1 1 1]
[4 4 4]
[7 7 7]]
并显示水平条纹。为了消除条纹,我计算了行的中位数、总体中位数和差分矩阵
row_median = np.median(a, axis=1)
bg_median= np.tile(np.median(a, axis=[0,1]),(3,1))
difference_matrix= bg_median-row_median
随后,我对图像进行迭代,并将差分矩阵应用于所有图像
for i in range(len(a)):
a[:,:,i] = a[:,:,i] + np.tile(difference_matrix[:,i],(3,1)).T
这将给出所需的结果,例如,在a[:,:,1]
:
[[4 4 4]
[4 4 4]
[4 4 4]]
对于大型图像和图像堆栈,此过程非常缓慢。
如果您能通过使用广播,对提高我的代码性能提出任何意见和提示,我将不胜感激
编辑:
跟进
为我解决了这个问题。方法#1
利用None/np.newaxis
扩展维度,而不是平铺这些中间数组,以节省内存,从而实现性能。效率。因此,这些变化将是-
diff = np.median(a, axis=[0,1]) - np.median(a, axis=1)
a += diff[:,None]
这将考虑罩下的尺寸扩展
方法#2
或者,一种更明确的跟踪dim的方法是在执行数据缩减时保留dim,从而避免使用None
进行最终dim扩展。因此,我们可以将keepdims
用作True
-
diff = np.median(a,axis=(0,1),keepdims=True) - np.median(a, axis=1,keepdims=True)
a += diff
发布的解决方案对你有用吗?
diff = np.median(a, axis=[0,1]) - np.median(a, axis=1)
a += diff[:,None]
diff = np.median(a,axis=(0,1),keepdims=True) - np.median(a, axis=1,keepdims=True)
a += diff