问题
I am trying to write a function that returns a one dimentional gauss filter. the function took sigma as a parameter. The problem is that the function returns the same array for all sigmas.
function gaussFilter=gauss(sigma)
width = 3 * sigma;
support = (-width :sigma: width);
gaussFilter= exp( - (support).^2 / (2*sigma^2));
gaussFilter = gaussFilter/ sum(gaussFilter);
Note that support array is calculated correctly but the problem arise when applying the exp.
回答1:
The idea is that the filter needs to be wide enough to represent the Gaussian function. The rule of thumb is to use filter size of at least 6*sigma
.
Since the support needs to be centered around zero, that would give you the range of -3*sigma
to +3*sigma
(to be more accurate, it is -/+ round(6*sigma - 1)/2
to account for the zero in the middle). Hence:
function gaussFilter = gauss(sigma)
width = round((6*sigma - 1)/2);
support = (-width:width);
gaussFilter = exp( -(support).^2 ./ (2*sigma^2) );
gaussFilter = gaussFilter/ sum(gaussFilter);
Example: (all the following are equivalent)
sigma = 1.2;
width = round((6*sigma - 1)/2);
gauss(sigma)
normpdf( -width:width, 0, sigma )
fspecial('gaussian', [1 2*width+1], sigma)
h = gausswin(2*width+1)';
h = h / sum(h)
回答2:
There is nothing wrong with the results. Your support
vector is essentially,
[-3*sigma -2*sigma -1*sigma 0 1*sigma 2*sigma 3*sigma]
And if you square each element of support and multiply by -1, -support.^2
[-9*sigma^2 -4*sigma^2 -1*sigma^2 0 -1*sigma^2 -4*sigma^2 -9*sigma^2]
So dividing it by 2*sigma^2
will always result in the same vector,
[-9/2 -4/2 -1/2 0 -1/2 -4/2 -9/2]
Or
-4.5000 -2.0000 -0.5000 0 -0.5000 -2.0000 -4.5000
So that's why you always get the same answer.
So you need to check your algorithm for making a one-dimensional gaussian filter.
EDIT:
Your original code is fine: except I don't understand why you've made support
with -3*sigma:sigma:3*sigma
- you should change it to support = -3:3
.
You can also use:
gaussFilter = fspecial('gaussian',[1 7],sigma)
EDIT: Check out Amro's solution for the full code and explanation why support = -3*sigma:3*sigma
and not support = -3*sigma:sigma:3*sigma
来源:https://stackoverflow.com/questions/1833082/one-dimensional-gauss-convolution-function-in-matlab