diff --git a/cmd/proc.go b/cmd/proc.go index 635a64b..2dba148 100644 --- a/cmd/proc.go +++ b/cmd/proc.go @@ -45,20 +45,20 @@ var procCmd = &cobra.Command{ calculator.EOP = calculator.NewEOPTable() calculator.EOP.Load(eopData, eopp5Line) - reg := producer.NewRegistrator(producer.DownSampled) - reg.Params = initParams() + processor := producer.NewImgProc(producer.DownSampled) + processor.Params = initParams() - if err := reg.LoadAuxData(); err != nil { + if err := processor.LoadAuxData(); err != nil { logrus.Fatal(err) } // reg.AuxPrint() - if err := reg.LoadMssRaw(); err != nil { + if err := processor.LoadMssRaw(); err != nil { logrus.Fatal(err) } - if err := reg.LoadPanRaw(); err != nil { + if err := processor.LoadPanRaw(); err != nil { logrus.Fatal(err) } @@ -71,14 +71,14 @@ var procCmd = &cobra.Command{ os.MkdirAll(params.OutputDir, 0755) if doLUTRRC { - reg.DoRRCbyLUT(lutDir) + processor.DoRRCbyLUT(lutDir) } if doMomentMatching { - reg.DoMomentMatching() + processor.DoMomentMatching() } - if err := reg.DoPhaseCorrelation(); err != nil { + if err := processor.DoPhaseCorrelation(); err != nil { logrus.Fatal(err) } @@ -87,33 +87,33 @@ var procCmd = &cobra.Command{ params.OutputDir, strings.TrimSuffix(filepath.Base(params.MssRawFile), filepath.Ext(params.MssRawFile))+"_registered.RAW", ) - reg.SaveRegisteredMssToRaw(registerdMSSRAW) + processor.SaveRegisteredMssToRaw(registerdMSSRAW) } runtime.GC() - panScenes, mssScenes, err := reg.SubScenes() + panScenes, mssScenes, err := processor.SubScenes() if err != nil { logrus.Error(err) } - reg.OutputL1A(panScenes, mssScenes) + processor.OutputL1A(panScenes, mssScenes) producer.CleanScenes(panScenes) producer.CleanScenes(mssScenes) runtime.GC() if saveStrip { - reg.SaveOriginalPanToGDALGTiff(reg.Params.PanTiffFile) - reg.SaveRegisteredMssToGDALGTiff(reg.Params.MssTiffFile) + processor.SaveOriginalPanToGDALGTiff(processor.Params.PanTiffFile) + processor.SaveRegisteredMssToGDALGTiff(processor.Params.MssTiffFile) } - if reg.Params.DoPansharpen { - reg.DoScenePansharpen(panScenes, mssScenes) + if processor.Params.DoPansharpen { + processor.DoScenePansharpen(panScenes, mssScenes) } - reg.Report() + processor.Report() - reg.Clean() + processor.Clean() }, } diff --git a/pkg/producer/aux.go b/pkg/producer/aux.go index db2bb55..f278175 100644 --- a/pkg/producer/aux.go +++ b/pkg/producer/aux.go @@ -21,7 +21,7 @@ import ( "starwiz.cn/sjy01/image-proc/pkg/config" ) -func (r *Registrator) LoadAuxData() error { +func (r *ImgProc) LoadAuxData() error { var err error r.auxHeads, r.auxBoxes, r.AuxPlatforms, err = auxilary.ExtractAux(r.Params.AuxRawFile) @@ -37,7 +37,7 @@ func (r *Registrator) LoadAuxData() error { } // 数据校验和测试 -func (r *Registrator) AuxPrint() { +func (r *ImgProc) AuxPrint() { var fcPos84 geojson.FeatureCollection var fcPos84Interp geojson.FeatureCollection for _, p := range r.AuxPlatforms { @@ -63,7 +63,7 @@ func (r *Registrator) AuxPrint() { f.Write(data) } -func (r *Registrator) SceneImageTime(scene *Scene) (start, center, end time.Time) { +func (r *ImgProc) SceneImageTime(scene *Scene) (start, center, end time.Time) { startPosInAux, endPosInAux := r.SceneInAuxIndex(scene) centerPosInAux := (startPosInAux + endPosInAux) / 2 @@ -78,7 +78,7 @@ func (r *Registrator) SceneImageTime(scene *Scene) (start, center, end time.Time } // FIXME: This function is not accurate enough. 四元数、成像时刻、GPS 等需要修改为插值获取 -func (r *Registrator) ComputeMetaAndRPC(scene *Scene) (topLeft, bottomRight orb.Point) { +func (r *ImgProc) ComputeMetaAndRPC(scene *Scene) (topLeft, bottomRight orb.Point) { log.Info("using attitude quaternion to calculate image boundary...") line0Start := r.calculateLatLonH(scene, 0, 0, 0) line0End := r.calculateLatLonH(scene, 0, scene.Width, 0) @@ -169,13 +169,13 @@ func (r *Registrator) ComputeMetaAndRPC(scene *Scene) (topLeft, bottomRight orb. return } -func (r *Registrator) SceneInAuxIndex(scene *Scene) (int, int) { +func (r *ImgProc) SceneInAuxIndex(scene *Scene) (int, int) { startPosInAux := r.sceneOffsetInAuxIndex(scene, 0) endPosInAux := r.sceneOffsetInAuxIndex(scene, scene.Height) return startPosInAux, endPosInAux } -func (r *Registrator) sceneOffsetInAuxIndex(scene *Scene, offset int) int { +func (r *ImgProc) sceneOffsetInAuxIndex(scene *Scene, offset int) int { var auxForImageRow int switch scene.Type { case "MSS": @@ -194,7 +194,7 @@ func (r *Registrator) sceneOffsetInAuxIndex(scene *Scene, offset int) int { } // row, col 相对于图像景左上角, H 为地面目标点高度 -func (r *Registrator) calculateLatLonH(scene *Scene, row, col, H int) calculator.IntersectionPoint { +func (r *ImgProc) calculateLatLonH(scene *Scene, row, col, H int) calculator.IntersectionPoint { // 内插值获取图像行时刻 ucam := col cross := 16 diff --git a/pkg/producer/dark_bias.go b/pkg/producer/dark_bias.go index 815c2c7..ed5adff 100644 --- a/pkg/producer/dark_bias.go +++ b/pkg/producer/dark_bias.go @@ -1,11 +1,11 @@ package producer const ( - DarkBiasValue = 15675.0/6 + DarkBiasValue = 15675.0 / 6 ) // 暗场偏置校正 固定值15675校正 -func (r *Registrator) DoDarkBiasCorrection() { +func (r *ImgProc) DoDarkBiasCorrection() { r.PanImage.SubtractFloat(DarkBiasValue) for i := 0; i < len(r.registeredMssImages); i++ { r.registeredMssImages[i].SubtractFloat(DarkBiasValue) diff --git a/pkg/producer/image_registration.go b/pkg/producer/image_registration.go index 9eeed2f..e84af09 100644 --- a/pkg/producer/image_registration.go +++ b/pkg/producer/image_registration.go @@ -37,7 +37,7 @@ const ( type ResampleMethod string -type Registrator struct { +type ImgProc struct { Params Params PanImage gocv.Mat @@ -69,14 +69,14 @@ type Registrator struct { report Report } -func NewRegistrator(rsmethod ResampleMethod) *Registrator { - var r Registrator +func NewImgProc(rsmethod ResampleMethod) *ImgProc { + var r ImgProc r.resampleMethod = rsmethod return &r } -func (r *Registrator) LoadPanRaw() error { +func (r *ImgProc) LoadPanRaw() error { data, err := os.ReadFile(r.Params.PanRawFile) if err != nil { log.Error("Error reading raw file: ", err) @@ -111,7 +111,7 @@ func (r *Registrator) LoadPanRaw() error { return nil } -func (r *Registrator) LoadMssRaw() error { +func (r *ImgProc) LoadMssRaw() error { data, err := os.ReadFile(r.Params.MssRawFile) if err != nil { log.Error("Error reading raw file: ", err) @@ -141,7 +141,7 @@ func (r *Registrator) LoadMssRaw() error { return nil } -func (r *Registrator) DoPhaseCorrelation() error { +func (r *ImgProc) DoPhaseCorrelation() error { switch r.resampleMethod { case UpSampled: return r.CalcUpPhaseCorrelation() @@ -151,7 +151,7 @@ func (r *Registrator) DoPhaseCorrelation() error { } // 将PAN降采样后计算相位相关的偏移量 -func (r *Registrator) CalcDownPhaseCorrelation() error { +func (r *ImgProc) CalcDownPhaseCorrelation() error { // 确保 MSS 高度是 PAN 高度的 1/4 if r.MssHeight*4 != r.PanHeight { err := fmt.Errorf("MSS height is not 1/4 of PAN height, invalid raw file") @@ -209,7 +209,7 @@ func (r *Registrator) CalcDownPhaseCorrelation() error { } // 将MSS升采样采样后计算相位相关的偏移量 -func (r *Registrator) CalcUpPhaseCorrelation() error { +func (r *ImgProc) CalcUpPhaseCorrelation() error { log.Fatal("unsuppotted up-resample method") // 确保 MSS 高度是 PAN 高度的 1/4 if r.MssHeight*4 != r.PanHeight { @@ -249,7 +249,7 @@ func (r *Registrator) CalcUpPhaseCorrelation() error { return r.DoPANCoRegistration() } -func (r *Registrator) doPhaseCorrelation(base gocv.Mat, +func (r *ImgProc) doPhaseCorrelation(base gocv.Mat, mssImages []gocv.Mat, height, width, blockHeight, blockWidth int) error { @@ -327,7 +327,7 @@ func (r *Registrator) doPhaseCorrelation(base gocv.Mat, return nil } -func (r *Registrator) Clean() { +func (r *ImgProc) Clean() { r.PanImage.Close() for i := 0; i < MssBands; i++ { r.MssImages[i].Close() @@ -340,7 +340,7 @@ func (r *Registrator) Clean() { r.rgbirImage.Close() } -func (r *Registrator) calcMSSDeltaCoeffs(bands int) error { +func (r *ImgProc) calcMSSDeltaCoeffs(bands int) error { // 计算每个通道的delta多项式拟合系数 for i := 0; i < bands; i++ { var cx []float64 @@ -397,7 +397,7 @@ func (r *Registrator) calcMSSDeltaCoeffs(bands int) error { return nil } -func (r *Registrator) DoMSSCoRegistration(byEdge bool) error { +func (r *ImgProc) DoMSSCoRegistration(byEdge bool) error { for band := 0; band < MssBands; band++ { if len(r.deltaXCoeffs[band]) < 2 || len(r.deltaYCoeffs[band]) < 3 { log.Errorf("delta coefficients not calculated, skip co-registration %d", band+1) @@ -456,7 +456,7 @@ func (r *Registrator) DoMSSCoRegistration(byEdge bool) error { return nil } -func (r *Registrator) DoPANCoRegistration() error { +func (r *ImgProc) DoPANCoRegistration() error { if len(r.deltaXCoeffs[0]) < 2 || len(r.deltaYCoeffs[0]) < 3 { log.Error("delta coefficients not calculated, skip co-registration") return nil diff --git a/pkg/producer/meta.go b/pkg/producer/meta.go index 8b7d2c5..48fa396 100644 --- a/pkg/producer/meta.go +++ b/pkg/producer/meta.go @@ -72,7 +72,7 @@ func (corners Corners) Extend() (lng1, lat1, lng2, lat2 float64) { return } -func (r *Registrator) makeProductMeta(scene *Scene) *ProductMeta { +func (r *ImgProc) makeProductMeta(scene *Scene) *ProductMeta { meta := &ProductMeta{ Satellite: "SJY01", Sensor: "PMS", diff --git a/pkg/producer/output.go b/pkg/producer/output.go index 0bf1fb6..6f67010 100644 --- a/pkg/producer/output.go +++ b/pkg/producer/output.go @@ -13,7 +13,7 @@ import ( "starwiz.cn/sjy01/image-proc/pkg/utils" ) -func (r *Registrator) SaveOriginalPanToGDALGTiff(tiffFile string) error { +func (r *ImgProc) SaveOriginalPanToGDALGTiff(tiffFile string) error { err := utils.SavePanToGDALGTiff(r.PanImage, 0, 0, tiffFile, PanResolution) if err != nil { return err @@ -22,7 +22,7 @@ func (r *Registrator) SaveOriginalPanToGDALGTiff(tiffFile string) error { return nil } -func (r *Registrator) SaveRegisteredMssToGDALGTiff(tiffFile string) error { +func (r *ImgProc) SaveRegisteredMssToGDALGTiff(tiffFile string) error { r.rgbirImage = gocv.NewMat() gocv.Merge(r.registeredMssImages[:], &r.rgbirImage) @@ -37,7 +37,7 @@ func (r *Registrator) SaveRegisteredMssToGDALGTiff(tiffFile string) error { return nil } -func (r *Registrator) BytesToRaw(mssData []byte, filePath string) error { +func (r *ImgProc) BytesToRaw(mssData []byte, filePath string) error { f, err := os.OpenFile(filePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777) if err != nil { return err @@ -48,15 +48,15 @@ func (r *Registrator) BytesToRaw(mssData []byte, filePath string) error { return nil } -func (r *Registrator) SaveRegisteredMssToRaw(raw string) error { +func (r *ImgProc) SaveRegisteredMssToRaw(raw string) error { return saveRegisteredMssToRaw(raw, r.registeredMssImages) } -func (r *Registrator) Report() error { +func (r *ImgProc) Report() error { return WriteReport(&r.report, r.Params.ReportFile) } -func (r *Registrator) rpcKeywordInTif() { +func (r *ImgProc) rpcKeywordInTif() { // GDAL库对应的RPC关键词 // keys := []string{ // "ERR_BIAS", "ERR_RAND", diff --git a/pkg/producer/phase_correlation.go b/pkg/producer/phase_correlation.go index 9ffb3fe..5f8ff46 100644 --- a/pkg/producer/phase_correlation.go +++ b/pkg/producer/phase_correlation.go @@ -22,7 +22,7 @@ type Block struct { coord image.Point // top-left corner of the block in the original image } -func (r *Registrator) calculateBlockPhaseShift(panBlock, mssBlock gocv.Mat) (gocv.Point2f, float64) { +func (r *ImgProc) calculateBlockPhaseShift(panBlock, mssBlock gocv.Mat) (gocv.Point2f, float64) { pan := gocv.NewMat() mss := gocv.NewMat() @@ -43,7 +43,7 @@ func (r *Registrator) calculateBlockPhaseShift(panBlock, mssBlock gocv.Mat) (goc return shift, response } -func (r *Registrator) fileterPhaseShift(thredholds []float64, greaterThan bool) error { +func (r *ImgProc) fileterPhaseShift(thredholds []float64, greaterThan bool) error { if len(thredholds) > 4 { return errors.New("thredholds length should be less than 4") } diff --git a/pkg/producer/rpc.go b/pkg/producer/rpc.go index 3eec078..d87d803 100644 --- a/pkg/producer/rpc.go +++ b/pkg/producer/rpc.go @@ -32,7 +32,7 @@ type RPC struct { gridsize int scene *Scene - registrator *Registrator + registrator *ImgProc } // GroundPoint 表示地面点的三维坐标 @@ -53,7 +53,7 @@ type RPCModel struct { } // rational polynomial coeffients -func NewRPC(r *Registrator, scene *Scene) *RPC { +func NewRPC(r *ImgProc, scene *Scene) *RPC { rpc := RPC{ elevationLayer: config.GCONFIG.RPC.AltitudeLayer, gridsize: config.GCONFIG.RPC.GridSize, diff --git a/pkg/producer/rrc.go b/pkg/producer/rrc.go index 016dd19..1a9ee76 100644 --- a/pkg/producer/rrc.go +++ b/pkg/producer/rrc.go @@ -9,7 +9,7 @@ import ( "starwiz.cn/sjy01/image-proc/pkg/rrc" ) -func (r *Registrator) DoRRCbyLUT(lutDir string) error { +func (r *ImgProc) DoRRCbyLUT(lutDir string) error { logrus.Printf("try to do RRC [%s]...", lutDir) lutPAN, err := rrc.LoadLUT(filepath.Join(lutDir, "B0.LUT"), 9344) if err != nil { @@ -42,7 +42,7 @@ func (r *Registrator) DoRRCbyLUT(lutDir string) error { return nil } -func (r *Registrator) DoMomentMatching() error { +func (r *ImgProc) DoMomentMatching() error { rrc.DoMomentMatching(r.PanImage) for i := 0; i < 4; i++ { rrc.DoMomentMatching(r.MssImages[i]) diff --git a/pkg/producer/scenes.go b/pkg/producer/scenes.go index da15bd2..de06212 100644 --- a/pkg/producer/scenes.go +++ b/pkg/producer/scenes.go @@ -50,7 +50,7 @@ func CleanScenes(scenes []*Scene) { // 默认分景大小: // MSS 2336 * 2336 - 1764 // PAN 9344 * 9344 - 7056 -func (r *Registrator) SubScenes() (panScenes []*Scene, mssScenes []*Scene, err error) { +func (r *ImgProc) SubScenes() (panScenes []*Scene, mssScenes []*Scene, err error) { if len(r.Params.Targets.Targets) > 0 && r.Params.Targets.Targets[0].EndLine > 0 { return r.RoiScenes() } @@ -159,7 +159,7 @@ func (r *Registrator) SubScenes() (panScenes []*Scene, mssScenes []*Scene, err e return panScenes, mssScenes, err } -func (r *Registrator) OutputL1A(panScenes []*Scene, mssScenes []*Scene) error { +func (r *ImgProc) OutputL1A(panScenes []*Scene, mssScenes []*Scene) error { var fc geojson.FeatureCollection for i, scene := range panScenes { dir := filepath.Join(r.Params.OutputDir, scene.SceneIndex, "PAN") @@ -247,7 +247,7 @@ func (r *Registrator) OutputL1A(panScenes []*Scene, mssScenes []*Scene) error { return nil } -func (r *Registrator) DoScenePansharpen(panScenes []*Scene, mssScenes []*Scene) error { +func (r *ImgProc) DoScenePansharpen(panScenes []*Scene, mssScenes []*Scene) error { for i := 0; i < len(panScenes); i++ { fusedTiff := strings.Replace(mssScenes[i].Tiff, "MSS", "FUS", -1) err := fusion.Pansharpen(panScenes[i].Tiff, mssScenes[i].Tiff, fusedTiff, fusion.ESRI, 0.1) @@ -266,7 +266,7 @@ func (r *Registrator) DoScenePansharpen(panScenes []*Scene, mssScenes []*Scene) return nil } -func (r *Registrator) MergeMSSToBGRNIR(channels []gocv.Mat) (gocv.Mat, error) { +func (r *ImgProc) MergeMSSToBGRNIR(channels []gocv.Mat) (gocv.Mat, error) { var rgbirImage gocv.Mat if len(channels) != 4 { return rgbirImage, fmt.Errorf("mss channels count not match") @@ -281,7 +281,7 @@ func (r *Registrator) MergeMSSToBGRNIR(channels []gocv.Mat) (gocv.Mat, error) { } -func (r *Registrator) RoiScenes() (panScenes []*Scene, mssScenes []*Scene, err error) { +func (r *ImgProc) RoiScenes() (panScenes []*Scene, mssScenes []*Scene, err error) { log.Println("using target scenes") for _, target := range r.Params.Targets.Targets { y0 := 4 * target.StartLine