Как преобразовать точность типа изображения из Double в Word8 с помощью HIP?

У меня есть изображение в типе Image VS Y Double (после использования функции readImageY из библиотеки HIP), и я хочу преобразовать его в Image VS Y Word8. Как мне это сделать? Мне нужна эта точность для следующей функции, к которой я это применяю.

Вот фрагмент соответствующего кода:

import Codec.Picture         
import Codec.Picture.Types
import Control.Arrow
import Data.Ratio 
import Data.Monoid
import Graphics.Image.Processing
import qualified Graphics.Image as I
import Graphics.Image.IO
import Graphics.Image.IO.Formats
import Graphics.Image.Interface.Vector
import qualified Graphics.Image.Interface as Interface
import Data.Word (Word8)
import qualified Data.Matrix as M
import System.FilePath.Posix (splitExtension)

to2DMatrix :: FilePath -> FilePath -> Border(Interface.Pixel I.Y Word8) -> (Int, Int) -> IO ()
to2DMatrix fp fpout bor (dim1, dim2)= do
    eimg <- I.readImageY VS fp
    let new_res :: Interface.Image VS I.Y Word8
        new_res = I.resize Bilinear bor (dim1, dim2) eimg 
    let rle = twoDToMatrix $ pixelToInt $ toJPImageY8 new_res
    let (name, _) = splitExtension fp
    writeFile (name ++ ".txt") (show rle)
    writeImage fpout rle

Это ошибка:

Couldn't match type ‘Double’ with ‘Word8’
      Expected type: Interface.Image VS I.Y Word8
        Actual type: Interface.Image VS I.Y Double
    • In the fourth argument of ‘resize’, namely ‘eimg’
      In the expression: resize Bilinear bor (dim1, dim2) eimg
      In an equation for ‘new_res’:
          new_res = resize Bilinear bor (dim1, dim2) eimg
   |
29 |         new_res = I.resize Bilinear bor (dim1, dim2) eimg
   |                                                      ^^^^

РЕДАКТИРОВАТЬ: двойные значения - это значения пикселей в градациях серого, хранящиеся как векторный тип VS в типе изображения. Проблема, с которой я столкнулся, - получить доступ к двойникам, чтобы иметь возможность их преобразовать. Попытка интерпретировать / найти способ библиотеку HIP здесь, но я новичок в Haskell и не могу понять его.

1 ответ

Решение

Есть класс Elevatorкоторый доступен в Graphics.Image.Interface в библиотеке Haskell Image Processing (HIP), что позволяет вам изменять точность пикселей с / на несколько типов точности.

Вот фрагмент измененного кода:

to2DMatrix :: FilePath  -> (Int, Int) -> IO (Maybe (M.Matrix Int)) 
to2DMatrix fp (dim1, dim2)= do
    eimg <- I.readImageY VS fp 
    let new_res :: Interface.Image VS I.Y Word8
        new_res = I.resize Bilinear Edge  (dim1, dim2) $ Interface.map conv eimg
    let rle = twoDToMatrix $ pixelToInt $ toJPImageY8 new_res
    return $ Just (rle)

conv :: Pixel Y Double -> Pixel Y Word8 
conv d = toWord8 <$> d

В <$> является инфиксной версией оператора fmap. Так что это то же самое, что:

conv :: Pixel Y Double -> Pixel Y Word8 
conv d = fmap toWord8 d

Дополнительные детали для преобразования входного изображения в матрицу:

pixelToInt изменения от типа Pixel8 к [[Int]]:

pixelToInt :: Image Pixel8 -> [[Int]]
pixelToInt =
  map reverse . reverse .  snd . pixelFold 
    (\(lastY, ps:pss) x y p ->           
      if y == lastY                        
        then (y, (fromIntegral p:ps):pss)
        else (y, [fromIntegral p]:ps:pss))
    (0,[[]])

Затем вы можете использовать Data.Matrix для изменения с [[Int]] к типу Data.Matrix Matrix по мере необходимости.

Другие вопросы по тегам