【发布时间】:2012-05-03 13:47:37
【问题描述】:
numpy 或 scipy 是否包含与 n 维“梯度”fn 相反的函数?
例如如果“图像”包含一个二维矩阵,那么我想要一个行为如下的函数 inv_gradient:
(gx, gy) = numpy.gradient(image)
constant_vector_0 = image[0,:] - inv_gradient(gx, gy)[0,:]
constant_vector_1 = image[:,0] - inv_gradient(gx, gy)[:,0]
image == inv_gradient(gx, gy) + tile(constant_vector_0,(shape(image)[0],1)) + transpose(tile(constant_vector_1,(shape(image)[1],1)))
【问题讨论】:
-
原图不是唯一的吗?例如,获取任何为您提供这些渐变的图像并为其添加一个常数。在向量微积分中,无论如何您只能对保守向量场真正做到这一点,并且通常在积分中有未确定的函数。一个真实的图像,它绝对不是一个产生保守梯度(想想边缘不连续性)的标量场,可能不支持这种反演过程。
-
我不明白为什么真实的图像不是标量场——你不能把标量场看作是被无限的零网格包围的图像吗?这个梯度应该有零卷曲。我将编辑问题以允许沿每个轴添加一个常量向量。
-
我知道的一种方法是研究重建图像,如果你认为它是谐波的。基本上,您可以根据梯度计算拉普拉斯算子,并且可以在拉普拉斯算子应该为零的假设下求解原始图像的未知数。这绝不是一个简单的优化问题,而且结果通常不好,因为几乎没有真实世界的图像是近似谐波的。可能还有其他识别假设,例如最小化总变异或其他东西,但 SciPy 是否有内置用于这些复杂重建是非常值得怀疑的。
-
真实图像是一个标量场。它只是不是一个连续的标量场,因此它的梯度不是保守的。基本上,具有不同相似边缘结构的无限图像族可以产生相同的梯度。您必须做出额外的假设,例如零拉普拉斯或最小化总变异等,才能从这个无限家族中挑选出一张图像。
-
梯度不是像傅里叶或拉普拉斯那样的变换......所以如果你弄乱了计算的梯度,你已经破坏了在那些编辑点周围的整个区域中与原始图像的对应关系。我的建议是,首先看看您是否可以在傅立叶域中找到与频率相关的伪影并在那里过滤它们,或者可能使用小波。下一个尝试是使用梯度检查来检测它们,然后修改图像。如果伪影很小,您可以删除这些像素,然后使用谐波滤波器进行平滑以匹配周围的图像像素。