pansharpen by ESRI method
This commit is contained in:
123
pkg/fusion/fusion.go
Normal file
123
pkg/fusion/fusion.go
Normal file
@@ -0,0 +1,123 @@
|
||||
package fusion
|
||||
|
||||
import (
|
||||
"image"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/airbusgeo/godal"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"gocv.io/x/gocv"
|
||||
"starwiz.cn/sjy01/image-proc/pkg/config"
|
||||
"starwiz.cn/sjy01/image-proc/pkg/utils"
|
||||
)
|
||||
|
||||
type PansharpenMethod int
|
||||
|
||||
const (
|
||||
SimpleBrovey PansharpenMethod = iota
|
||||
Brovey
|
||||
SimpleMean
|
||||
ESRI
|
||||
GDALPansharpen
|
||||
)
|
||||
|
||||
func Pansharpen(panTif, mssTif, fusTif string, method PansharpenMethod) error {
|
||||
log.Infof("Pansharpening %s and %s", panTif, mssTif)
|
||||
pan, err := utils.ReadTifftoMat(panTif)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer pan.Close()
|
||||
|
||||
log.Infof("PAN row %d, col %d", pan.Rows(), pan.Cols())
|
||||
|
||||
mss, err := utils.ReadTifftoMat(mssTif)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer mss.Close()
|
||||
|
||||
log.Infof("MSS bands %d row %d, col %d", mss.Channels(), mss.Rows(), mss.Cols())
|
||||
|
||||
mssResized := gocv.NewMat()
|
||||
defer mssResized.Close()
|
||||
gocv.Resize(*mss, &mssResized, image.Point{X: pan.Cols(), Y: pan.Rows()}, 0, 0, gocv.InterpolationCubic)
|
||||
|
||||
BGRI := gocv.Split(mssResized)
|
||||
|
||||
var fus gocv.Mat
|
||||
switch method {
|
||||
case ESRI:
|
||||
fus = PansharpenESRI(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3])
|
||||
default:
|
||||
fus = PansharpenESRI(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3])
|
||||
}
|
||||
|
||||
defer fus.Close()
|
||||
|
||||
var mt gocv.MatType
|
||||
switch fus.Channels() {
|
||||
case 1:
|
||||
mt = gocv.MatTypeCV16UC1
|
||||
case 3:
|
||||
mt = gocv.MatTypeCV16UC3
|
||||
case 4:
|
||||
mt = gocv.MatTypeCV16UC4
|
||||
}
|
||||
fus.ConvertTo(&fus, mt)
|
||||
|
||||
var colorInterps []godal.ColorInterp
|
||||
if config.GCONFIG.CoRegistration.FUSBandOrder == "RGB" {
|
||||
colorInterps = []godal.ColorInterp{godal.CIRed, godal.CIGreen, godal.CIBlue, godal.CIUndefined}
|
||||
} else {
|
||||
colorInterps = []godal.ColorInterp{godal.CIBlue, godal.CIGreen, godal.CIRed, godal.CIUndefined}
|
||||
}
|
||||
err = utils.SaveBGRToGDALGTiff(fus, fus.Channels(), 0, 0, 1.3, colorInterps, fusTif)
|
||||
|
||||
for i := 0; i < len(BGRI); i++ {
|
||||
BGRI[i].Close()
|
||||
}
|
||||
|
||||
// use rpc of PAN directly
|
||||
rpb := strings.Replace(panTif, ".tiff", ".rpb", -1)
|
||||
if _, err := os.Stat(rpb); err == nil {
|
||||
fusRPB := strings.Replace(fusTif, ".tiff", ".rpb", -1)
|
||||
if input, err := os.ReadFile(rpb); err == nil {
|
||||
os.WriteFile(fusRPB, input, 0644)
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func PansharpenSimpleBrovey(pan, B, G, R, I gocv.Mat) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func PansharpenBrovey(pan, B, G, R, I gocv.Mat) error { return nil }
|
||||
|
||||
func PansharpenSimpleMean(pan, B, G, R, I gocv.Mat) error { return nil }
|
||||
|
||||
func PansharpenESRI(pan, B, G, R, I gocv.Mat) gocv.Mat {
|
||||
bgrn_mean := gocv.NewMatWithSize(pan.Rows(), pan.Cols(), pan.Type())
|
||||
defer bgrn_mean.Close()
|
||||
ADJ := gocv.NewMat()
|
||||
defer ADJ.Close()
|
||||
|
||||
bgrn_mean.MultiplyFloat(-1)
|
||||
gocv.Add(pan, bgrn_mean, &ADJ)
|
||||
gocv.Add(B, ADJ, &B)
|
||||
gocv.Add(G, ADJ, &G)
|
||||
gocv.Add(R, ADJ, &R)
|
||||
gocv.Add(I, ADJ, &I)
|
||||
|
||||
mss := gocv.NewMat()
|
||||
if config.GCONFIG.CoRegistration.FUSBandOrder == "RGB" {
|
||||
gocv.Merge([]gocv.Mat{R, G, B}, &mss)
|
||||
} else {
|
||||
gocv.Merge([]gocv.Mat{B, G, R}, &mss)
|
||||
}
|
||||
|
||||
return mss
|
||||
}
|
||||
Reference in New Issue
Block a user