2016-10-03 19 views
1

画像PixelRGB8を取り込んで行列に変換しようとしましたが、行列上の畳み込みを行いました。最初の試行では、それを行列に変換し、行列を画像に戻したいと思っています。Haskell、画像を行列に変換する

私はこのエラーが表示されます。

• No instance for (Element Word8) 
     arising from a use of ‘matrixToImg’ 
    • In the expression: matrixToImg $ imgToMatrix img 
     In an equation for ‘convImg’: 
      convImg img = matrixToImg $ imgToMatrix img 
Failed, modules loaded: none. 

それが何を意味するのでしょうか?

これはコードです。

import Codec.Picture 
import Data.Matrix 
import Data.Vector 
import Data.Vector.Storable 

import Debug.Trace 
import GHC.Word 

import Numeric.LinearAlgebra.Data 
import Numeric.LinearAlgebra 
convImg ::Image PixelRGB8 -> Image PixelRGB8 
convImg img = matrixToImg $ imgToMatrix img 

imgToMatrix ::Image PixelRGB8->Numeric.LinearAlgebra.Matrix Word8 
imgToMatrix Image { imageWidth = w, imageHeight = h, imageData = vec } = ((3*w)><h) (Data.Vector.Storable.toList vec) 

matrixToImg::Numeric.LinearAlgebra.Matrix Word8-> Image PixelRGB8 
matrixToImg matrix = Image (rows matrix `quot` 3) (cols matrix) (vectorToStorableVector (Numeric.LinearAlgebra.Data.flatten(matrix))) 
    where vectorToStorableVector vec= Data.Vector.Storable.fromList $ Numeric.LinearAlgebra.Data.toList vec 

ありがとうございます。

+0

エラーを再現するコードを正確に記入してください。 – leftaroundabout

+0

私はインポートを追加しました。このコードはエラーを再現します – Alon

+2

'Element'インスタンスを持つタイプは' Float''Double''、 'Complex Float'、' Complex Double'です。つまり、Word8でこれを行うことはできません。たとえば私は代わりにFloatを入れました。これはきれいにコンパイルします。http://sprunge.us/WTIK – Michael

答えて

1

hmatrixは、Elementのインスタンス数が限定されており、Word8はその1つではありません。それが使用する簡単なIntegralタイプはtype Z = Int64です。 Matrix Int64が覚えていることを覚えておけば、道徳的にはWord8です。以下のような変換が可能です。 (あなたが書き込んだものと同じですが、数字はfromIntegralです)

import Codec.Picture 
import Data.Vector 
import Data.Vector.Storable 

import Debug.Trace 
import GHC.Word 

import Numeric.LinearAlgebra.Data 
import Numeric.LinearAlgebra 

convImg ::Image PixelRGB8 -> Image PixelRGB8 
convImg img = matrixToImg $ imgToMatrix img 

imgToMatrix ::Image PixelRGB8 -> Numeric.LinearAlgebra.Matrix Z 
imgToMatrix Image { imageWidth = w, imageHeight = h, imageData = vec } = ((3*w)><h) (Data.Vector.Storable.toList $ (Data.Vector.Storable.map fromIntegral) (vec)) 

matrixToImg::Numeric.LinearAlgebra.Matrix Z -> Image PixelRGB8 
matrixToImg matrix = Image (rows matrix `quot` 3) (cols matrix) (vectorToStorableVector (Numeric.LinearAlgebra.Data.flatten(matrix))) 
    where vectorToStorableVector = 
       Data.Vector.Storable.fromList . Prelude.map fromIntegral . Numeric.LinearAlgebra.Data.toList 
関連する問題