Fred's ImageMagick Scripts


    Copyright © Fred Weinhaus

    My scripts are available free of charge for non-commercial (non-profit) use, ONLY.

    For use of my scripts in commercial (for-profit) environments or non-free applications, please contact me (Fred Weinhaus) for licensing arrangements. My email address is fmw at alink dot net.

    If you: 1) redistribute, 2) incorporate any of these scripts into other free applications or 3) reprogram them in another scripting language, then you must contact me for permission, especially if the result might be used in a commercial or for-profit environment.

    Usage, whether stated or not in the script, is restricted to the above licensing arrangements. It is also subject, in a subordinate manner, to the ImageMagick license, which can be found at:

    Please read the Pointers For Use on my home page to properly install and customize my scripts.


Blurs an image in the frequency domain using an ideal blurring filter for either motion blur or lens defocus.

Download Script

last modified: May 12, 2019

USAGE: camerablur [-t type] [-a amount] [-r rotation] infile outfile
USAGE: camerablur [-h or -help]

-t ... type ........ type of blur; choices are: motion (or m) or
.................... defocus (or d); default=defocus
-a ... amount ...... amount of blur; either length of motion blur or
.................... diameter of defocus; float>0; default=10
-r ... rotation .... rotation angle clockwise from horizontal for the
.................... motion blur; floats; -180<=rotation<=180; default=0

PURPOSE: To apply motion blur or lens defocus to an image using an ideal frequency domain filter.

DESCRIPTION: CAMERABLUR blurs an image in the frequency domain using an ideal frequency domain blurring filter for either motion blur or lens defocus. The motion blur filter in the frequency domain is just an a rotated 1D sinc function depending upon the direction of the motion. The lens defocus filter in the frequency domain is just a jinc function. The user specifies the parameters needed to create those functions directly as images. An explicit filter image is not input to the script. The internally generated filter will then be multiplied by the Fourier transform of the image created with +fft and the results will then be returned to the spatial domain via the inverse Fourier transform using +ift. Any alpha channel on the filter will be removed automatically before processing. If the image has an alpha channel it will not be processed, but simply copied from the input to the output.


-t type ... TYPE of blur. The choices are: motion (or m) and defocus (or d). The default=defocus.

-a amount ... AMOUNT of blur. This is either the length of the motion blur or the diameter of the lens defocus. Values are float>0. The default=10.

-r rotation ... ROTATION angle in degrees specified clockwise from horizontal for the motion blur. Values are floats with -180<=rotation<=180. The default=0.

REQUIREMENTS: IM version 6.5.4-7 or higher, but compiled with HDRI enabled in any quantum level of Q8, Q16 or Q32. Also requires the FFTW delegate library.

LIMITATIONS: This script works well only with even, square images. Otherwise, the FFT will pad them with black to conform. However, there will be excessive ringing due to the color discontinuity associated with the padding. This even, square limitation is a ramification of the current IM implementation that needs addressing at some future time. It is not a limitation of FFTW.

See Fourier Transform with ImageMagick, for more details.

CAVEAT: No guarantee that this script will work on all platforms, nor that trapping of inconsistent parameters is complete and foolproof. Use At Your Own Risk.


Horizontal Motion Blur


Log Enhanced
Sinc Filter

-t motion -a 7 -r 0

Lens Defocus


Log Enhanced
Jinc Filter

-t defocus -a 7

What the script does is as follows:

  • Computes the Fourier transform real and imaginary components
    of the image using +fft
  • Creates a Sinc function image for motion blur or
    a Jinc function image for defocus
  • Performs complex number multiplication using the filter with the real and imaginary components
  • Converts the real and imaginary products back to the spatial domain

This is equivalent to the following IM commands for horizontal motion blur

  • width=`identify -ping -format "%w" $infile`
  • height=`identify -ping -format "%h" $infile`
  • w1=`convert xc: -format "%[fx:($width%2)==0?$width:($width+1)]" info:`
  • h1=`convert xc: -format "%[fx:($height%2)==0?$height:($height+1)]" info:`
  • cx=`convert xc: -format "%[fx:floor(($width+1)/2)]" info:`
  • cy=`convert xc: -format "%[fx:floor(($height+1)/2)]" info:`
  • d1=`convert xc: -format "%[fx:max($w1,$h1)]" info:`
  • fd1=`convert xc: -format "%[fx:$amount*pi/$d1]" info:`
  • sinang=`convert xc: -format "%[fx:sin($rotation*pi/180)]" info:`
  • cosang=`convert xc: -format "%[fx:cos($rotation*pi/180)]" info:`
  • convert -size ${w1}x1 xc: \
    -fx "zz=$fd1*(i-$cx)*$cosang; zz?sin(zz)/(zz):1" \
    -scale ${w1}x${h1}\! $tmpF
  • convert \( $infile -alpha off +fft \) \
    \( -clone 0 $tmpF -compose multiply -composite \) \
    \( -clone 1 $tmpF -compose multiply -composite \) \
    -delete 0,1 +ift -crop ${width}x${height}+0+0 +repage \