二次元画像レジストレーションフローフィールドの視覚化
著者は最近、2次元画像の流れの場を視覚化したいと考えていました。参考記事はFlowNet1.0の補足のスキームです。このスキームはSIFTフローと同じです。SIFTフローはMATLABコードを提供します。ダウンロードリンクMatlabの流れの可視化、作者はPythonコードになるように書き直しました。
視覚化戦略
FlowNet1.0の記事は、Flow Field VisualPolicyを説明する記事にリンクしています。
Pythonコード
// visualize flow field
def visualize_flow(flow):
def cal_color(u, v):
def colorwheel():
colorbar = {
'RY':15, 'YG':6, 'GC':4, 'CB':11, 'BM':13, 'MR':6}
ncols = sum([v for k, v in colorbar.items()])
colorwl = np.zeros(shape=[ncols, 3])
col = 0
for k, v in colorbar.items():
if k == 'RY':
colorwl[col:v + col , 0] = 255
colorwl[col:v + col , 1] = np.array(np.floor(255 * np.linspace(0, v - 1,v) / v))
if k == 'YG':
colorwl[col:v + col, 0] = 255 - np.array(np.floor(255 * np.linspace(0, v - 1, v) / v))
colorwl[col:v + col, 1] = 255
if k == 'GC':
colorwl[col:v + col, 1] = 255
colorwl[col:v + col, 2] = np.array(np.floor(255 * np.linspace(0, v - 1, v) / v))
if k == 'CB':
colorwl[col:v + col, 1] = 255 - np.array(np.floor(255 * np.linspace(0, v - 1, v) / v))
colorwl[col:v + col, 2] = 255
if k == 'BM':
colorwl[col:v + col, 0] = np.array(np.floor(255 * np.linspace(0, v - 1, v) / v))
colorwl[col:v + col, 2] = 255
if k == 'MR':
colorwl[col:v + col, 0] = 255
colorwl[col:v + col, 2] = 255 - np.array(np.floor(255 * np.linspace(0, v - 1, v) / v))
col = col + v
return colorwl
color_wl = colorwheel()
n_cols = color_wl.shape[0]
rad = np.sqrt(u**2 + v**2)
t_a = np.arctan2(-v, -u) / np.pi
fk = (t_a + 1) / 2 * (n_cols - 1)
k0 = np.floor(fk).astype(np.int)
k1 = k0 + 1
k1 = k1 * (k1 != n_cols)
f = fk - k0
img = np.zeros(shape=[u.shape[0], u.shape[1], 3])
for i_color in range(color_wl.shape[1]):
tmp = color_wl[:, i_color]
col0 = np.zeros(shape=k0.shape)
col1 = np.zeros(shape=k1.shape)
for i in range(k0.shape[0]):
for j in range(k0.shape[1]):
col0[i][j] = tmp[k0[i][j]] / 255
col1[i][j] = tmp[k1[i][j]] / 255
col = (1 - f) * col0 + f * col1
idx = (rad <= 1)
for i in range(idx.shape[0]):
for j in range(idx.shape[1]):
if idx[i][j]:
col[i][j] = 1 - rad[i][j] * (1 - col[i][j])
if not idx[i][j]:
col[i][j] = col[i][j]*0.75
img[:, :, i_color] = np.floor(255 * col)
return img.astype(np.uint8)
UNKNOWN_FLOW_TH = 1e9
eps = 2.2204e-16
bs = flow.shape[0]
#height = flow.shape[2]
#width = flow.shape[3]
flow_u = flow[:, 0]
flow_v = flow[:, 1]
idxUnknown = (abs(flow_u) > UNKNOWN_FLOW_TH) * (abs(flow_v) > UNKNOWN_FLOW_TH)
flow_u = flow_u * (1 - idxUnknown)
flow_v = flow_v * (1 - idxUnknown)
img_flow = []
for i_b in range(bs):
temp_u = flow_u[i_b].squeeze()
temp_v = flow_v[i_b].squeeze()
#max_u = temp_u.max()
#max_v = temp_v.max()
rad = np.sqrt(temp_u**2 + temp_v**2)
max_rad = rad.max()
temp_u = temp_u / (max_rad + eps)
temp_v = temp_v / (max_rad + eps)
temp_img = cal_color(temp_u, temp_v)
img_flow.append(temp_img)
return np.array(img_flow)
入力はpytorch形式のバッチ推定フローフィールドであり、出力は視覚化および色分けされたバッチフローフィールドのマトリックスです。skimage.io.imsaveを介して保存した後、フローフィールド視覚化画像を表示できます。 。
結果を視覚化する
固定画像動画フローフィールド