有几种方法可以评估图像,亮度,饱和度,色调,强度,对比度等。我们总是听说平滑或锐化图像的操作。由此,必须有一种方法来评估图像的整体平滑度,以及在一个可能基于小波的公式中找出该值的确切方法。或者幸运的是,任何人都可以提供MATLAB函数或它们的组合来直接计算这个值。
提前致谢!
答案 0 :(得分:1)
平滑是一个模糊的术语。对于一个应用程序来说,平滑的东西可能不会被视为另一个应用程序的平滑。
在常见情况下,平滑度是颜色渐变的函数。在3个颜色通道上采用2d梯度,然后在3个通道上获取它们的幅度sqrt(dx ^ 2 + dy ^ 2)和平均值,总和或某些函数。这可以为您提供局部平滑度,然后您可以对图像求和/平均/最小平方。
然而,在更常见的情况下,颜色的线性变化也是平滑的(想想2个颜色渐变,或者光如何从物体反射)。为此,第二个差异可能更合适。拉普拉斯就是这么做的。
我很幸运使用laplacian运算符来计算Python中使用scipy / numpy库的平滑度。 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,因为值可以是正数或负数,我们不希望它们在求平均值时均匀。我将其转换为float并除以255,使其值介于0.0和1.0之间,而不是0到256,因为它更容易使用。
如果你想看到拉普拉斯发现的东西,你可以使用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()