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