2

我有一个灰度图像,我想做一个函数

  1. 紧跟图像
  2. 总是比它更好的形象
  3. 在给定的尺度上平滑。

换句话说,我想要一个平滑函数,它近似于局部区域中另一个函数的最大值,同时在所有点高估该函数。

有任何想法吗?


我在这方面的第一遍相当于选择“高点”(通过将图像与高阶二维多项式的最小二乘拟合进行比较)并将二维多项式与它们及其斜率相匹配。由于第一次安装所需的工作空间比我的地址空间多,我认为它不会起作用,我将不得不想出别的东西......


我做了什么

我的最终目标是对图像进行平滑调整,以便每个局部区域都使用全范围的值。关键的实现是“几乎完美”的功能对我来说就很好。

以下过程(从未明确具有 max 函数)是我最终得到的:

  • 使用类似“模糊”的函数查找每个点的局部均值和标准差。
  • 偏移图像以获得零均值。( image -= mean;)
  • 将每个像素除以其标准差。( image /= stdev;)
  • 现在应该是最多[-1,1]的图像(奇怪的是,我的大多数测试图像在该范围内都超过了 99%,而不是预期的 67%)
  • 求整幅图像的标准差。
  • 将一些跨度 +/- n*sigma 映射到您的输出范围。

通过一些操作,可以将其转换为找到我所询问的 Max 函数。

4

4 回答 4

2

这很容易;我不知道它有多好。

  1. 要获得平滑,请使用您最喜欢的模糊算法。例如,半径 5 内的平均点。空间成本是图像大小的顺序,时间是图像大小与模糊半径平方的乘积。

  2. 获取每个像素与原始图像的差异,找到 的最大值(original[i][j] - blurred[i][j]),并将该值添加到模糊图像中的每个像素。总和保证过度近似原始图像。时间成本与图像的大小成正比,具有恒定的额外空间(如果在计算最大值后覆盖模糊的图像。

为了做得更好(例如,在某些约束条件下最小化平方误差),您必须选择某种类型的平滑曲线并进行一些实质性的计算。您可以尝试二次或三次样条,但在二维样条中并不好玩。

于 2009-12-27T00:18:20.453 回答
1

我快速而肮脏的答案是从原始图像开始,对每个像素重复以下过程,直到不进行任何更改:

  1. 如果可以通过增加像素的值来解决此像素与其相邻像素之间的过大增量值,请这样做。
  2. 如果可以通过增加像素值来解决该像素及其相邻像素周围的过大斜率变化,请这样做。

2D 版本看起来像这样:

for all x:
    d = img[x-1] - img[x]
    if d > DMAX:
        img[x] += d - DMAX
    d = img[x+1] - img[x]
    if d > DMAX:
        img[x] += d - DMAX

    dleft = img[x-1] - img[x]
    dright = img[x] - img[x+1]
    d = dright - dleft
    if d > SLOPEMAX:
        img[x] += d - SLOPEMAX
于 2009-12-25T00:28:47.667 回答
1

使用 RxR 过滤器对图像进行最大过滤,然后对最大过滤的图像使用 R-1 阶 B 样条平滑。B 样条的凸包属性保证它将在原始图像之上。

于 2009-12-25T00:59:19.680 回答
0

你能澄清一下你希望它在一定程度上“顺利”的意思吗?此外,您希望它在多大的“本地区域”上接近最大值?

快速而肮脏的答案:源图像的加权平均值和窗口最大值。

于 2009-12-24T23:27:45.963 回答