1

Python と OpenCV を使用する次のコードがあります。簡単に言えば、異なる焦点深度で撮影した画像のスタックがあります。コードは、すべての焦点深度 (z) の中で最大のガウス応答のラプラシアンを持つすべての (x,y) 位置でピクセルを選択し、フォーカス スタック イメージを作成します。関数get_fmapは、最大の対数応答を持つ焦点面の番号が各ピクセルに含まれる 2 次元配列を作成します。次のコードでは、コメント アウトされている行が現在の 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
4

2 に答える 2