Как извлечь значения RGB из (большинства) изображений?
Я хочу извлечь каждое значение RGB из возможных картинок в Haskell.
Какой самый простой способ получить необработанные значения (0-255)?
Я уже получил некоторые результаты с библиотекой Juicy Pixels, но почему-то всегда получаю исключение:
*** Exception: ./Data/Vector/Generic.hs:249 ((!)): index out of bounds (660000,660000)
Это соответствующий код.
{-# LANGUAGE TypeSynonymInstances #-}
module Main where
import Codec.Picture (readImage, pixelAt, PixelRGB8(..))
import Codec.Picture.Types
import System.FilePath.Posix (splitExtension)
toRGBRaw :: FilePath -> IO ()
toRGBRaw fp = do
image <- readImage fp
case image of
Left _ -> putStrLn $ "Sorry, not a supported codec for " ++ fp
Right dynimg -> do
let imgrgba8 = fromDynamicImage dynimg
let (name, _) = splitExtension fp
writeFile (name ++ ".txt") (concat $ accumPixels imgrgba8)
accumPixels :: Image PixelRGBA8 -> [String]
accumPixels img@(Image w h _) = [ format (pixelAt img x y) x y | x <- [0..w], y <- [0..h]]
where format (PixelRGBA8 r g b _) j k = "#" ++ show r ++ "$"
++ show g ++ "$"
++ show b ++ "$"
++ show j ++ "$"
++ show k ++ "*\n"
-- Copied from
-- See http://hackage.haskell.org/package/JuicyPixels-util-0.2/docs/Codec-Picture-RGBA8.html
class ToPixelRGBA8 a where
toRGBA8 :: a -> PixelRGBA8
instance ToPixelRGBA8 Pixel8 where
toRGBA8 b = PixelRGBA8 b b b 255
instance ToPixelRGBA8 PixelYA8 where
toRGBA8 (PixelYA8 l a) = PixelRGBA8 l l l a
instance ToPixelRGBA8 PixelRGB8 where
toRGBA8 (PixelRGB8 r g b) = PixelRGBA8 r g b 255
instance ToPixelRGBA8 PixelRGBA8 where
toRGBA8 = id
fromDynamicImage :: DynamicImage -> Image PixelRGBA8
fromDynamicImage (ImageY8 img) = pixelMap toRGBA8 img
fromDynamicImage (ImageYA8 img) = pixelMap toRGBA8 img
fromDynamicImage (ImageRGB8 img) = pixelMap toRGBA8 img
fromDynamicImage (ImageRGBA8 img) = img
-- end of Codec.Picture.RGBA8
Это пример изображения: Ссылка
Код в настоящее время немного неупорядочен, потому что мне пришлось скопировать некоторые определения из Codec.Picture.RGBA8
который не доступен через LTS. Не обращайте внимания на строковое представление, я анализирую их через Arduino со щитом WiFi.
1 ответ
Решение
Ваш список понимания в accumPixels
имеет индекс 0, но также включает границы. Это, вероятно, проблема. В Хаскеле [0..3]
это список [0,1,2,3]
так что вы, вероятно, имеете в виду [0..(w-1)]
а также [0..(h-1)]
,