查找图像列表的中位数

时间:2016-05-25 17:54:30

标签: image python-2.7 opencv numpy image-processing

如果我有一个由3D ndarray表示的图像列表,例如[[x,y,color],...],我可以使用哪些操作输出值为所有值的中值的图像?我正在使用for循环,发现它太慢了。

3 个答案:

答案 0 :(得分:5)

这是我使用NumPy的矢量化实现:

对于我的测试,我使用了这五张图片:

enter image description here

相关部分:

import numpy as np
import scipy.ndimage

# Load five images:
ims = [scipy.ndimage.imread(str(i + 1) + '.png', flatten=True) for i in range(5)]
# Stack the reshaped images (rows) vertically:
ims = np.vstack([im.reshape(1,im.shape[0] * im.shape[1]) for im in ims])
# Compute the median column by column and reshape to the original shape:
median = np.median(ims, axis=0).reshape(100, 100)

完整的脚本:

import numpy as np
import scipy.ndimage
import matplotlib.pyplot as plt

ims = [scipy.ndimage.imread(str(i + 1) + '.png', flatten=True) for i in range(5)]
print ims[0].shape # (100, 100)

ims = np.vstack([im.reshape(1,im.shape[0] * im.shape[1]) for im in ims])
print ims.shape # (5, 10000)

median = np.median(ims, axis=0).reshape(100, 100)

fig = plt.figure(figsize=(100./109., 100./109.), dpi=109, frameon=False)
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
plt.imshow(median, cmap='Greys_r')
plt.show()

五张图片的中位数(numpy.median)结果如下:

enter image description here

有趣的部分:均值(numpy.mean)结果如下所示:

enter image description here

好的,科学与艺术相遇。 : - )

答案 1 :(得分:2)

您说的是彩色图片,格式为3d ndarrays列表。我们假设有n张图片:

imgs = [img_1, ..., img_n]

其中imgs为list,每个img_indarray,形状为(nrows, ncols, 3)

将列表转换为4d ndarray,然后将中位数放在与图像对应的维度上:

import numpy as np

# Convert images to 4d ndarray, size(n, nrows, ncols, 3)
imgs = np.asarray(imgs)

# Take the median over the first dim
med = np.median(imgs, axis=0)

这给出了像素中值。每个像素的每个颜色通道的值是所有图像中相应像素/通道的中值。

asarray()的文档说"如果输入已经是ndarray"则不执行复制。这表明如果将原始图像列表存储为4d ndarray而不是列表,则操作会更快。在这种情况下,没有必要将信息复制到内存中(或运行asarray()

答案 2 :(得分:-1)

您能举例说明数据吗?

否则,我认为您可以使用numpy numpy.mean

您有文档here;)