我正在尝试使用Haskell图像处理程序包HIP向图像添加过滤器,我能够使用ByteString程序包读取图像,并Image VS YCbCr Word8
使用HIP将图像转换为类型。现在,我如何从转换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"
您的问题有两个问题:
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
这是以上功能的结果:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句