图片二值化的逻辑是这样的:
(伪python代码)
for 点 in 灰度图片:
if 点.灰度 < 限度:
点 = 黑点
else:
点 = 白点
要想二值化一个图片,按照正常的脑回路,我就要将上述逻辑转换为代码:将图片转为numpy array,然后遍历每个点,灰度小于限度的,灰度变为0,灰度大于限度的,灰度变为255。
然而,众所周知,对一整个图片这么大的array,遍历的资源开销很大。
而在numpy中,有一类函数叫做ufunc
,这类函数会对数组中的全部元素进行同一操作。多个数据,同一操作,这不就是CPU的各种SIMD指令集干的事吗!numpy没理由不用这些指令集优化ufunc
。因此我猜测,用ufunc
代替遍历,就可节省资源开销。
那么问题来了:怎么把遍历改成ufunc
?这堆ufunc
似乎都不带条件判断啊?
好在虽然ufunc
都不提供条件判断,但是有的ufunc
存在“逻辑层面的条件判断”:比如floor(向下取整)
这个函数。
虽然floor
的实现不一定用了条件判断,但是它可以表示下面的逻辑:
for 一个整数 in 全体整数:
if 数字 >= 一个整数 and 数字 < 一个整数+1:
return 一个整数
因此,我们只要用一些奇妙的转换将大小的判断转化成floor
内部的逻辑判断,就可用ufunc
代替条件遍历。
上代码:
#img:一张灰度图片对应的numpy array
#threshold:灰度限度
def binarray(</