【问题标题】:Calculate Median Image in Matlab在 Matlab 中计算中值图像
【发布时间】:2012-03-09 16:47:58
【问题描述】:

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

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

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


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

【问题讨论】:

  • 顺便说一下,中值过滤器用于处理scratch removal之类的事情。
  • @Li-aungYip,是的,我知道,与我想要做的完全不同。但我只是想我会提到它,让人们知道我已经考虑过适应我的需求。
  • 我知道你知道(而且你自己调查了它很好!)但它对我来说是新的,我认为它很酷。 ;)
  • @Li-aungYip,是的,总的来说,matlab 很棒!刚刚发现它,它比在处理中手动编码要好得多:)。
  • 请记住:当您厌倦了 MATLAB 的怪癖时,还有numpy/scipy。 ;)(不像我会说话:我did my thesis in MATLAB。)

标签: image matlab image-processing median


【解决方案1】:

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

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

然后使用:

Y=median(X,4);

求中位数。

【讨论】:

  • +1 以获得优雅的解决方案。虽然为 RGB 像素定义“中值”颜色有点不确定;就目前而言,您已经分别取了 R、G 和 B 的中值,这将产生一个看起来非常奇怪的图像。
  • @Li-aungYip,你是对的。有没有办法让价值观保持一致?
  • 这取决于你想如何定义彩色像素的“中值”。例如,如果您正在处理照片,那么“中值”只有在将照片转换为黑白时才有意义。您在这里的用例是什么?
【解决方案2】:

将我的 cmets 扩展为完整的答案;

@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:上述方法仅适用于没有三点等距的情况。也许您需要询问 math.stackexchange.com?

编辑 4:维基百科再次提供! Smallest circle problem, Bounding sphere.

【讨论】:

  • 我正式知道中位数只能在可以从高到低排列的数据上找到(这就是为什么你的意思是它只对黑白图像有意义,因为 rgb-color 有三种不同的价值观,对吧?)。但我想做的是将它用于颜色数据,最好将 rgb 值保持在一起。所以我正在寻找的中位数将是 3d 空间中的点(在 xyz 轴上是该特定像素的所有 rgb 值,从高到低排列)最接近中间(在所有三个方向上) .这就是我要计算的。
  • 也许您需要使用看起来更像极坐标系(HSV/HSL?)的不同颜色空间
  • 我已经尝试过了,但是 hsv 中位数对我来说没有那么有吸引力。它只是看起来不如 rgb 中值自然(例如:通常 hsv 平均值变为绿色,图像数量充足)。
  • 你认为我必须使用某种寻路算法,还是有更简单的方法? (我正在考虑具有所有值的 3d 空间,从中间发出一个半径 r 增加的球体,直到它达到一个值(然后是中值),如果这不是太抽象的话:)
  • 谢谢!我要试试这个!我先用三张图片试试这个,然后我们看看如何扩展它以适应更多图片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2015-12-12
  • 2014-10-31
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多