From cb685a7b51ed0cce8898179cca4f6a5f26e59f41 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Wed, 7 Sep 2011 19:17:08 -0400 Subject: [PATCH] Modify Main/MRI to operate on the scalar values (as opposed to the individual RGB ones). --- src/MRI.hs | 27 ++++++++++--------- src/Main.hs | 76 ++++++++++++++--------------------------------------- 2 files changed, 34 insertions(+), 69 deletions(-) diff --git a/src/MRI.hs b/src/MRI.hs index 9f97b08..040dcc2 100644 --- a/src/MRI.hs +++ b/src/MRI.hs @@ -1,5 +1,3 @@ -{-# LANGUAGE ScopedTypeVariables #-} - module MRI where @@ -9,6 +7,7 @@ import Data.Array.Repa as R import Data.Array.Repa.IO.Binary as R import Data.Array.Repa.IO.ColorRamp as R +import Values mri_depth :: Int mri_depth = 109 @@ -20,7 +19,7 @@ mri_height :: Int mri_height = 256 mri_shape :: DIM3 -mri_shape = (Z :. mri_depth :. mri_width :. mri_height) +mri_shape = (Z :. mri_depth :. mri_height :. mri_width) mri_lower_threshold :: Int mri_lower_threshold = 1400 @@ -28,6 +27,8 @@ mri_lower_threshold = 1400 mri_upper_threshold :: Int mri_upper_threshold = 2500 +mri_slice3d :: DIM3 +mri_slice3d = (Z :. 1 :. mri_height :. mri_width) type RawData sh = Array sh Word16 type RawData3D = RawData DIM3 @@ -39,9 +40,9 @@ rgb_to_dbl :: RGB -> (Double, Double, Double) rgb_to_dbl (x,y,z) = (fromIntegral x, fromIntegral y, fromIntegral z) -read_word16s :: IO RawData3D -read_word16s = do - arr <- R.readArrayFromStorableFile "../data/mri.bin" mri_shape +read_word16s :: FilePath -> IO RawData3D +read_word16s path = do + arr <- R.readArrayFromStorableFile path mri_shape arr `deepSeqArray` return () return arr @@ -77,14 +78,12 @@ flip_x arr = R.traverse arr id (\get (Z :. z :. y :. x) -> get (Z :. z :. y :. (mri_width - 1) - x)) write_word16s :: (Shape sh) => FilePath -> (RawData sh) -> IO () -write_word16s = - -- dump the slice back as word16 - R.writeArrayToStorableFile +write_word16s = R.writeArrayToStorableFile -raw_data_to_color :: (Shape sh) => (RawData sh) -> (ColorData sh) -raw_data_to_color arr = - R.force $ R.map (truncate_rgb . ramp_it . fromIntegral) arr +values_to_colors :: (Shape sh) => (Values sh) -> (ColorData sh) +values_to_colors arr = + R.force $ R.map (truncate_rgb . ramp_it) arr where ramp_it :: Double -> (Double, Double, Double) ramp_it x = @@ -125,3 +124,7 @@ blue_dbl_data = get_b (_, _, b) = b + +z_slice :: Elt a => Int -> Array DIM3 a -> Array DIM2 a +z_slice n arr = + slice arr (Any :. n :. All :. All) diff --git a/src/Main.hs b/src/Main.hs index c9165d3..f21856f 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,73 +1,35 @@ module Main where -import Data.Array.Repa ( - DIM2, - DIM3, - Z(..), - (:.)(..), - slice, - reshape, - Any(..), - All(..) - ) -import qualified Data.Array.Repa as R (map) - -import Data.Array.Repa.IO.BMP (writeComponentsToBMP) -import Data.Word +import qualified Data.Array.Repa as R (map, reshape) +import qualified Data.Array.Repa.IO.BMP as R (writeComponentsToBMP) import System.Environment (getArgs) import Grid (make_grid, zoom) import MRI -import Values (read_values_3d, write_values_1d) +import Values (drop_z, zoom_shape) -mri_shape2d :: DIM2 -mri_shape2d = (Z :. 256*2 :. 256*2) +zoom_factor :: (Int, Int, Int) +zoom_factor = (1,2,2) -mri_shape3d :: DIM3 -mri_shape3d = (Z :. 256 :. 256 :. 1) main :: IO () main = do -- args <- getArgs -- let color = head args --- let in_file = "./data/MRbrain.40." ++ color - let out_file = "MRbrain.50.red.out" - arr <- read_word16s + let in_file = "./data/mri.bin" + let out_file = "output.bmp" + arr <- read_word16s in_file let arrBrack = bracket_array arr let arrInv = flip_x $ flip_y arrBrack - let arrSlice = slice arrInv (Any :. (50 :: Int) :. All :. All) - let arrColor = raw_data_to_color arrSlice - - let arrColor' = reshape mri_shape3d arrColor - let rdata = red_dbl_data arrColor' - let gdata = green_dbl_data arrColor' - let bdata = blue_dbl_data arrColor' - --- mridata <- read_values_3d mri_shape in_file - - let gr = make_grid 1 rdata - let routput = zoom gr (2,2,1) - - let gg = make_grid 1 gdata - let goutput = zoom gg (2,2,1) - - let gb = make_grid 1 bdata - let boutput = zoom gb (2,2,1) - - let routput' = R.map double_to_word8 (reshape mri_shape2d routput) - let goutput' = R.map double_to_word8 (reshape mri_shape2d goutput) - let boutput' = R.map double_to_word8 (reshape mri_shape2d boutput) - --- write_values_1d output out_file - writeComponentsToBMP out_file routput' goutput' boutput' - where - double_to_word8 :: Double -> Word8 - double_to_word8 x = - if x > 255 then - 255 :: Word8 - else - if x < 0 then - 0 :: Word8 - else - fromIntegral $ truncate x + let arrSlice = z_slice 50 arrInv + let arrSlice' = R.reshape mri_slice3d arrSlice + let dbl_data = R.map fromIntegral arrSlice' + let g = make_grid 1 dbl_data + let output = zoom g zoom_factor + let mri_slice2d = drop_z $ zoom_shape zoom_factor mri_slice3d + let colors = values_to_colors $ R.reshape mri_slice2d output + let routput = R.map (\(red, _, _) -> red) colors + let goutput = R.map (\(_, green, _) -> green) colors + let boutput = R.map (\(_, _, blue) -> blue) colors + R.writeComponentsToBMP out_file routput goutput boutput -- 2.43.2