我想使用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 当然,通过更改属性,我可以使其更亮一些,但是明显仍然存在过度的阴影趋势。
有人可以阐明这个问题吗?非常感谢!
答案 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')