gpt4 book ai didi

python - 如何在python中获得高斯滤波器

转载 作者:IT老高 更新时间:2023-10-28 20:51:12 31 4
gpt4 key购买 nike

我正在使用 python 创建一个大小为 5x5 的高斯滤波器。我看到这个帖子here他们在哪里谈论类似的事情,但我没有找到获得与 matlab 函数等效的 python 代码的确切方法 fspecial('gaussian', f_wid, sigma)还有其他方法吗?我尝试使用以下代码:

size = 2
sizey = None
size = int(size)
if not sizey:
sizey = size
else:
sizey = int(sizey)
x, y = scipy.mgrid[-size: size + 1, -sizey: sizey + 1]
g = scipy.exp(- (x ** 2/float(size) + y ** 2 / float(sizey)))
print g / np.sqrt(2 * np.pi)

得到的输出是

[[ 0.00730688  0.03274718  0.05399097  0.03274718  0.00730688]
[ 0.03274718 0.14676266 0.24197072 0.14676266 0.03274718]
[ 0.05399097 0.24197072 0.39894228 0.24197072 0.05399097]
[ 0.03274718 0.14676266 0.24197072 0.14676266 0.03274718]
[ 0.00730688 0.03274718 0.05399097 0.03274718 0.00730688]]

我想要的是这样的:

   0.0029690   0.0133062   0.0219382   0.0133062   0.0029690
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.0219382 0.0983203 0.1621028 0.0983203 0.0219382
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.0029690 0.0133062 0.0219382 0.0133062 0.0029690

最佳答案

一般而言,如果您真的很想获得与 MATLAB 完全相同的结果,实现这一目标的最简单方法通常是直接查看 MATLAB 函数的源代码。

在这种情况下,edit fspecial:

...
case 'gaussian' % Gaussian filter

siz = (p2-1)/2;
std = p3;

[x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
arg = -(x.*x + y.*y)/(2*std*std);

h = exp(arg);
h(h<eps*max(h(:))) = 0;

sumh = sum(h(:));
if sumh ~= 0,
h = h/sumh;
end;
...

很简单,嗯?将其移植到 Python 只需 <10 分钟:

import numpy as np

def matlab_style_gauss2D(shape=(3,3),sigma=0.5):
"""
2D gaussian mask - should give the same result as MATLAB's
fspecial('gaussian',[shape],[sigma])
"""
m,n = [(ss-1.)/2. for ss in shape]
y,x = np.ogrid[-m:m+1,-n:n+1]
h = np.exp( -(x*x + y*y) / (2.*sigma*sigma) )
h[ h < np.finfo(h.dtype).eps*h.max() ] = 0
sumh = h.sum()
if sumh != 0:
h /= sumh
return h

这给了我与 fspecial 在舍入误差内相同的答案:

 >> fspecial('gaussian',5,1)

0.002969 0.013306 0.021938 0.013306 0.002969
0.013306 0.059634 0.09832 0.059634 0.013306
0.021938 0.09832 0.1621 0.09832 0.021938
0.013306 0.059634 0.09832 0.059634 0.013306
0.002969 0.013306 0.021938 0.013306 0.002969

: matlab_style_gauss2D((5,5),1)

array([[ 0.002969, 0.013306, 0.021938, 0.013306, 0.002969],
[ 0.013306, 0.059634, 0.09832 , 0.059634, 0.013306],
[ 0.021938, 0.09832 , 0.162103, 0.09832 , 0.021938],
[ 0.013306, 0.059634, 0.09832 , 0.059634, 0.013306],
[ 0.002969, 0.013306, 0.021938, 0.013306, 0.002969]])

关于python - 如何在python中获得高斯滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17190649/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com