【发布时间】:2014-08-31 13:18:23
【问题描述】:
有几种方法可以评估图像的亮度、饱和度、色调、强度、对比度等。我们经常听说平滑或锐化图像的操作。由此,必须存在一种评估图像整体平滑度的方法,以及一种在可能基于小波的公式中计算该值的精确方法。或者幸运的是,任何人甚至可以提供 MATLAB 函数或它们的组合来直接计算这个值。
提前致谢!
【问题讨论】:
-
有趣的问题。您是否知道您打算测量的“平滑程度”的具体定义是什么?
有几种方法可以评估图像的亮度、饱和度、色调、强度、对比度等。我们经常听说平滑或锐化图像的操作。由此,必须存在一种评估图像整体平滑度的方法,以及一种在可能基于小波的公式中计算该值的精确方法。或者幸运的是,任何人甚至可以提供 MATLAB 函数或它们的组合来直接计算这个值。
提前致谢!
【问题讨论】:
平滑度是一个模糊的术语。一个应用程序认为顺利的事情可能对另一个应用程序来说并不顺利。
在常见情况下,平滑度是颜色渐变的函数。在 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()
【讨论】: