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

这是上述函数的结果: