如何使用 HIP 将图像类型的精度从 Double 转换为 Word8?
How to convert precision in Image type from Double to Word8 using HIP?
我有一个 Image VS Y Double
类型的图像(在使用 HIP 库中的函数 readImageY
之后),我想将其转换为 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 矢量类型的灰度像素值。我遇到的问题是访问双打以便能够转换它们。尝试 interpret/find HIP 库 here 的方式,但我是 Haskell 的新手,无法弄清楚。
在 Haskell 图像处理 (HIP) 库的 Graphics.Image.Interface 中有一个 class Elevator
,它允许您更改像素精度 from/to 几种精度类型。
这是更改后的代码片段:
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矩阵类型。
我有一个 Image VS Y Double
类型的图像(在使用 HIP 库中的函数 readImageY
之后),我想将其转换为 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 矢量类型的灰度像素值。我遇到的问题是访问双打以便能够转换它们。尝试 interpret/find HIP 库 here 的方式,但我是 Haskell 的新手,无法弄清楚。
在 Haskell 图像处理 (HIP) 库的 Graphics.Image.Interface 中有一个 class Elevator
,它允许您更改像素精度 from/to 几种精度类型。
这是更改后的代码片段:
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矩阵类型。