在Matlab中计算中值图像

时间:2012-02-18 15:52:16

标签: image matlab image-processing median

我是matlab的新手,所以请原谅我,如果我在这里要求明显的:我所拥有的是一组彩色摄影图像(所有相同的尺寸)。我想要做的是计算每个像素的median颜色值。

我知道matlab中有一个中值滤波器,但据我所知,它并不能完全符合我的要求。因为我想计算整个图像集合之间的中值,对于每个单独的像素。

因此,例如,如果我有三个图像,我希望matlab计算(对于每个像素)这三个图像中的哪个颜色值是中值。我怎么会这样做,有人知道吗?


编辑:从我能想到的,我将不得不将所有图像加载到单个矩阵中。矩阵必须具有4个维度(高度,宽度,rgb,图像),并且对于每个像素,每个颜色在第4维度(图像之间)中找到中值。 这是正确的(并且可能)吗?我该怎么做?

2 个答案:

答案 0 :(得分:6)

你的直觉是正确的。例如,如果您有图像image_1,image_2,image_3,则可以将它们分配给4维矩阵:

X(:,:,:,1) = image_1;
X(:,:,:,2) = image_2;
X(:,:,:,3) = image_3;

然后使用:

Y=median(X,4);

获得中位数。

答案 1 :(得分:2)

将我的评论扩展为完整答案;

@ prototoast的答案很优雅,但由于每个像素的R,G和B值的中位数是分开计算的,输出图像看起来会很奇怪。

要获得具有视觉意义的明确定义的中位数,最简单的方法是在尝试获取中位数之前将图像转换为黑白图像。

来自图像处理工具箱的

rgb2gray()将以保留每个像素的亮度同时丢弃色调和饱和度的方式执行此操作。

编辑:

如果你想将“RGB中位数”定义为“笛卡尔坐标中的中间值”,这对于三幅图像来说就足够了。

考虑单个像素,中间颜色有三种可能的选择,C1=(r1,g1,b1)C2=(r2,g2,b2)C3=(r3,g3,b3)。通常这些在3D空间中形成一个三角形。

取三种颜色之间的毕达哥拉斯距离:D1_2=abs(C2-C1)D2_3=abs(C3-C2)D1_3=abs(C3-C1)

选择“中位数”作为与其他两个距离最小的颜色。定义D1=D1_2+D1_3等并使用min(D1,D2,D3)应该可以使用Triangle Inequality。注意退化情况:等边三角形(C1,C2,C3等距离),线(C1,C2,C3彼此线性)或点(C1 = C2 = C3)。

请注意,这种考虑3D中位数的简单方法很难扩展到三个以上的图像,因为一组四个或更多3D点的“中位数”有点难以定义。

修改2

为了将N点的“中位数”定义为在3D空间中包围它们的最小球体的中心,您可以尝试:

  1. 找到{N}中相距最远的两个点N1和N2。 N1和N2之间的距离是包围所有点的最小球体的直径。 (证明:任何较小的球体都不能同时包围N1和N2。)
  2. 中位数介于N1和N2之间:M = (N1+N2)/2
  3. 编辑3 :以上只有在没有三个点等距的情况下才有效。也许你需要问math.stackexchange.com?

    编辑4 :维基百科再次发布! Smallest circle problemBounding sphere