Haskell HIP:将过滤器应用于图像

时间:2020-05-23 19:13:00

标签: haskell image-processing hip

我正在尝试使用Haskell图像处理软件包HIP向图像添加过滤器,我能够使用ByteString软件包读取图像并将图像转换为类型{{1 }}使用HIP。现在,如何从Image VS YCbCr Word8转换为Image VS YCbCr Word8Border (Pixel cs e)?我仍在学习Haskell,所以请保持简单。参见下面的代码:

Pixel cs e

1 个答案:

答案 0 :(得分:2)

您的问题有两个问题:

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

这是我们运行它时得到的:

enter image description here

话虽如此,已经内置了一些功能,可以为您简化整个过程:

  • 使用已经为您完成转换的导入功能,因此您无需担心手动进行色彩空间转换。
  • 而不是手动提供过滤器内核,而是查看HIP中是否已经有需要的内核。
addFilterJpg' :: FilePath -> FilePath -> IO ()
addFilterJpg' fcin fcout = do
  imgRGB <- readImageRGB VS fcin
  let convRGB = applyFilter (gaussianBlur 1) imgRGB
  writeImage fcout convRGB

这是以上功能的结果:

enter image description here

相关问题