Skip to content

a functional image process library accelerated by GPU

Notifications You must be signed in to change notification settings

Easonzero/FunctionalImage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FunctionalImage

LICENSE Badge

an functional image process library accelerated by GPU

FunctionImage是一个支持通过函数式的方法操作图像和二维数组的库.

Demo

Demo

Idea

图像本质上是一个元素为RGBA值的二维数组,图像处理可以视为将RGBA二维数组映射为新的RGBA二维数组的过程,这与函数式的思维不谋而合.

本项目将图像与浮点数二维数组视作为等同的操作对象及输出目标,提供一系列的函数式工具在[图像,浮点数二维数组]与[图像,浮点数二维数组]间建立映射,使得图像处理的代码能够使用函数式映射的方式,简洁清晰地完成目标需求.

此外,本项目也不仅限于单个图像与单个图像之间的映射,同时也试图实现一种多个图像与单个图像之间的映射,利用application函数式工具就可以实现这一目标.

最后,函数式的一个优势在于利于并行化加速,本项目底层实现基于gpu.js,利用WebGL对映射过程加速.

Features

  1. 支持fmap,bind,join,application,卷积函数.
  2. 运算具有封闭性,即任意运算的结果可以作为任意运算的输入
  3. 无限制的输入与输出,例如可以输入图像输出浮点数二维数组,输入浮点数二维数组输出图像等.
  4. GPU加速
  5. 支持动态变量
  6. 支持Promise异步调用
  7. 支持函数输入的形式可以为普通函数和箭头函数

How to use

FunctionalImage的通常的使用流程是,通过pure函数将图像或者浮点数二维数组转化为可以进行操作的对象,然后链式调用FunctionalImage提供的操作函数,将输入映射为输出. 值得注意的是,FunctionalImage所有的操作都只会产生一些操作信息,并被缓存在container对象上,只有在执行draw函数或者output函数之后,才会被执行.output函数会返回一个Promise,可以通过then函数访问执行的结果. 此外,container对象可以通过调用get方法获取操作信息的缓存, 然后通过combine函数和其他的container合并, 对于任意参数为数据的操作函数,也可以传入container的操作信息缓存作为数据来源. 最后,操作函数的第二个参数可以指定输出类型,例如N代表输出为float二维数组,RB代表输出为RGBA二维数组,同时输入函数只对RB两个通道作用,GA两个通道的值为输入数据的原始值.

  1. fmap

fmap是一个将单个元素映射为单个元素的函数.

pure(image)
    .fmap(r=>g=>b=>a=>r,'N')
    .fmap(a=>1,'A')
    .draw()
  1. bind

bind是一个将单个元素映射为矩阵的函数

pure(image)
    .fmap(a=>a*a,'RGB')
    .bind(a=>x=>y=>a,'RGB',[2,2])
    .draw()
  1. ap

ap是一个将多个元素映射为单个元素的函数

pure(a=>b=>a*b,'RGB')
    .ap(image)
    .ap(data)//data是一个与图片等尺寸的float二维数组
    .draw()
  1. convolute
pure(image)
.convolute([
    [0.167,  0,0,0,0,0],
    [0,  0.167,0,0,0,0],
    [0,  0,0.167,0,0,0],
    [0,  0,0,0.167,0,0],
    [0,  0,0,0,0.167,0],
    [0,  0,0,0,0,0.167]
])
.draw()
  1. join join是一个将局部矩阵映射为单个元素的函数,r代表累积值,a代表某一通道值
pure(image)
    .join(r=>a=>x=>y=>a,'RGB',[2,2])
    .draw()

About

a functional image process library accelerated by GPU

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages