module CV.ColourUtils (
balance
, logarithmicCompression
, stretchHistogram
, equalizeHistogram
)
where
import Foreign.C.Types
import Foreign.C.String
import Foreign.ForeignPtr
import Foreign.Ptr
import CV.Image
import CV.Image
import CV.ImageOp
import qualified CV.ImageMath as IM
import CV.ImageMathOp
import System.IO.Unsafe
balance :: (D32, D32) -> Image GrayScale D32 -> Image GrayScale D32
balance (m,md) i = m |+ (scale |* (i |- im) )
where
imd :: D32 = realToFrac $ IM.stdDeviation i
im :: D32 = IM.average i
scale :: D32 = realToFrac $ md/imd
logarithmicCompression :: Image GrayScale D32 -> Image GrayScale D32
logarithmicCompression image = stretchHistogram $ IM.log $ 1 `IM.addS` image
stretchHistogram :: Image GrayScale D32 -> Image GrayScale D32
stretchHistogram image = stretched
where
stretched = (1/realToFrac length) `IM.mulS` normed
normed = image `IM.subS` (realToFrac min)
length = maxmin
(min,max) = IM.findMinMax image
equalizeHistogram :: Image GrayScale D8 -> Image GrayScale D8
equalizeHistogram image = unsafePerformIO $ do
withClone image $ \x ->
withGenImage x $ \i ->
cvEqualizeHist i i
getStretchScaling :: Image GrayScale D32 -> Image GrayScale D32 -> Image GrayScale D32
getStretchScaling reference image = stretched
where
stretched = (1/realToFrac length) `IM.mulS` normed
normed = image `IM.subS` (realToFrac min)
length = maxmin
(min,max) = IM.findMinMax reference
foreign import ccall safe "CV/ColourUtils.chs.h cvEqualizeHist"
cvEqualizeHist :: ((Ptr ()) -> ((Ptr ()) -> (IO ())))