5

多数のプログラミング例を試すことで、Haskell repa ライブラリを調査しています。repa を使用して一般的な画像処理アルゴリズムを実装することを目指しています。

レパの例

repa リポジトリには、役立つコード例がいくつかあります。これらはすべてArray U DIM2 aorArray DIM2 Floatまたはタイプの画像を操作しますArray U DIM2 Double

-- three image types used below
type Image = Array U DIM2 Double
type Image = Array DIM2 Float
type Image = Array U DIM2 (Word8, Word8, Word8)

-- examples/Blur/src-repa/Main.hs
blur :: Monad m => Int -> Array U DIM2 Double -> m (Array U DIM2 Double)

-- examples/Laplace/src-repa/SolverStencil.hs
solveLaplace :: Monad m => Int -> Array U DIM2 Double -> Array U DIM2 Double -> Array U DIM2 Double -> m (Array U DIM2 Double)

-- examples/Sobel/src-repa/SolverSeparated.hs
type Image = Array DIM2 Float
gradientX_sep :: Image -> Image
gradientX1    :: Image -> Image
gradientX2    :: Image -> Image
gradientY_sep :: Image -> Image
gradientY2    :: Image -> Image

-- examples/Canny/src-repa/Main.hs
type Image a = Array U DIM2 a
toGreyScale  :: Image (Word8, Word8, Word8) -> IO (Image Float)
blurSepX     :: Image Float -> IO (Image Float)
blurSepY     :: Image Float -> IO (Image Float)
gradientX    :: Image Float -> IO (Image Float)
gradientY    :: Image Float -> IO (Image Float)
suppress     :: Float -> Float -> Image (Float, Word8) -> IO (Image Word8)
wildfire     :: Image Word8 -> Array U DIM1 Int -> IO (Image Word8)
selectStrong :: Image Word8 -> IO (Array U DIM1 Int)
gradientMagOrient :: Float -> Image Float -> Image Float -> IO (Image (Float, Word8))

画像ファイル IO

イメージ ファイル IO には 2 つのオプションがあります。

  1. PNG、BMP、JPG、TIF をサポートするrepa-devilパッケージ。残念ながら、これらは上記の repa の例に準拠しない配列型に解析されます。これは、repa-devil メンテナーがここで確認しています。
  2. repa-ioパッケージは、 repa-examplesの画像の配列型パラメーターにより厳密に対応しますが、BMP ファイルのみをサポートします。

repa-devil (repa-examples とは互換性がありません)

repa-examples パッケージの画像のタイプArray F DIM3 Word8は 、またはArray F DIM2 Word8グレースケール画像の場合です。これは、repa-examples のイメージは 2 次元配列であり、repa-devil のイメージは 3 次元配列であるため、repa-devil を使用して repa-examples の例で処理するイメージを読み取ることができないことを意味します。

readImage :: FilePath -> IL Image
writeImage :: FilePath -> Image -> IL ()
data Image = RGBA (Array F DIM3 Word8)
           | RGB  (Array F DIM3 Word8)
           | BGRA (Array F DIM3 Word8)
           | BGR  (Array F DIM3 Word8)
           | Grey (Array F DIM2 Word8)

repa-io (repa-examples との互換性あり)

repa-examples と repa-io の間には、より密接な対応があります。

readImageFromBMP :: FilePath -> IO (Either Error (Array U DIM2 (Word8,Word8, Word8)))
writeImageToBMP  :: FilePath -> Array U DIM2 (Word8, Word8, Word8) -> IO ()

今回は、BMP 画像ファイルは(Word8,Word8,Word8)、おそらく R、G、および B の値を表すために、タイプ の要素を持つ 2 次元配列に解析されています。それでも、repa-examples パッケージの唯一の互換性のある関数はtoGreyScale上記のものです。他のすべての関数は、Array U DIM2 FloatorArray DIM2 Floatまたは型の値を操作しますArray U DIM2 Double

質問

  1. を除いてtoGreyScale、repa-examples のすべての例はグレースケール画像での使用にのみ適していますか? これは型を見ると理にかなっていますが、カラー画像のレパの例がないことは驚くべきことです。たとえば、blurnot の型が代わりにある理由は次のとおりです。 blur :: Monad m => Int -> Array U DIM2 (Word8, Word8, Word8) -> m (Array U DIM2 (Word8, Word8, Word8))
  2. float が でキャプチャする値はArray U DIM2 Float? 0 から 255 までのグレースケール値ですか?
  3. repa-io パッケージに JPG/PNG/TIF IO サポートを追加する作業はありましたか?
4

2 に答える 2

2

たとえば、blur の型が代わりにないのはなぜですか。blur :: Monad m => Int -> Array U DIM2 (Word8, Word8, Word8) -> m (Array U DIM2 (Word8, Word8, Word8))

  1. 単純な数値の代わりにタプルを使用した恒久的な作業は定型文です。fixed-vector

  2. 結果のコードは再利用できません

  3. カラー チャネルによる計算を並列化することはできません

yarrRGB 画像処理用に特別に設計された をご覧ください。たとえば、blur :: (Num v) => Array Dim2 v -> Array Dim2 v(おおよそのシグネチャ) を定義し、それをグレースケール イメージまたは色に適用できます。

let blurred = fromSlices $ map blur $ slices image

https://github.com/leventov/yarr/blob/master/tests/blur.hsを参照してください

于 2014-01-13T21:33:21.207 に答える