首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将图像从DynamicImage类型转换为图像arr e?使用JuicyPixels和HIP库

如何将图像从DynamicImage类型转换为图像arr e?使用JuicyPixels和HIP库
EN

Stack Overflow用户
提问于 2020-06-11 00:45:33
回答 1查看 222关注 0票数 1

我正在使用JuicyPixels图像处理库来摄取图像并将其转换为矩阵类型。我希望将图像的分辨率更改为用户指定的维度,这样就可以将其输入到神经网络中。

到目前为止,我的程序读取图像并将图像转换为Data.Matrix矩阵。图像类型来自于DynamicImage -> Image Pixel8 ->[[Int]] -> Matrix Int

我尝试过使用(HIP)库中的调整大小函数,但是它接受并输出了一个我不知道如何处理的类型Image arr cs e

到目前为止,我的代码如下:

代码语言:javascript
复制
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 qualified Data.Matrix as M
import System.FilePath.Posix (splitExtension)

-- take image input with the filepath given as a DynamicImage type
to2DMatrix :: FilePath -> String -> (Int, Int) -> IO ()
to2DMatrix fp = do
    image <- readImage fp
    case image of
      Left _ -> putStrLn $ "Sorry, not a supported codec for " ++ fp
      Right dynimg -> do
        -- convert dynamic image to greyscale and then to a 2d matrix
        let rle = twoDToMatrix $ pixelToInt $ greyscaleImage $ changeResolution dynimg 
        let (name, _) = splitExtension fp
        writeFile (name ++ ".txt") (show rle)
      Right _ -> putStrLn "Unhandled file type"

changeResolution :: DynamicImage -> String -> (Int, Int)  -> DynamicImage
changeResolution border (dim1, dim2) img = I.resize border (dim1, dim2) img

-- convert DynamicImage to a Pixel8 image
greyscaleImage :: DynamicImage -> Image Pixel8
greyscaleImage = convertRGB8 >>> pixelMap greyscalePixel

-- convert PixelsRGB8 image to Pixel8 image
greyscalePixel :: PixelRGB8 -> Pixel8
greyscalePixel (PixelRGB8 r g b) = round (wr + wg + wb)
  where wr = toRational r * (3 % 10)
        wg = toRational g * (59 % 100)
        wb = toRational b * (11 % 100)

-- convert Pixel8 image to a 2-d matrix of integers
pixelToInt :: Image Pixel8 -> [[Int]]
pixelToInt =
  map reverse . reverse .  snd . pixelFold -- because of the direction pixelFold works in, and the direction
    (\(lastY, ps:pss) x y p ->             -- you add things to lists, reverse and map reverse are necessary
      if y == lastY                        -- to make the output not mirrored horizontaly and vertically
        then (y, (fromIntegral p:ps):pss)
        else (y, [fromIntegral p]:ps:pss))
    (0,[[]])

-- converts list of lists to Data.Matrix type Matrix
twoDToMatrix :: [[Int]] -> M.Matrix Int
twoDToMatrix lists = M.fromLists lists

编辑:更改了程序以删除changeResolution函数,因为我意识到我可以使用convert函数或使用readImageY将图像转换为灰度。以下是更新的代码:

代码语言:javascript
复制
to2DMatrix :: FilePath -> Border(Interface.Pixel I.Y Word8) -> (Int, Int) -> IO ()
to2DMatrix fp bor (dim1, dim2)= do
    eimg <- I.readImageExact VS fp
    case eimg of
      Left _ -> putStrLn $ "Sorry, not a supported codec for " ++ fp
      Right img -> do
        let imgGray :: Interface.Image VS I.Y Word8
            imgGray = convert (img)
        let new_res :: Interface.Image VS I.Y Word8
            new_res = I.resize imgGray bor (dim1, dim2) 
        let rle = twoDToMatrix $ pixelToInt $ toJPImageY8 new_res
        let (name, _) = splitExtension fp
        writeFile (name ++ ".txt") (show rle)

我得到以下错误。如何从arr转换为VS

代码语言:javascript
复制
Couldn't match expected type ‘Interface.Image VS I.Y Word8’
                  with actual type ‘Interface.Image arr0 I.Y Word8
                                    -> Interface.Image arr0 I.Y Word8’
    • In the expression: resize imgGray bor (dim1, dim2)
      In an equation for ‘new_res’:
          new_res = resize imgGray bor (dim1, dim2)
      In the expression:
        do let imgGray :: Interface.Image VS I.Y Word8
               imgGray = convert (img)
           let new_res :: Interface.Image VS I.Y Word8
               new_res = resize imgGray bor ...
           let rle = twoDToMatrix $ pixelToInt $ toJPImageY8 new_res
           let (name, _) = splitExtension fp
           ....
   |
34 |             new_res = I.resize imgGray bor (dim1, dim2)
   |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-12 05:53:46

( HIP ) resize 函数 图书馆使用Image arr cs e类型,因此我发现使用HIP库读取图像比使用JuicyPixels更容易。

这些类型来自Image VS Y Double -> Image VS Y Word8 -> Pixel8 -> [[Int]] -> Matrix Int

使用HIP的另一个优点是我们可以在灰度Pixel Y中读取图像,而不是稍后进行转换。下面是包含更改的代码:

代码语言:javascript
复制
import Codec.Picture         
import Codec.Picture.Types
import Graphics.Image.Processing
import qualified Graphics.Image as I
import qualified Graphics.Image.Interface as Interface
import Graphics.Image.ColorSpace
import Data.Word (Word8)
import qualified Data.Matrix as M

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 :: Interface.Pixel I.Y Double -> Interface.Pixel I.Y Word8 
conv d = fmap Interface.toWord8 d

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,[[]])
twoDToMatrix :: [[Int]] -> M.Matrix Int
twoDToMatrix lists = M.fromLists lists

conv将每个像素从Double转换为toWord8。图像需要具有Word8精度的toJPImageY8函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62315333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档