module Graphics.Image.Processing.Complex (
(!+!), realPartI, imagPartI,
mkPolarI, cisI, polarI, magnitudeI, phaseI,
conjugateI,
makeFilter, applyFilter,
fft, ifft
) where
import Prelude hiding (map, zipWith)
import Graphics.Image.Interface
import Graphics.Image.ColorSpace.Complex
import Graphics.Image.Processing.Complex.Fourier
infix 6 !+!
(!+!) :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e)) =>
Image arr cs e -> Image arr cs e -> Image arr cs (Complex e)
(!+!) = zipWith (+:)
realPartI :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e), RealFloat e) =>
Image arr cs (Complex e) -> Image arr cs e
realPartI = map realPart
imagPartI :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e), RealFloat e) =>
Image arr cs (Complex e) -> Image arr cs e
imagPartI = map imagPart
mkPolarI :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e), RealFloat e) =>
Image arr cs e -> Image arr cs e -> Image arr cs (Complex e)
mkPolarI = zipWith mkPolar
cisI :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e), RealFloat e) =>
Image arr cs e -> Image arr cs (Complex e)
cisI = map cis
polarI :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e), RealFloat e) =>
Image arr cs (Complex e) -> (Image arr cs e, Image arr cs e)
polarI !zImg = (magnitudeI zImg, phaseI zImg)
magnitudeI :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e), RealFloat e) =>
Image arr cs (Complex e) -> Image arr cs e
magnitudeI = map magnitude
phaseI :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e), RealFloat e) =>
Image arr cs (Complex e) -> Image arr cs e
phaseI = map phase
conjugateI :: (Applicative (Pixel cs), Array arr cs (Complex e), RealFloat e) =>
Image arr cs (Complex e) -> Image arr cs (Complex e)
conjugateI = map conjugate
makeFilter :: (Array arr cs e, RealFloat e) =>
(Int, Int)
-> ((Int, Int) -> Pixel cs e) -> Image arr cs e
makeFilter !(m, n) !getPx
| isPowerOfTwo m && isPowerOfTwo n = makeImage (m, n) getPx'
| otherwise = error " "
where getPx' (i, j) = getPx (if i < (m `div` 2) then i else i m,
if j < (n `div` 2) then j else j n)
applyFilter :: (Applicative (Pixel cs), Array arr cs e, Array arr cs (Complex e),
Fractional (Pixel cs (Complex e)), Floating (Pixel cs e), RealFloat e) =>
Image arr cs e
-> Image arr cs e
-> Image arr cs e
applyFilter img filt = realPartI . ifft $ (fft (img !+! 0) * (filt !+! filt))