教程:扩展景深

这是一个如何使用mahotas来实现它没有内置的算法的示例: extended depth of field

这个想法是,你有一堆图像,在不同的焦点拍摄,然后你建立一个单一的图像,这样你就可以把所有的东西都对准。

从标准导入开始::

import numpy as np
import mahotas as mh

我们将假设您有一个 image 对象,它有三个维度:堆栈、高度和宽度::

stack,h,w = image.shape

我们用 mh.sobel 作为每个像素的“散焦度”的度量 [1]:

focus = np.array([mh.sobel(t, just_filter=True) for t in image])

现在,我们在每个像素位置选择最佳切片::

best = np.argmax(focus, 0)

到目前为止,还很容易。下一部分是困难的部分。我们希望做到以下几点:

r = np.zeros((h,w))-1
for y in range(h):
    for x in range(w):
        r[y,x] = image[best[y,x], y, x]

但这是非常慢的(如果可以避免的话,千万不要在Python中运行嵌套循环)。我们得到了相同的结果,只是稍微不那么清晰,但操作速度更快 [2]:

image = image.reshape((stack,-1)) # image is now (stack, nr_pixels)
image = image.transpose() # image is now (nr_pixels, stack)
r = image[np.arange(len(image)), best.ravel()] # Select the right pixel at each location
r = r.reshape((h,w)) # reshape to get final result

等着瞧!

这里有一个例子,取自一堆微生物的图像。这是最大强度投影:

_images/zmax.jpg

这是 most in-focus slice (使用Sobel运算符作为度量):

_images/zbest.jpg

这是扩展的景深结果:

_images/zedf.jpg

它显然更尖锐,可能是以一些可能的噪音为代价的。实际上,我在图像模糊方面做了一些尝试,它确实让情况有了些许改善。