Haskell HIP:将滤镜应用于图像

Sil*_*lva 2 haskell image-processing hip

我正在尝试使用 Haskell 图像处理包HIP向图像添加过滤器,我能够使用ByteString包读取图像并使用 HIP 将图像转换为类型Image VS YCbCr Word8。现在,我如何从 转换Image VS YCbCr Word8Border (Pixel cs e)or 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"
Run Code Online (Sandbox Code Playgroud)

leh*_*ins 5

你的问题有几个问题:

  • 首先,您缺少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
Run Code Online (Sandbox Code Playgroud)

这是我们运行时得到的结果:

在此输入图像描述

话虽这么说,已经有内置的函数可以为您简化整个过程:

  • 使用已经为您完成转换的导入函数,这样您就不需要手动转换颜色空间。
  • 不要手动为过滤器提供内核,而是检查 HIP 中是否已经有您需要的可用内核。
addFilterJpg' :: FilePath -> FilePath -> IO ()
addFilterJpg' fcin fcout = do
  imgRGB <- readImageRGB VS fcin
  let convRGB = applyFilter (gaussianBlur 1) imgRGB
  writeImage fcout convRGB
Run Code Online (Sandbox Code Playgroud)

这是上述函数的结果:

在此输入图像描述