分享一个关于条纹结构光的解包裹相位图去噪算法,算法是一篇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)