scipy_filters python中的高斯过滤器错误

时间:2018-11-03 13:12:14

标签: python numpy image-processing scipy

我想使用python2在浮点numpy数组上应用高斯滤波器。 实际上,我正在尝试用python重写代码Retrospective Correction using Homomorphic Filtering,  data.drop_duplicates(subset ="TxHash", inplace=True) print (data)

其中LPF(f(x,y))是f(x,y)的低通滤波器,C是归一化系数。

这是我的代码,它将在以下行崩溃:LPFF = scipy_filters.gaussian_filter1d(logF,sigma = 10)

g(x,y) = exp(LPF(log(f(x,y)))) . C

我尝试调试时去

fxy = greyscale_matrix
logF = np.log1p(fxy)
print logF
LPFF = scipy_filters.gaussian_filter1d(logF, sigma=10)
print LPFF
expF = np.expm1(LPFF)
tmp_div = fxy / expF
meanF_down = np.mean(tmp_div)
meanF_top = np.mean(fxy)
C = meanF_top / meanF_down
gx_matrix = expF * C
rtn_matrix = greyscale_matrix - gx_matrix

Image.fromarray(gx_matrix).show()
Image.fromarray(rtn_matrix).show()

来自_nd_image.py,代码似乎完全崩溃。 我还找到了一个Implementation of homomorphic filter made in Python做此工作的github,但是它出了点问题。

来源img: sourceimg

使用它可能会给我带来类似以下内容的经过过滤的img:filtered img 当然,通过更改属性,我可以使其更亮一些,但是明显仍然存在过度的阴影趋势。

有人可以阐明这个问题吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

您没有说您正在使用哪个版本的SciPy,但我怀疑您遇到的bug应该已经在SciPy 1.0.1(和1.1.0)版本中修复。当高斯滤波器函数的输入的数据类型为numpy.float16时,该错误会导致解释器崩溃。如果您的输入矩阵fxy的类型为numpy.uint8(通常用于图像),则numpy.log1p(fxy)返回数据类型为numpy.float16的数组,例如:

In [29]: fxy = np.array([[0, 10], [128, 255]], dtype=np.uint8)

In [30]: logF = np.log1p(fxy)

In [31]: logF
Out[31]: 
array([[0.   , 2.398],
       [4.86 , 5.547]], dtype=float16)

logF的类型为numpy.float16,当您将其传递给gaussian_filter1d时会发生崩溃。

一种快速解决方案是将fxy转换为例如64位浮点,然后再将其传递给np.log1p

In [34]: logF = np.log1p(fxy.astype(np.float64))

In [35]: logF.dtype
Out[35]: dtype('float64')