对于 X 射线切片,我想创建一个程序来重建切片并执行逆氡变换。第一步是创建图像的正弦图。但是创建一个正弦图需要很长时间。
我有 1500 张图片,每张都有 3.5MB 的 PNG 格式。解压后,它们需要大约 10 GB 的内存,这对我来说很好。
为了创建一个正弦图,必须对齐所有图像的同一行。我正在使用 HIP 和可存储向量来完成这项任务。处理所有图像大约需要 1 分钟,我想知道如何加快这个过程。
我的代码在这里:
{-# LANGUAGE TypeFamilies,
BangPatterns #-}
import System.Directory
import qualified Control.Monad as CM(mapM_, mapM)
import Graphics.Image.IO
import Graphics.Image.ColorSpace
import Graphics.Image.IO.Formats
import Graphics.Image.Interface as GII
import Graphics.Image.Interface.Vector
import Data.Vector.Storable as DVS
import Data.List as DL
type PngFormat = Image VS Y Word16
printList :: Show a => [a] -> IO()
printList list = CM.mapM_ print list
mdisplayImage :: PngFormat -> IO()
mdisplayImage = displayImageUsing eogViewer True
prepend prep app = prep DL.++ app
rowOfImage :: Int -> PngFormat -> DVS.Vector (Pixel Y Word16)
rowOfImage row image =
slice start cols $ toVector image
where
rows = fst $ dims image
cols = snd $ dims image
start = row * cols
main :: IO()
main = do
-- This line fetches the filenames, filtering ("..", and "." as directories)
files <- fmap ((fmap (prepend "raw_data/")) . (DL.take numImages) . (DL.drop 2) . sort) (getDirectoryContents "raw_data/")
images <- CM.mapM (readImageExact' PNG) files :: IO([Image VS Y Word16])
mdisplayImage $ fromVector (numImages, (snd $ dims (DL.head images)))$ DVS.concat $ DL.map (rowOfImage 500) images
where
numImages = 1500
我已经使用 +RTS -s 选项对其进行了概要分析,并且垃圾收集所花费的时间很好。我怎样才能加快速度?
为了安装 HIP 堆栈,需要以下部门
resolver: lts-9.20
extra-deps: [
repa-3.4.1.4,
]