Fred's ImageMagick Scripts



 

 

CAMERABLUR


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

Download Script

last modified: August 22, 2009



USAGE: camerablur [-t type] [-a amount] [-r rotation] [-m method] 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
-m ... method ...... computation method for computing defocus filter;
.................... choices are slow (or s) or fast (or f); the slow
.................... method will be more precise; default=fast

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

DESCRIPTION: CAMERABLUR applies motion blur or lens defocus to an image using an ideal frequency domain filter. 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. Then it will 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.

ARGUMENTS:

-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.

-m method ... METHOD for computing the defocus filter. The choices are: slow (or s) or fast (or f). The slow method will be more precise. The default=fast.

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.

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.


EXAMPLES


Horizontal Motion Blur

Input

Log Enhanced
Internally
Generated
Sinc Filter

Arguments:
-t motion -a 7 -r 0



Lens Defocus

Input

Log Enhanced
Internally
Generated
Jinc Filter

Arguments:
-t defocus -a 7 -m fast



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 \
    $outfile