From 7d9ec467507d39b030cd04f575a145e0b6905b7e Mon Sep 17 00:00:00 2001 From: nuknal Date: Thu, 30 May 2024 09:17:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E4=BA=91=E6=97=B6=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E9=85=8D=E5=87=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/log.go | 2 +- cmd/proc.go | 15 +++++++++----- producer/gdal_pansharpen.go | 2 +- producer/image_proc_test.go | 12 +++++------ producer/image_registration.go | 38 ++++++++++++++++++++++++---------- producer/jpg.go | 6 +++--- producer/output.go | 14 +++++++++++-- producer/phase_correlation.go | 2 +- producer/scenes.go | 11 +++++++++- run.sh | 2 ++ 10 files changed, 73 insertions(+), 31 deletions(-) diff --git a/cmd/log.go b/cmd/log.go index e702f0e..4a17b9e 100644 --- a/cmd/log.go +++ b/cmd/log.go @@ -49,7 +49,7 @@ func init() { DisableColors: true, } - configureLogger(logrus.StandardLogger(), "log/SJY01-imgproc.log", logrus.InfoLevel) + configureLogger(logrus.StandardLogger(), "log/SJY01-imgproc.log", logrus.DebugLevel) } func NewLogger(logfile string) *logrus.Logger { diff --git a/cmd/proc.go b/cmd/proc.go index 22e3221..5ad8cb6 100644 --- a/cmd/proc.go +++ b/cmd/proc.go @@ -6,13 +6,14 @@ import ( "strings" "github.com/airbusgeo/godal" - log "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/spf13/cobra" producer "starwiz.cn/sjy01/image-proc/producer" ) var ( - params producer.Params + params producer.Params + saveStrip bool ) var procCmd = &cobra.Command{ @@ -52,12 +53,15 @@ var procCmd = &cobra.Command{ panScenes, mssScenes, err := reg.SubScenes() if err != nil { - log.Error(err) + logrus.Error(err) } reg.SaveScenesToTiff(panScenes, mssScenes) - // reg.SaveOriginalPanToGDALGTiff(reg.Params.PanTiffFile) - // reg.SaveRegisteredMssToGDALGTiff(reg.Params.MssTiffFile) + + if saveStrip { + reg.SaveOriginalPanToGDALGTiff(reg.Params.PanTiffFile) + reg.SaveRegisteredMssToGDALGTiff(reg.Params.MssTiffFile) + } if params.PansharpenIHS { reg.DoScenePansharpen(panScenes, mssScenes) @@ -77,4 +81,5 @@ func init() { procCmd.Flags().BoolVarP(¶ms.PansharpenIHS, "fus", "", false, "pansharpen using IHS") procCmd.Flags().StringVarP(¶ms.OutputDir, "output-dir", "o", "data", "output directory") procCmd.Flags().BoolVarP(¶ms.SubScenes, "sub-scenes", "", false, "process sub-scenes") + procCmd.Flags().BoolVarP(&saveStrip, "save-strip", "", false, "save original and registered images as GDAL GTiff") } diff --git a/producer/gdal_pansharpen.go b/producer/gdal_pansharpen.go index 09a4e15..afc4ec6 100644 --- a/producer/gdal_pansharpen.go +++ b/producer/gdal_pansharpen.go @@ -86,7 +86,7 @@ func GDALPansharpen(panTiff, mssTiff string) (string, error) { fusedTIff := strings.Replace(mssTiff, "MSS", "FUS", 1) // pansharpenCmd := exec.Command("gdal_pansharpen.py", "-w 0.6 -w 0.1 -w 0.3 -w 0 -b 3 -b 2 -b 1", panTiff, mssTiff, fusedTIff, "-r cubic", "-of GTiff") pansharpenCmd := exec.Command("gdal_pansharpen.py", - "-w", "0.6", "-w", "0.1", "-w", "0.3", "-w", "0", + "-w", "0.4", "-w", "0.2", "-w", "0.4", "-w", "0", "-b", "3", "-b", "2", "-b", "1", "-r", "cubic", "-of", "GTiff", panTiff, diff --git a/producer/image_proc_test.go b/producer/image_proc_test.go index d9d0b5c..4447da3 100644 --- a/producer/image_proc_test.go +++ b/producer/image_proc_test.go @@ -25,12 +25,12 @@ func TestGTiffToJPG(t *testing.T) { t.Error(err) } - tiff = "../data/051622/006/SJY01_PAN_20240516_101236_051622_096_006.tiff" - jpg = "../data/051622/006/SJY01_PAN_20240516_101236_051622_096_006.jpg" - err = GTiffToJPG(tiff, jpg, false) - if err != nil { - t.Error(err) - } + // tiff = "../data/051622/006/SJY01_PAN_20240516_101236_051622_096_006.tiff" + // jpg = "../data/051622/006/SJY01_PAN_20240516_101236_051622_096_006.jpg" + // err = GTiffToJPG(tiff, jpg, false) + // if err != nil { + // t.Error(err) + // } tiff = "../data/051622/006/SJY01_FUS_20240516_101236_051622_096_006.tiff" jpg = "../data/051622/006/SJY01_FUS_20240516_101236_051622_096_006.jpg" diff --git a/producer/image_registration.go b/producer/image_registration.go index aab3c64..188abc1 100644 --- a/producer/image_registration.go +++ b/producer/image_registration.go @@ -21,7 +21,7 @@ const ( PanWidth = 9344 // 像素宽度 MssWidth = 2336 BlockNH = 4 - BlockNW = 16 + BlockNW = 8 OverlappedBlockLines = 3000 // 重叠块的行数 DownSampled ResampleMethod = "down_sample_pan" UpSampled ResampleMethod = "up_sample_mss" @@ -221,7 +221,7 @@ func (r *Registrator) calcPhaseCorrelation(panImage gocv.Mat, panBlock := panImage.Region(rect) for band := 0; band < MssBands; band++ { - log.Debug("Band", band+1, ", processing block", bh, rect) + log.Debug("processing band:", band+1, ",block:", bh, rect) mssBlock := mssImages[band].Region(rect) // 处理每个分块 @@ -287,25 +287,35 @@ func (r *Registrator) calcDeltaCoeffs() error { effectShift++ cx = append(cx, float64(shift.Block.coord.X+shift.Block.width/2)) // MSS 块在X方向没有分块 - log.Debug("effective shift value:", effectShift, "cx:", shift.Block.coord.X, "dy:", shift.dy) + log.Debugf("effective shift value: %v, cx: %v, dx: %v, dy: %v", + effectShift, shift.Block.coord.X, shift.dx, shift.dy) dx = append(dx, float64(shift.dx)) dy = append(dy, float64(shift.dy)) } - var err error - if r.deltaXCoeffs[i], err = PolynomialFit(cx, dx, 1); err != nil { - log.Error("Error fitting deltaX coeffs: ", err) - return err - } + if len(cx) < 3 { + log.Errorf("No effective shift value found for band %d, skip delta coefficients calculation", i+1) + continue + } else { + var err error + if r.deltaXCoeffs[i], err = PolynomialFit(cx, dx, 1); err != nil { + log.Error("Error fitting deltaX coeffs: ", err) + return err + } - if r.deltaYCoeffs[i], err = PolynomialFit(cx, dy, 2); err != nil { - log.Error("Error fitting deltaY coeffs: ", err) - return err + if r.deltaYCoeffs[i], err = PolynomialFit(cx, dy, 2); err != nil { + log.Error("Error fitting deltaY coeffs: ", err) + return err + } } } for i := 0; i < MssBands; i++ { + if len(r.deltaXCoeffs[i]) < 2 || len(r.deltaYCoeffs[i]) < 3 { + continue + } + log.Printf("Band %d:\n delta_x = %.6f*x + %.6f, \n delta_y = %.6f*x^2 + %.6f*x + %.6f\n", i+1, r.deltaXCoeffs[i][1], r.deltaXCoeffs[i][0], @@ -317,6 +327,12 @@ func (r *Registrator) calcDeltaCoeffs() error { func (r *Registrator) DoCoRegestration() error { for band := 0; band < MssBands; band++ { + if len(r.deltaXCoeffs[band]) < 2 || len(r.deltaYCoeffs[band]) < 3 { + log.Error("delta coefficients not calculated, skip co-registration") + r.registeredMssImages[band] = r.MssImages[band].Clone() + continue + } + mapX := gocv.NewMatWithSize(r.MssHeight, r.MssWidth, gocv.MatTypeCV32FC1) mapY := gocv.NewMatWithSize(r.MssHeight, r.MssWidth, gocv.MatTypeCV32FC1) for y := 0; y < r.MssHeight; y++ { diff --git a/producer/jpg.go b/producer/jpg.go index 445ea29..0d5f941 100644 --- a/producer/jpg.go +++ b/producer/jpg.go @@ -19,7 +19,7 @@ func GTiffToJPG(ftiff, fjpg string, reversed bool) error { defer ds.Close() bands := ds.Bands() - log.Infof("TIFF file %s has %d bands", ftiff, len(bands)) + log.Infof("creating JPG for TIFF file %s.", ftiff) // 获取图像大小 width := bands[0].Structure().SizeX @@ -62,9 +62,9 @@ func GTiffToJPG(ftiff, fjpg string, reversed bool) error { img8 := gocv.NewMat() defer img8.Close() if bandsCnt == 1 { - img.ConvertToWithParams(&img8, gocv.MatTypeCV8UC1, 1.0/256.0*2, 0) + img.ConvertToWithParams(&img8, gocv.MatTypeCV8UC1, 1.0/256.0*1.5, 0) } else { - img.ConvertToWithParams(&img8, gocv.MatTypeCV8UC3, 1.0/256.0*2, 0) + img.ConvertToWithParams(&img8, gocv.MatTypeCV8UC3, 1.0/256.0*1.5, 0) if reversed { channels := gocv.Split(img8) gocv.Merge([]gocv.Mat{channels[2], channels[1], channels[0]}, &img8) diff --git a/producer/output.go b/producer/output.go index 720baf1..77c7c97 100644 --- a/producer/output.go +++ b/producer/output.go @@ -13,7 +13,12 @@ import ( ) func (r *Registrator) SaveOriginalPanToGDALGTiff(tiffFile string) error { - return savePanToGDALGTiff(r.PanImage, tiffFile) + err := savePanToGDALGTiff(r.PanImage, tiffFile) + if err != nil { + return err + } + + return nil } func (r *Registrator) SaveFilteredPanToGDALGTiff(tiffFile string) error { @@ -68,10 +73,15 @@ func (r *Registrator) SaveRegisteredMssToGDALGTiff(tiffFile string) error { r.rgbirImage = gocv.NewMat() gocv.Merge(r.registeredMssImages[:], &r.rgbirImage) - return SaveBGRToGDALGTiff(r.rgbirImage, + err := SaveBGRToGDALGTiff(r.rgbirImage, 4, 5, []godal.ColorInterp{godal.CIBlue, godal.CIGreen, godal.CIRed, godal.CIUndefined}, tiffFile) + if err != nil { + return err + } + + return nil } func (r *Registrator) SavePansharpenedToGDALGTiff(tiffFile string) error { diff --git a/producer/phase_correlation.go b/producer/phase_correlation.go index eed9d4a..797fd44 100644 --- a/producer/phase_correlation.go +++ b/producer/phase_correlation.go @@ -37,7 +37,7 @@ func (r *Registrator) calculateBlockPhaseShift(panBlock, mssBlock gocv.Mat) (goc dx := shift.X dy := shift.Y - log.Debugf("Block shift: dx = %f, dy = %f. response = %f \n", dx, dy, response) + log.Debugf("Block shift: dx = %f, dy = %f. response = %f", dx, dy, response) return shift, response } diff --git a/producer/scenes.go b/producer/scenes.go index 1299921..2f8b866 100644 --- a/producer/scenes.go +++ b/producer/scenes.go @@ -100,6 +100,8 @@ func (r *Registrator) SaveScenesToTiff(panScenes []*Scene, mssScenes []*Scene) e log.Errorf("save pan scene %d to tiff failed: %v", i+1, err) return err } + + GTiffToJPG(scene.Tiff, strings.Replace(scene.Tiff, ".tiff", ".jpg", 1), false) } for i, scene := range mssScenes { @@ -120,6 +122,8 @@ func (r *Registrator) SaveScenesToTiff(panScenes []*Scene, mssScenes []*Scene) e log.Errorf("save mss scene %d to tiff failed: %v", i+1, err) return err } + + GTiffToJPG(scene.Tiff, strings.Replace(scene.Tiff, ".tiff", ".jpg", 1), false) } return nil @@ -133,7 +137,12 @@ func (r *Registrator) DoScenePansharpen(panScenes []*Scene, mssScenes []*Scene) // filename := fmt.Sprintf("%s_%03d_FUS.tiff", path, i+1) // SaveBGRToGDALGTiff(ihsImage, 3, 1.25, filename) - GDALPansharpen(panScenes[i].Tiff, mssScenes[i].Tiff) + fusedTiff, err := GDALPansharpen(panScenes[i].Tiff, mssScenes[i].Tiff) + if err != nil { + return err + } + + GTiffToJPG(fusedTiff, strings.Replace(fusedTiff, ".tiff", ".jpg", 1), true) } return nil } diff --git a/run.sh b/run.sh index e27e655..2d33cfb 100755 --- a/run.sh +++ b/run.sh @@ -5,3 +5,5 @@ go run cmd/*.go proc -p /Users/lan/workspace/sjy01/preprocessing/demo/output/051 go run cmd/*.go proc -p /Users/lan/workspace/sjy01/preprocessing/demo/output/051922/SJY01_PAN_20240519_121433_051922_102.RAW -m /Users/lan/workspace/sjy01/preprocessing/demo/output/051922/SJY01_MSS_20240519_121433_051922_102.RAW -o data/051922 --fus go run cmd/*.go proc -p /Users/lan/workspace/sjy01/preprocessing/demo/output/051814/SJY01_PAN_20240517_111910_051814_098.RAW -m /Users/lan/workspace/sjy01/preprocessing/demo/output/051814/SJY01_MSS_20240517_111910_051814_098.RAW -o data/051814 --fus + +go run cmd/*.go proc -p /Users/lan/workspace/sjy01/preprocessing/demo/output/052723/SJY01_PAN_20240524_120820_052723_011.RAW -m /Users/lan/workspace/sjy01/preprocessing/demo/output/052723/SJY01_MSS_20240524_120820_052723_011.RAW -o data/052723 --fus