def PlotMoments(self): data = self.canvas.img.get_array() pm = self.procMoment # data=ndi.median_filter(data, 3) try: data.ravel()[pm.mskIdx] = 0 except AttributeError as e: print(e) try: data = data[pm.roi] except AttributeError as e: print(e) # data=np.log(data+1) # data[100:110,500:510]=1000 #y,x # data[650:850,700:850]=0 #y,x # pm.Process(np.log(data+1)) pm.Process(data) xbar, ybar, cov = pm.GetIntertialAxis() m = pm.resArr m00 = m[0] m01 = m[1] m10 = m[2] m11 = m[3] m02 = m[4] m20 = m[5] xm = m10 / m00 ym = m01 / m00 u11 = (m11 - xm * m01) / m00 # u11[u11<0.]=0. #processing rounding error u20 = (m20 - xm * m10) / m00 u02 = (m02 - ym * m01) / m00 a = (u20 + u02) / 2 b = np.sqrt(4 * u11**2 + (u20 - u02)**2) / 2 l0 = a + b l1 = a - b ang = 0.5 * np.arctan2( 2 * u11, (u20 - u02)) / (2 * np.pi) * 360.0 # orientation value 0..1 exc = np.sqrt( 1 - l1 / l0 ) # eccentricity :circle=0: http://en.wikipedia.org/wiki/Eccentricity_%28mathematics%29 print("xb:%g yb:%g cov:%g %g %g %g ang:%g exc:%g" % ((xm, ym) + tuple(cov.ravel()) + (ang, exc))) # fig, ax = plt.subplots() # ax.imshow(data,vmax=100,interpolation='nearest') # plt.show() ax = self.canvas.img.get_axes() try: for o in self.goMoment: o.remove() except AttributeError: pass self.goMoment = ProcMoment.PlotMoments(ax, xbar, ybar, cov) ax.axis("image")
def OnShowMoments(self, event): if event.IsChecked(): dlg = wx.FileDialog( self, "Choose valid mask file (e.g. pilatus_valid_mask.mat)", os.getcwd(), "", "MATLAB files (*.mat)|*.mat|all (*.*)|*.*", wx.FD_OPEN | wx.FD_CHANGE_DIR, ) if dlg.ShowModal() == wx.ID_OK: fnMatMsk = dlg.GetPath() print("OnOpen", fnMatMsk) dlg.Destroy() if not fnMatMsk: return # fnMatMsk='/scratch/detectorData/cSAXS_2013_10_e14608_georgiadis_3D_for_Marianne/analysis/data/pilatus_valid_mask.mat' self.procMoment = pm = ProcMoment() pm.SetMskMat(fnMatMsk, False) # roi=[603, 826, 200, 200] # pm.roi=(slice(roi[1],roi[1]+roi[3]),slice(roi[0],roi[0]+roi[2])) # pm.shape=(roi[3],roi[2]) # pm.SetProcess('python') # pm.SetProcess('pyFast') pm.SetProcess("c") self.PlotMoments() # self.canvas.img.draw() data = self.canvas.img.get_array() self.canvas.img.set_array(data) fig, ax = plt.subplots(2) v = data.sum(axis=0) x = np.arange(v.size) x0 = x.sum() m0 = v.sum() m1 = (v * x).sum() m2 = (v * x * x).sum() ax[0].plot(v) m = m1 / m0 s = np.sqrt((m2 - (m1**2 / m0)) / m0) xx = 1 / (s * np.sqrt(2 * np.pi)) * np.exp(-0.5 * ((x - m) / s)**2) ax[0].set_title("%g | %g | %g | %g | %g" % (m0, m1, m2, m, s)) ax[0].hold(True) ax[0].plot(xx * m0) v = data.sum(axis=1) ax[1].plot(v) plt.show() # print pm.resArr[0:3],pm.resArr[1]/pm.resArr[0],pm.resArr[2]/pm.resArr[0] else: for o in self.goMoment: o.remove() del self.goMoment del self.procMoment self.canvas.draw()