【问题标题】:Does there exist a way to directly figure out the "smoothness" of a digital image?有没有办法直接计算出数字图像的“平滑度”?
【发布时间】:2014-08-31 13:18:23
【问题描述】:

有几种方法可以评估图像的亮度、饱和度、色调、强度、对比度等。我们经常听说平滑或锐化图像的操作。由此,必须存在一种评估图像整体平滑度的方法,以及一种在可能基于小波的公式中计算该值的精确方法。或者幸运的是,任何人甚至可以提供 MATLAB 函数或它们的组合来直接计算这个值。

提前致谢!

【问题讨论】:

  • 有趣的问题。您是否知道您打算测量的“平滑程度”的具体定义是什么?

标签: image matlab smooth


【解决方案1】:

平滑度是一个模糊的术语。一个应用程序认为顺利的事情可能对另一个应用程序来说并不顺利。

在常见情况下,平滑度是颜色渐变的函数。在 3 个颜色通道上进行 2d 渐变,然后在 3 个通道上获取它们的幅度、sqrt(dx^2 + dy^2) 和平均值、求和或某些函数。这可以为您提供局部平滑度,然后您可以对图像进行求和/平均/最小二乘。

然而,在更常见的情况下,颜色的线性变化也是平滑的(想想 2 种颜色渐变,或者光如何从物体反射)。为此,二级差速器可能更合适。拉普拉斯算子正是这样做的。

我很幸运使用拉普拉斯算子通过 scipy/numpy 库计算 Python 中的平滑度。 matlab 和其他工具也有类似的实用程序。

请注意,结果值并不是数学书籍中的绝对值,您应该只使用它相对于自身并使用您认为合适的常量。


具体方法:

首先获取 scipy。如果您使用的是 Linux,则可以在 pypi 上找到它。对于 Windows,您必须使用预编译版本 here。您应该使用 scipy.ndimage.imread 打开图像,然后在您阅读的图像上使用 scipy.ndimage.filters.laplace。你实际上并没有来混合频道,你可以简单地调用 numpy.average 并且它应该足够接近。

import scipy as np
import scipy.ndimage as ndi
print np.average(np.absolute(ndi.filters.laplace(ndi.imread(path).astype(float) / 255.0)))

这将给出图像的平均平滑度(对于平滑度的某些含义)。我使用 np.absolute 因为值可以是正数或负数,我们不希望它们在平均时均匀。我转换为浮点数并除以 255,得到 0.0 到 1.0 之间的值,而不是 0 到 256,因为它更容易使用。

如果你想看看 laplacian 找到了什么,你可以使用 matplotlib:

import matplotlib.pyplot as plt
v = np.absolute(ndi.filters.laplace(ndi.imread(path).astype(float) / 255.0))
v2 = np.average(v, axis=2) # Mixing the channels down
plt.imshow(v2);
plt.figure();
plt.imshow(v2 > 0.05);
plt.show()

【讨论】:

  • 幸运的是你是这个领域的专家,或者如果你好心提醒我使用拉普拉斯算子计算 Python 语言中的平滑度,即 scipy/numpy 库,而不是 MATLAB。或者,如果您有心提供从您的视角和经验评估图像整体平滑度的数学公式?
  • 添加了具体的操作方法,希望对您有所帮助!
  • 你是“救命稻草”!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2022-01-06
  • 2022-10-15
  • 2017-12-14
相关资源
最近更新 更多