# 1.去掉重叠部分
|
# 2.将数据和标准数据对比,旋转角度和平移使之初步重合
|
|
import pandas as pd
|
import numpy as np
|
import scipy.linalg as linalg
|
import scipy.spatial.distance as dis
|
import matplotlib.pyplot as plt
|
import math
|
import cv2
|
|
|
# 计算距离矩阵
|
def EuclideanDistances(A, B):
|
BT = B.transpose()
|
vecProd = A * BT
|
SqA = A.getA()**2
|
sumSqA = np.matrix(np.sum(SqA, axis=1))
|
sumSqAEx = np.tile(sumSqA.transpose(), (1, vecProd.shape[1]))
|
SqB = B.getA()**2
|
sumSqB = np.sum(SqB, axis=1)
|
sumSqBEx = np.tile(sumSqB, (vecProd.shape[0], 1))
|
SqED = sumSqBEx + sumSqAEx - 2*vecProd
|
ED = (SqED.getA())**0.5
|
return np.matrix(ED)
|
|
|
standard = pd.read_csv("D:\\standard.csv")
|
standardArray = np.array(standard).transpose()
|
data = pd.read_csv("D:\\Level1.csv")
|
|
# **************************去掉重叠部分*******************************
|
A = np.matrix(np.array(data[(data["0"].index % 2 == 0) & (data["0"] > 4000) & (data["0"] <61000)])[:,1:4:2])
|
B = np.matrix(np.array(data[(data["0"].index % 2 == 1) & (data["0"] > 4000) & (data["0"] <61000)])[:,1:4:2])
|
C = np.matrix(np.array(data[(data["0"] <= 4000) | (data["0"] >=61000)])[:,1:4:2])
|
|
# 根据距离计算
|
#distanceMatrix = EuclideanDistances(A , B)
|
#print(distanceMatrix)
|
#print(distanceMatrix.shape)
|
#overlapIndex = np.argwhere(distanceMatrix.diagonal()<5)
|
|
# 根据Y方向偏差计算
|
if(A.shape[0] > B.shape[0]):
|
A = np.delete(A,A.shape[0]-1,0)
|
else:
|
if(A.shape[0] < B.shape[0]):
|
B = np.delete(B,B.shape[0]-1,0)
|
yoffset = (A - B)[:,1]
|
overlapIndex =np.argwhere(np.abs(yoffset)>2.5)[:,0]
|
A = np.delete(A,overlapIndex,0)
|
D = np.r_[A,B,C]
|
|
#plt.scatter(D[:,0].getA(),D[:,1].getA(),color='r')
|
#plt.grid()
|
#plt.show()
|
# *********************************************************************
|
|
|
#dataArray = np.array(data).transpose()[1:4:2,:]/1000
|
dataArray = np.array(D).transpose()/1000
|
mirroring = np.array([[1,0],[0,-1]])
|
dataMirroring = mirroring.dot(dataArray)
|
|
# 只取第一个数据x方向
|
mean_x = dataMirroring.mean(axis = 1)[0]
|
mean_x_s = standardArray.mean(axis = 1)[0]
|
dataFrameMirroring = pd.DataFrame(dataMirroring.transpose())
|
dataLine = np.array(dataFrameMirroring[(dataFrameMirroring[0] > 20) & (dataFrameMirroring[0] < 50)]).transpose()
|
dataLine_s = np.array(standard[(standard['0'] > 260) & (standard['0'] < 290)]).transpose()
|
|
# 只取y方向
|
mean_y = dataLine.mean(axis =1)[1]
|
mean_y_s = dataLine_s.mean(axis = 1)[1]
|
|
p = np.poly1d(np.polyfit(dataLine[0,:],dataLine[1,:],1))
|
yval = p(dataLine[0,:])
|
p_s = np.poly1d(np.polyfit(dataLine_s[0,:],dataLine_s[1,:],1))
|
|
phi = math.atan(p[1])*180/math.pi
|
rotateMatrix = cv2.getRotationMatrix2D((mean_x,mean_y),phi,1)
|
dataTrans1 = rotateMatrix.dot(np.r_[dataMirroring,np.ones(dataMirroring.shape[1]).reshape(1,dataMirroring.shape[1])])
|
transMatrix = np.array([[1,0,mean_x_s - mean_x],[0,1,mean_y_s - mean_y]])
|
dataTrans2 = transMatrix.dot(np.r_[dataTrans1,np.ones(dataTrans1.shape[1]).reshape(1,dataTrans1.shape[1])])
|
|
dataFrameTrans2 = pd.DataFrame(dataTrans2.transpose())
|
dataFrameTrans2[dataFrameTrans2[1]>443.71].to_csv("D:\\Level1Trans.csv")
|
|
plt.figure()
|
|
plt.scatter(dataTrans2[0,:] , dataTrans2[1,:])
|
plt.plot(standardArray[0,:] , standardArray[1,:],color='r')
|
|
plt.show()
|