1

我正在尝试使用 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"
4

1 回答 1

3

你的问题有几个问题:

  • 首先,您缺少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

这是上述函数的结果:

在此处输入图像描述

于 2020-05-25T20:29:32.310 回答