packages feed

CV-0.3.4: examples/StupidConv.hs

{-#LANGUAGE BangPatterns#-}
import CV.Image
import CV.ColourUtils
import Control.Monad
import qualified CV.ImageMath as IM

{-#INLINE (×)#-}
a × b = [(a',b') | a' <- a , b' <- b]

stupidConv im m = do
    res <- create (w-mw,h-mh)
    forM_ ([0..w-1-mw] × [0..h-1-mh]) $ \(x,y) -> 
     setPixel (x,y) (sum [getPixel (x+i,y+j) im * getPixel (i,j) m 
                         | (i,j) <- [0..mw-1] × [0..mh-1]]) res
    return res
 where 
    maskSize = IM.sum m
    (!mw,!mh)  = getSize m
    (!w,!h)    = getSize im

main = do
    Just x <- loadImage "smallLena.jpg"
    m <- fromList (3,3) [-1,0,1
                        ,-1,0,1
                        ,-1,0,1] 
    print (IM.sum x)
    r <- stupidConv x m
    print (IM.sum r)
    saveImage "stupid.png" $ stretchHistogram r


fromList (w,h) xs = do
     i <- create (w,h)
     forM_ (zip ([0..w-1] × [0..h-1]) xs) $ \(p,v) -> setPixel p v i 
     return i