import tensorflow as tf
import scipy.io as sio
import numpy as np
from PIL import Image
import os
import copy
import math
import matplotlib.pyplot as plt
np.set_printoptions(threshold=np.inf) #输出全部矩阵不带省略号
#######################################################################
data = np.load('data/class_data.npy')
print(data.shape)
# np.random.shuffle(data)
######################################################################
# 将数据与标签分离,并对标签进行one_hot编码
def input_data(finaldata):
data = []
label = []
for i in range(len(finaldata)):
data.append(finaldata[i][0])
label.append(finaldata[i][1])
data = np.array(data)
data = data.reshape(-1,16,16,1)
label = np.array(label)
return data, label
###########################################################################
def manage_data(data):
data = data.reshape(-1,16,16)
manage_data = []
data = data.tolist()
for i in range(len(data)):
zhu_x = data[i][4]
zuo_x = data[i][5]
you_x = data[i][6]
zhu_y = data[i][7]
zuo_y = data[i][8]
you_y = data[i][9]
zhu_diam = data[i][10]
zuo_diam = data[i][11]
you_diam = data[i][12]
x0_mean = (zhu_x[0] + zuo_x[0] + you_x[0]) / 3.
y0_mean = (zhu_y[0] + zuo_y[0] + you_y[0]) / 3.
zhu_x[0] = x0_mean
zuo_x[0] = x0_mean
you_x[0] = x0_mean
zhu_y[0] = y0_mean
zuo_y[0] = y0_mean
you_y[0] = y0_mean
fencha = [zhu_x] + [zuo_x] + [you_x] + [zhu_y] + [zuo_y] + [you_y] + [zhu_diam] + [zuo_diam] + [you_diam]
manage_data.append(fencha)
manage_data = np.array(manage_data)
return manage_data
##############################################################################
# 训练集
data_train, label_train = input_data(data)
data = manage_data(data_train)
# data = data[0:10,:,:]
print(data.shape)
# 距离计算公式
def get_len(x1,x2,y1,y2):
diff_x = (x1-x2)**2
diff_y = (y1-y2)**2
length = np.sqrt(diff_x+diff_y)
return length
# 得到管径值,管径在第一个值
def get_diam(fencha):
zhu_diam = fencha[6][0]
zuo_diam = fencha[7][0]
you_diam = fencha[8][0]
return zhu_diam, zuo_diam, you_diam
# 计算端点长度
def get_duandian_len(zhu_x,zhu_y,zuo_x,zuo_y,you_x,you_y):
#主分支头尾坐标
zhu_x_tou = zhu_x[0]
zhu_y_tou = zhu_y[0]
zhu_x_wei = zhu_x[-1]
zhu_y_wei = zhu_y[-1]
#左分支头尾坐标
zuo_x_tou = zuo_x[0]
zuo_y_tou = zuo_y[0]
zuo_x_wei = zuo_x[-1]
zuo_y_wei = zuo_y[-1]
#右分支头尾坐标
you_x_tou = you_x[0]
you_y_tou = you_y[0]
you_x_wei = you_x[-1]
you_y_wei = you_y[-1]
#主分支端点长
zhu_duan_len = get_len(zhu_x_tou,zhu_x_wei,zhu_y_tou,zhu_y_wei)
#左分支端点长
zuo_duan_len = get_len(zuo_x_tou,zuo_x_wei,zuo_y_tou,zuo_y_wei)
#右分支端点长
you_duan_len = get_len(you_x_tou,you_x_wei,you_y_tou,you_y_wei)
return zhu_duan_len,zuo_duan_len,you_duan_len
#计算分支总长度
def get_total_len(zhu_x,zhu_y,zuo_x,zuo_y,you_x,you_y):
zhu_lin_list = []
zuo_lin_list = []
you_lin_list = []
for i in range(1,len(zhu_x)):
zhu_lin_len = get_len(zhu_x[i-1],zhu_x[i],zhu_y[i-1],zhu_y[i])
zhu_lin_list.append(zhu_lin_len)
for i in range(1,len(zuo_x)):
zuo_lin_len = get_len(zuo_x[i-1],zuo_x[i],zuo_y[i-1],zuo_y[i])
zuo_lin_list.append(zuo_lin_len)
for i in range(1, len(you_x)):
you_lin_len = get_len(you_x[i-1],you_x[i],you_y[i-1],you_y[i])
you_lin_list.append(you_lin_len)
zhu_total_len = 0
for file in zhu_lin_list:
zhu_total_len += file
zuo_total_len = 0
for file in zuo_lin_list:
zuo_total_len += file
you_total_len = 0
for file in you_lin_list:
you_total_len += file
return zhu_total_len,zuo_total_len,you_total_len
# 计算卷曲度
def get_juanqu(zhu_duan_len,zuo_duan_len,you_duan_len,zhu_total_len,zuo_total_len,you_total_len):
zhu_juanqu = zhu_total_len / zhu_duan_len
zuo_juanqu = zuo_total_len / zuo_duan_len
you_juanqu = you_total_len / you_duan_len
# print(zhu_total_len)
# print(zhu_duan_len)
# print(zhu_juanqu)
return zhu_juanqu,zuo_juanqu,you_juanqu
def plt_fencha(data,label='red'):
zhu_x = data[0]
zuo_x = data[1]
you_x = data[2]
zhu_y = data[3]
zuo_y = data[4]
you_y = data[5]
if label=='red':
plt.plot(zhu_x,zhu_y,color='red',linewidth=3)
if label=='blue':
plt.plot(zhu_x,zhu_y,color='blue',linewidth=3)
if label == 'green':
plt.plot(zhu_x,zhu_y,color='green',linewidth=3)
plt.plot(zuo_x,zuo_y,color='black',linewidth=3)
plt.plot(you_x,you_y,color='black',linewidth=3)
plt.xlim(-0.8,1.5)
plt.ylim(-0.8,1.5)
plt.xticks(np.arange(-0.8,1.5,0.2))
plt.yticks(np.arange(-0.8,1.5,0.2))
# 去掉一个分叉的每个分支
def get_fencha(data):
zhu_x = data[0]
zuo_x = data[1]
you_x = data[2]
zhu_y = data[3]
zuo_y = data[4]
you_y = data[5]
zhu_diam = [data[6]]
zuo_diam = [data[7]]
you_diam = [data[8]]
return zhu_x,zuo_x,you_x,zhu_y,zuo_y,you_y,zhu_diam,zuo_diam,you_diam
segment = 'zhu' # 'zuo','you'
# 得到每个分叉结点坐标
def get_node(data,segment):
if segment == 'zhu':
nodeStartX = data[0][0]
nodeEndX = data[0][-1]
nodeStartY = data[3][0]
nodeEndY = data[3][-1]
if segment == 'zuo':
nodeStartX = data[1][0]
nodeEndX = data[1][-1]
nodeStartY = data[4][0]
nodeEndY = data[4][-1]
if segment == 'you':
nodeStartX = data[2][0]
nodeEndX = data[2][-1]
nodeStartY = data[5][0]
nodeEndY = data[5][-1]
return nodeStartX,nodeStartY,nodeEndX,nodeEndY
# 得到 第二个结点和倒数第二个结点
def get_other_node(data,segment):
if segment == 'zhu':
nodeStartX = data[0][0]
nodeTwoX = data[0][1]
nodeLastTwoX = data[0][-2]
nodeStartY = data[3][0]
nodeTwoY = data[3][1]
nodeLastTwoY = data[3][-2]
if segment == 'zuo':
nodeStartX = data[1][0]
nodeTwoX = data[1][1]
nodeLastTwoX = data[1][-2]
nodeStartY = data[4][0]
nodeTwoY = data[4][1]
nodeLastTwoY = data[4][-2]
if segment == 'you':
nodeStartX = data[2][0]
nodeTwoX = data[2][1]
nodeLastTwoX = data[2][-2]
nodeStartY = data[5][0]
nodeTwoY = data[5][1]
nodeLastTwoY = data[5][-2]
return nodeStartX,nodeStartY,nodeTwoX,nodeTwoY,nodeLastTwoX,nodeLastTwoY
# # 得到 第二个结点和倒数第二个结点
# def get_other_node(data,segment):
# if segment == 'zhu':
# nodeStartX = data[0][0]
# nodeTwoX = data[0][2]
# nodeLastTwoX = data[0][-3]
# nodeStartY = data[3][0]
# nodeTwoY = data[3][2]
# nodeLastTwoY = data[3][-3]
# if segment == 'zuo':
# nodeStartX = data[1][0]
# nodeTwoX = data[1][2]
# nodeLastTwoX = data[1][-3]
# nodeStartY = data[4][0]
# nodeTwoY = data[4][2]
# nodeLastTwoY = data[4][-3]
# if segment == 'you':
# nodeStartX = data[2][0]
# nodeTwoX = data[2][2]
# nodeLastTwoX = data[2][-3]
# nodeStartY = data[5][0]
# nodeTwoY = data[5][2]
# nodeLastTwoY = data[5][-3]
# return nodeStartX,nodeStartY,nodeTwoX,nodeTwoY,nodeLastTwoX,nodeLastTwoY
# 将两个分叉移动到结点相同位置
def remove_fencha(data1,data2,segment):
# 以data1为固定分叉,data2往上拼接
nodeStartX1,nodeStartY1, _, _ = get_node(data1,segment)
_, _, nodeEndX2,nodeEndY2 = get_node(data2,segment)
disc_x = nodeEndX2 - nodeStartX1
disc_y = nodeEndY2 - nodeStartY1
copyData2 = copy.deepcopy(data2)
copyData2[0:3] = copyData2[0:3] - disc_x
copyData2[3:6] = copyData2[3:6] - disc_y
removeData = copyData2
return removeData
# 拼接图像
sample = data[6]
# 计算结点与x正半轴夹角
def get_angles(startNodeX,startNodeY,endNodeX,endNodeY):
# 以点startNodeX,startNodeY为原点不能随意反转他们的顺序
if endNodeX>=startNodeX and endNodeY>=startNodeY:
angle = math.degrees(np.arctan(abs(endNodeY-startNodeY)/abs(endNodeX-startNodeX)))
if endNodeX=startNodeY:
angle = math.degrees(np.arctan(abs(endNodeY-startNodeY)/abs(endNodeX-startNodeX)))
angle = 180 - angle
if endNodeX
1636984416
查看更多评论