[SciPy-User] Matlab imfilter/fspecial equivalent

Brickle Macho bricklemacho at gmail.com
Thu May 16 20:23:54 EDT 2013


I am getting closer.  Here are some observations:

* If I don't imresize() the original image, then visually I can't tell 
the difference in the output image from Matlab or Scipy.
* Empirically the results using different kernels are the same. That is 
the difference between two images is essentially zero. That is doesn't 
seem to matter if I use the imported the "fspecial()" kernel from 
matlab;  generate my own kernel using a fgaussion(), or use 
scipy.ndimage.gaussian_filter().

So look like the problem is with ndimage.resize().

Michael.
--





On 16/05/13 1:25 PM, Travis Oliphant wrote:
> I accidentally hit send before I finished the original email (Gmail 
> interface quirk strikes again...)  I'll including the entire original 
> email....
>
> Hi Michael,
>
> Thanks for sharing your code and example.     The imfilter command is 
> equivalent to scipy.signal.correlate and scipy.ndimage.correlate (the 
> one in scipy.ndimage is faster I believe).   These implement simple 
> correlation-based filtering given a finite kernel.
>
> To get the same output you would need to generate the same kind of 
> kernel in Python as the Matlab fspecial command is producing.  one 
> approach to get you started and to help separate the problem into 2 
> stages (reproducing the imfilter and reproducing the fspecial filter) 
> is to  export the results of the Matlab fspecial command and use that 
> kernel in Python code (save it as a .mat file and read that .mat file 
> with Python).
>
> SciPy does not have the equivalent to the fspecial command but you can 
> generate all kinds of 1-d special filters with 
> scipy.signal.get_window.   You can also "generate" the filters you 
> need directly from code.
>
> Here is some untested code for generating something close to what 
> fspecial('gaussian", [10,10], 2.5) would be producing
>
> import numpy as np
>
> def fgaussian(size, sigma):
>    m,n = size
>      h, k = m//2, n//2
>    x, y = np.mgrid[-h:h, -k:k]
>    return np.exp(-(x**2 + y**2)/(2*sigma**2))
>
> Up to a scaling constant (and possibly shifted a bit) this should 
> return a similar filter to fspecial('gaussian', size, sigma).
>
> I'm not completely sure if the ndimage.gaussian_filter does a 
> finite-window convolution like imfilter (and correlate) or if it does 
> something else.
>
> The uniform filter is the same as an averaging filter (up to a scaling 
> constant).  To other approach is to just use scipy.ndimage.correlate 
> with np.ones(size) / np.product(size)  where size is the size of the 
> kernel.
>
> Perhaps you would be willing to post your code when you get it to work.
>
> Best,
>
> -Travis
>
>
>
>
> On Wed, May 15, 2013 at 9:19 PM, Brickle Macho <bricklemacho at gmail.com 
> <mailto:bricklemacho at gmail.com>> wrote:
>
>     I am porting some Matlab code to python.  When I run the ported
>     version the output differs.   It appears the difference may be due
>     to how I have translated Matlab's imfilter() and/or fspecial().
>     Below are my translation, are there any Scipy/Matlab gurus that
>     can let me know if there are correct or if I have made some
>     errors, or could suggest better translations.
>
>     Matlab:  imfilter(saliencyMap, fspecial('gaussian', [10, 10], 2.5))
>     Scipy:  ndimage.gaussian_filter(saliencyMap, sigma=2.5)
>
>     Also the following.  At the rsik of highlighting my lack of
>     understanding of the temrinology, Is uniform_filter the same as
>     'average'?
>
>     Matlab:  imfilter(myLogAmplitude, fspecial('average', 3),
>     'replicate');
>     Scipy: scipy.ndimage.uniform_filter(mylogAmplitude, size=3,
>     mode="nearest")
>
>
>     Thanks,
>
>     Michael.
>     --
>
>
>     If curious here are the 8 lines of matlab code I am trying to port:
>
>     %% Read image from file
>     inImg = im2double(rgb2gray(imread('yourImage.jpg')));
>     inImg = imresize(inImg, 64/size(inImg, 2));
>
>     %% Spectral Residual
>     myFFT = fft2(inImg);
>     myLogAmplitude = log(abs(myFFT));
>     myPhase = angle(myFFT);
>     mySpectralResidual = myLogAmplitude - imfilter(myLogAmplitude,
>     fspecial('average', 3), 'replicate');
>     saliencyMap = abs(ifft2(exp(mySpectralResidual + i*myPhase))).^2;
>
>     %% After Effect
>     saliencyMap = mat2gray(imfilter(saliencyMap, fspecial('gaussian',
>     [10, 10], 2.5)));
>     imshow(saliencyMap);
>
>
>
>
>
>
>     _______________________________________________
>     SciPy-User mailing list
>     SciPy-User at scipy.org <mailto:SciPy-User at scipy.org>
>     http://mail.scipy.org/mailman/listinfo/scipy-user
>
>
>
>
> -- 
> ---
> Travis Oliphant
> Continuum Analytics, Inc.
> http://www.continuum.io

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20130517/2ffb4b6e/attachment.html>


More information about the SciPy-User mailing list