我有以下使用Python和OpenCV的代码。简而言之,我有一堆不同焦距拍摄的图像。该代码在所有焦深(z)中,在每个(x,y)位置提取具有最大Laplacian-Guassian响应的像素,从而生成聚焦叠加图像。函数get_fmap
创建一个2d数组,其中每个像素将包含具有最大对数响应的焦平面的数量。在下面的代码中,注释掉的行是我当前的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
将用于从不同的焦平面中提取像素,以创建聚焦叠加图像
这是在一个非常大的图像上完成的,我觉得VIP在这方面可能比OpenCV做得更好。然而,官方文档提供的关于其Python绑定的信息相当少。从我在互联网上找到的信息来看,我只能使图像卷积工作(在我的例子中,这比OpenCV快一个数量级)。我想知道如何在VIP中实现这一点,尤其是这些线路?在
^{pr2}$
在参考了Python VIPS manual和一些尝试和错误之后,我想出了我自己的答案。我正在讨论的numpy和OpenCV实现可以转化为vip,如下所示:
逻辑索引是通过
^{pr2}$ifthenelse
方法实现的:语法相当灵活。测试条件可以是相同大小的两个图像之间的比较,或者图像和值之间的比较,例如}。与wise一样,value_if_true可以是单个值或VIP图像。在
img1 > img2
或{log_response
和fmap
在问题代码中初始化为3D数组,而问题文本声明输出fmap
是一个2D数组。所以,我假设log_response
和fmap
被初始化为2D数组,它们的形状与每个图像相同。因此,编辑将是-现在,回到问题的主题,您将逐个对每个图像执行二维过滤,并获得所有堆叠图像的过滤输出的最大索引。在这种情况下,根据^{} 的文档,它也可以用于多维数组,并将多维数组作为输出。然后,获得所有图像的最大索引很简单
^{pr2}$.argmax(2)
。因此,实施必须非常有效,并且将简单地-相关问题 更多 >
编程相关推荐