我试图使用包髋部向图像添加一个过滤器,我能够使用ByteString包读取图像,并使用HIP将图像转换为Image VS YCbCr Word8类型。现在,如何将Image VS YCbCr Word8转换为Border (Pixel cs e)或Pixel cs e?我还在学Haskell所以请简单一点。见下面的代码:
addFilterJpg :: FilePath -> IO ()
addFilterJpg fc = do
case validPath fc of
Left err -> putStrLn err
Right img -> do
case readImage img of
Left err -> putStrLn err
Right img -> do
-- convert img::(Image VS YCbCr Word8) to Border (Pixel cs e)
-- apply filter
-- save image
putStrLn "Convolution Filter"发布于 2020-05-25 20:29:32
你的问题有几个问题:
validPath函数的声明。我假设它做了一些文件路径验证,所以我将在答案中忽略它。readImage是一个IO操作,因此您不能仅仅在Either上匹配模式,您需要首先执行它。更多关于图像的评论:
applyFilterJpg :: FilePath -> FilePath -> IO ()
applyFilterJpg fcin fcout = do
eImg <- readImageExact JPG fcin
case eImg of
Left err -> putStrLn err
Right img -> do
let imgRGB :: Image VS RGB Double
imgRGB = convert (img :: Image VS YCbCr Word8)
gaussianBlurKernel :: Image VS X Double
gaussianBlurKernel = fromLists $ [ [ 1/16, 1/8, 1/16 ]
, [ 1/8, 1/4, 1/8 ]
, [ 1/16, 1/8, 1/16 ] ]
convRGB = convolve Edge gaussianBlurKernel imgRGB
writeImage fcout convRGB这就是我们运行它时得到的结果:

尽管如此,已经有一些功能可以简化您的整个过程:
addFilterJpg' :: FilePath -> FilePath -> IO ()
addFilterJpg' fcin fcout = do
imgRGB <- readImageRGB VS fcin
let convRGB = applyFilter (gaussianBlur 1) imgRGB
writeImage fcout convRGB这是上述职能的结果:

https://stackoverflow.com/questions/61977364
复制相似问题