Python 多幅图像的时间中值图像

Python 多幅图像的时间中值图像,python,opencv,numpy,Python,Opencv,Numpy,除了使用np.median(array)计算每个像素的中值外,还有其他方法计算多幅图像的中值吗 我知道已经有了,但这是3年前的事了,可能发生了什么 下面是一个将3个玩具图像放入(高度)x(宽度)x(图像数)数组的示例,然后沿(图像数)轴调用numpy.median(如果图像按时间顺序排列,则该轴将是时间轴) 第4-7行由numpy.dstack函数方便地处理。这相当于: images = np.dstack((img1, img2, img3)) 这是通常的方式2D图像读取到一个列表或读取顺序

除了使用
np.median(array)
计算每个像素的中值外,还有其他方法计算多幅图像的中值吗


我知道已经有了,但这是3年前的事了,可能发生了什么

下面是一个将3个玩具图像放入(高度)x(宽度)x(图像数)数组的示例,然后沿(图像数)轴调用
numpy.median
(如果图像按时间顺序排列,则该轴将是时间轴)

第4-7行由
numpy.dstack
函数方便地处理。这相当于:

images = np.dstack((img1, img2, img3))

这是通常的方式2D图像读取到一个列表或读取顺序从文件将被附加,以增加数据结构的增量。虽然,通常情况下,预分配零块并在加载时按顺序插入数据更有效。

时间中值图像被定义为整个时间图像序列的像素级中值。在某种程度上,如果不计算像素级的中间值,你就无法计算它(除非你使用某种近似技术,但如果计算起来像一组有序序列的中间值一样便宜,很难想象你为什么要这样做)。如果你有一些代码来说明这个计算是如何组织的,我们也许可以就是否可以更有效地组织它给出一些建议,即使存在相同的基本操作。@F先生,我正在考虑将每个图像转换为1D数组,并使用两个
for
循环获取该位置的每个值,将它们放在新的1D数组上以计算中值,然后将结果放在另一个1D数组上,即中值图像,然后使用
np.reformate()
将其重新整形为2D。有什么更好的方法吗?
numpy
允许矢量化计算,因此如果您设置一个类似(高度)x(宽度)x(时间)的3D数组,那么您可以告诉
numpy
在第三轴上取中值,它会自动解释为像素级中值。您不应该使用任何for循环来表示这一点,它应该只涉及对
中值的单个调用。由于
numpy
实现了低级优化,这将比您尝试的任何手动实现都要快。感谢您帮助优化我的代码。当你在
np.mean()
中谈到使用轴的矢量化计算时,我对它做了一些修改,最终得到了
np.median([img1,img2,img3],axis=0)
,与你使用
np.median(np.dstack((img1,img2,img3)),axis=2)的方法类似。
小心,
np.median
返回
float
s。如果要使用OpenCV进一步处理它,可能需要将其强制转换为
np.uint8
。(例如,
imshow
)@TomaszGandor您必须非常小心,因为整数数组的中值本身可能不是整数(因为对于偶数基数,中值将是中间两个的平均值,而这两个整数的平均值本身可能不是整数)。在某些不可接受的情况下,强制转换为整数类型可能会有损,您可能更喜欢应用舍入,或增加颜色表示的位大小。
images = np.dstack((img1, img2, img3))