【条纹结构光投影】相位图去噪算法分享,仅供交流学习

分享一个关于条纹结构光的解包裹相位图去噪算法,算法是一篇sci的实现,仅供交流学习
更多传送门:
【条纹结构光投影】分享一下四步相移的代码,仅供交流学习
【条纹结构光投影】正反格雷码解相算法分享,仅供交流学习

img = io.imread('unwrap.tiff')

height,width = img.shape

mask = [[0 for i in range(width)] for j in range(height)]

omega = [0.5664, 0.4535]

# lambda_1: 0.3 - 0.4
# lambda_2: 0.01 - 0.05
theta_phase = 1
lambda_1 = 0.3
lambda_2 = 0.05
theta_mask = 1
num_of_round = 3

def u1(xp):
	return 0.5 * (1 - math.erf(xp - theta_phase))

def b1(omega_idx, xq1, xq2):
	return lambda_1 * omega[omega_idx] * abs(xq2 - xq1)

u2 = [[0 for i in range(width)] for j in range(height)]

def b2(omega_idx, mp, mq):
	return lambda_2 * omega[omega_idx] * (1 - kronecker(mp, mq))

def kronecker(a, b):
	if a == b:
		return 1
	else: 
		return 0

# Mask ini
for i in range(height):
	for j in range(1,width-1):
		if img[i,j] > img[i,j-1] and img[i,j] < img[i,j+1]:
			mask[i][j] = 1

#energy1
for i in range(1, height-1):
	for j in range(1, width-1):
		u2[i][j] = u1(img[i, j]) \
		+ b1(0, img[i, j], img[i, j+1]) \
		+ b1(0, img[i, j], img[i, j-1]) \
		+ b1(0, img[i, j], img[i+1, j]) \
		+ b1(0, img[i, j], img[i-1, j]) \
		+ b1(1, img[i-1, j-1], img[i, j]) \
		+ b1(1, img[i-1, j+1], img[i, j]) \
		+ b1(1, img[i, j], img[i+1, j+1]) \
		+ b1(1, img[i, j], img[i+1, j-1]) 

for i in range(height):
	u2[i][0] = 1
	u2[i][-1] = 1
for i in range(width):
	u2[0][i] = 1
	u2[-1][i] = 1

for i in range(height):
	mask[i][0] = 1
	mask[i][-1] = 1
for i in range(width):
	mask[0][i] = 1
	mask[-1][i] = 1

#energy2
for k in range(num_of_round):
	c = 0
	tmp_mask = copy.deepcopy(mask)
	for i in range(1, height-1):
		for j in range(1, width-1):

			e0 = u2[i][j] \
			+ b2(0, 0, mask[i][j+1]) \
			+ b2(0, 0, mask[i][j-1]) \
			+ b2(0, 0, mask[i+1][j]) \
			+ b2(0, 0, mask[i-1][j]) \
			+ b2(1, 0, mask[i+1][j+1]) \
			+ b2(1, 0, mask[i+1][j-1]) \
			+ b2(1, 0, mask[i-1][j+1]) \
			+ b2(1, 0, mask[i-1][j-1]) 

			e1 = u2[i][j] \
			+ b2(0, 1, mask[i][j+1]) \
			+ b2(0, 1, mask[i][j-1]) \
			+ b2(0, 1, mask[i+1][j]) \
			+ b2(0, 1, mask[i-1][j]) \
			+ b2(1, 1, mask[i+1][j+1]) \
			+ b2(1, 1, mask[i+1][j-1]) \
			+ b2(1, 1, mask[i-1][j+1]) \
			+ b2(1, 1, mask[i-1][j-1]) 

			if theta_phase > e1 and e0 >= e1:
				if mask[i][j] == 0:
					c += 1
				tmp_mask[i][j] = 1
			else:
				if mask[i][j] == 1:
					c += 1
				tmp_mask[i][j] = 0

	mask = tmp_mask
	print('The number of points modified in round ' + str(k+1) +  '/' + str(num_of_round) + ' is: ' + str(c))

cc = 0
#odot
for i in range(height):
	for j in range(width):
		if mask[i][j] == 0:
			img[i,j] = 0
			cc += 1
print('The final number of modified points is:' + str(cc))

io.imsave('done.bmp', img)
io.imsave('done.tiff', img)
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值