二次元画像レジストレーションフローフィールドの視覚化

二次元画像レジストレーションフローフィールドの視覚化

著者は最近、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を介して保存した後、フローフィールド視覚化画像を表示できます。 。

結果を視覚化する

固定画像動画フローフィールド
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_35898332/article/details/112426756
おすすめ