numpy对图像重映射的通用优化方法


最近的图像处理涉及到了很多重映射的算法,比如 线性对比度变换伽马变换二值化对数变换直方图均衡化等,这些算法具有以下特性:

  • 基于每一个像素点的处理
  • 一对一或多对一的映射,不存在一对多的映射
  • 每一个像素点之间没有关联

以上特点使得这类重映射算法可以用向量化运算做并行处理。

映射函数

这里以图像的伽马变换为例子,伽马变换实际上是将颜色数据规格化到[0,1]并取幂函数的值,即以下的函数关系。
f ( x ) = ( ( x / 255 ) g a m m a ) × 255 f(x)=((x/255)^{gamma})\times255 f(x)=((x/255)gamma)×255

从映射函数计算查找表

由于颜色数据的类型是uint8,并且不存在一对多的映射,所以我们可以制作一个长度为256的查找表用来存储结果。方法很简单,只需要把range(0,256)序列作为上述函数的输入即可。

#关键代码
np.power(np.arange(0,256)/255,val)*255
#实际代码	
Map = np.clip(np.round(np.power((np.arange(0,256).astype(np.float64))/255,val)*255),0,255).astype(np.uint8)

由于整型数据可能会上溢,所以这里将np.arange(0,256)转换为浮点型
输出类型是uint8,为了避免转换成短类型溢出,需要四舍五入并且钳制到[0,255]
最后转换成uint8即可。

使用数组切片并行处理

这里把img.data[:,:,:](即x坐标,y坐标,颜色通道)作为下标去索引map查找表,此时data会被替换成查找表对应的值

img.data = Map[img.data[:,:,:]].astype(np.uint8)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值