我有以下使用 Python 和 OpenCV 的代码。简而言之,我有一堆以不同焦深拍摄的图像。这些代码在所有焦点深度 (z) 中挑选出每个 (x,y) 位置具有最大高斯响应的拉普拉斯算子的像素,从而创建焦点堆叠图像。函数get_fmap
创建一个二维数组,其中每个像素将包含具有最大对数响应的焦平面的编号。在以下代码中,被注释掉的行是我当前的 VIPS 实现。它们在函数定义中看起来不兼容,因为它只是部分解决方案。
# from gi.repository import Vips
def get_log_kernel(siz, std):
x = y = np.linspace(-siz, siz, 2*siz+1)
x, y = np.meshgrid(x, y)
arg = -(x**2 + y**2) / (2*std**2)
h = np.exp(arg)
h[h < sys.float_info.epsilon * h.max()] = 0
h = h/h.sum() if h.sum() != 0 else h
h1 = h*(x**2 + y**2 - 2*std**2) / (std**4)
return h1 - h1.mean()
def get_fmap(img): # img is a 3-d numpy array.
log_response = np.zeros_like(img[:, :, 0], dtype='single')
fmap = np.zeros_like(img[:, :, 0], dtype='uint8')
log_kernel = get_log_kernel(11, 2)
# kernel = get_log_kernel(11, 2)
# kernel = [list(row) for row in kernel]
# kernel = Vips.Image.new_from_array(kernel)
# img = Vips.new_from_file("testimg.tif")
for ii in range(img.shape[2]):
# img_filtered = img.conv(kernel)
img_filtered = cv2.filter2D(img[:, :, ii].astype('single'), -1, log_kernel)
index = img_filtered > log_response
log_response[index] = img_filtered[index]
fmap[index] = ii
return fmap
然后fmap
将用于从不同焦平面中挑选像素以创建焦点堆叠图像
这是在一个非常大的图像上完成的,我觉得 VIPS 在这方面可能比 OpenCV 做得更好。然而,官方文档提供的关于其 Python 绑定的信息相当少。根据我在互联网上可以找到的信息,我只能使图像卷积工作(在我的情况下,它比 OpenCV 快一个数量级。)。我想知道如何在 VIPS 中实现这一点,尤其是这些行?
log_response = np.zeros_like(img[:, :, 0], dtype = 'single')
index = img_filtered > log_response
log_response[index] = im_filtered[index]
fmap[index] = ii