content: -- | This module provides QuickCheck generators for images.
  module CV.Arbitrary (smallImage,constImage, noisyImage,smoothImage,blockNoise) where
  
  import Control.Applicative 
  import CV.Image
  import CV.Pixelwise
  import CV.Filters
  import Test.QuickCheck
  import Test.QuickCheck.Gen
  import Control.Monad
  
  newtype ZeroOne = ZO {unZo :: Float}
  instance Arbitrary ZeroOne where
      arbitrary = ZO <$> choose (0,1)
  
  -- | Generate a random small image, that might be constant, noisy or smoothly varying
  --   Range of values is [0,1]
  smallImage :: Gen (Image GrayScale D32)
  smallImage = oneof [constImage, noisyImage,smoothImage]
  
  -- | Generate 10x10 constant image
  constImage :: Gen (Image GrayScale D32)
  constImage = do
                ZO f <- arbitrary
                return $ toImage $ MkP {sizeOf = (10,10), eltOf = const f} 
  
  -- | Generate 10x10 noisy image
  noisyImage :: Gen (Image GrayScale D32)
  noisyImage = do
                f <- arbitrary
                return $ toImage $ MkP {sizeOf = (10,10), eltOf = unZo . f} 
  
  -- | Generate 10x10 smoothly varying image
  smoothImage :: Gen (Image GrayScale D32)
  smoothImage = gaussian (5,5) <$> noisyImage
  
  blockNoise1  = montage (2,2) 0 <$> replicateM 4 smallImage
  
  -- | Generate a (10m x 10m) sized noisy image.
  blockNoise :: Int -> Gen (Image GrayScale D32)
  blockNoise m = montage (m,m) 0 . replicate (m*m) <$> blockNoise1
  
  