Haskell HIP:对图像应用滤镜
Haskell HIP : Apply Filter to an Image
我正在尝试使用 Haskell 图像处理包 HIP, I was able to read the image using the 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"
你的问题有几个问题:
- 首先,您缺少
validPath
函数的声明。我假设它会进行一些文件路径验证,所以我会在答案中忽略它。
readImage
是一个 IO
动作,因此你不能只对 Either
进行模式匹配,你需要先执行它。
- 你还需要在某处输出结果图像,所以你也需要路径
一些更具体的图片备注:
- 将卷积应用于 YCbCr 编码图像并没有真正意义,因此您需要转换为 RGB 或灰度 Y。我假设您需要颜色,所以我们将使用 RGB
- 你没有指定你想要的滤镜,所以只使用高斯模糊
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
这是我们 运行 得到的结果:
也就是说,已经有一些内置功能可以为您简化整个过程:
- 使用已经为您完成转换的导入函数,这样您就不需要手动转换颜色空间。
- 不要手动为过滤器提供内核,而是检查 HIP 中是否已经有您需要的可用内核。
addFilterJpg' :: FilePath -> FilePath -> IO ()
addFilterJpg' fcin fcout = do
imgRGB <- readImageRGB VS fcin
let convRGB = applyFilter (gaussianBlur 1) imgRGB
writeImage fcout convRGB
这是上述函数的结果:
我正在尝试使用 Haskell 图像处理包 HIP, I was able to read the image using the 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"
你的问题有几个问题:
- 首先,您缺少
validPath
函数的声明。我假设它会进行一些文件路径验证,所以我会在答案中忽略它。 readImage
是一个IO
动作,因此你不能只对Either
进行模式匹配,你需要先执行它。- 你还需要在某处输出结果图像,所以你也需要路径
一些更具体的图片备注:
- 将卷积应用于 YCbCr 编码图像并没有真正意义,因此您需要转换为 RGB 或灰度 Y。我假设您需要颜色,所以我们将使用 RGB
- 你没有指定你想要的滤镜,所以只使用高斯模糊
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
这是我们 运行 得到的结果:
也就是说,已经有一些内置功能可以为您简化整个过程:
- 使用已经为您完成转换的导入函数,这样您就不需要手动转换颜色空间。
- 不要手动为过滤器提供内核,而是检查 HIP 中是否已经有您需要的可用内核。
addFilterJpg' :: FilePath -> FilePath -> IO ()
addFilterJpg' fcin fcout = do
imgRGB <- readImageRGB VS fcin
let convRGB = applyFilter (gaussianBlur 1) imgRGB
writeImage fcout convRGB
这是上述函数的结果: