rpg*_*rpg 15 arrays haskell multicore image-processing
我正在玩haskell,从简单的绘图程序开始弄湿我的脚.我需要一个库,让我将2D数组/矢量保存到图像文件中.我不想写一份颜色列表.我想使用用于数组/矢量计算的容器,并且可以(好吧,几乎)自动并行化.
编辑存储彩色图像的能力是必须的.
我从PGM库开始.这是一种非常简单的无压缩灰度图格式.几乎没有附加依赖.您可以使用ImageMagick或其他工具将PGM转换为其他格式.
PGM支持通用IArray
接口,并且应该与大多数标准Haskell阵列一起使用.您可以轻松地并行化阵列计算Control.Parallel.Strategies
.
PGM用法示例:
ghci> :m + Data.Array Graphics.Pgm
ghci> let a = accumArray (+) 0 ((0::Int,0::Int),(127,127)) [ ((i,i), 1.0::Double) | i <- [0..127] ]
ghci> arrayToFile "t.pgm" (fmap round a)
Run Code Online (Sandbox Code Playgroud)
这是图像:
否则,您可以使用Codec-Image-DevIL,它可以将未装箱的阵列保存为许多图像格式.你也需要DevIL库.并且您需要将所有数组转换为它们的特定类型(UArray (Int, Int, Int) Word8
).
最后,如果你想要前沿,你可以考虑repa
并行数组和相应的repa-io
库,它们可以将它们写入BMP图像.不幸的是,今天repa
还没有新的GHC 7.0.2可以构建,并且在旧的GHC 6.12上没有性能优势.
一个新的组合是:
Repa是唯一广泛使用的自动并行化的数组库.
一个例子,来自修复教程,使用readImage
和writeImage
读取图像,旋转它,并以任何格式将其写回:
import System.Environment
import Data.Word
import Data.Array.Repa hiding ((++))
import Data.Array.Repa.IO.DevIL
main = do
[f] <- getArgs
runIL $ do
v <- readImage f
writeImage ("flip-"++f) (rot180 v)
rot180 :: Array DIM3 Word8 -> Array DIM3 Word8
rot180 g = backpermute e flop g
where
e@(Z :. x :. y :. _) = extent g
flop (Z :. i :. j :. k) =
(Z :. x - i - 1 :. y - j - 1 :. k)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2389 次 |
最近记录: |