Brovey method and IHS method with weight

This commit is contained in:
nuknal
2024-09-14 11:57:07 +08:00
parent c311c3dc3d
commit d3cf743b71
3 changed files with 71 additions and 9 deletions

View File

@@ -17,6 +17,7 @@ var (
outputDir string
fusReport string
fusMethod int
weight float32
)
var fusCmd = &cobra.Command{
@@ -41,7 +42,8 @@ var fusCmd = &cobra.Command{
err := fusion.Pansharpen(panImage, mssImage,
filepath.Join(outputDir, fusedTiff),
fusion.PansharpenMethod(fusMethod))
fusion.PansharpenMethod(fusMethod),
weight)
if err != nil {
logrus.Fatal(err)
}
@@ -66,7 +68,8 @@ func init() {
fusCmd.Flags().StringVarP(&mssImage, "mss", "m", "", "path to the MSS image")
fusCmd.Flags().StringVarP(&outputDir, "output", "o", "", "path to the output directory")
fusCmd.Flags().StringVarP(&paramsXML, "params", "x", "", "path to the XML file containing parameters for GDAL_Pansharpen")
fusCmd.Flags().IntVarP(&fusMethod, "method", "t", int(fusion.ESRI), "method to use for fusion (5: IHS, 3: ESRI)")
fusCmd.Flags().IntVarP(&fusMethod, "method", "t", int(fusion.ESRI), "method to use for fusion (5: IHS, 3: ESRI 1: brovey)")
fusCmd.Flags().Float32VarP(&weight, "weight", "w", 0.1, "weight of the MSS image in the fusion (0-1)")
}
func initFUSParams() {

View File

@@ -12,6 +12,8 @@ import (
"starwiz.cn/sjy01/image-proc/pkg/utils"
)
// Reference: https://www.kaggle.com/code/resolut/panchromatic-sharpening
type PansharpenMethod int
const (
@@ -24,7 +26,7 @@ const (
GIHS
)
func Pansharpen(panTif, mssTif, fusTif string, method PansharpenMethod) error {
func Pansharpen(panTif, mssTif, fusTif string, method PansharpenMethod, weight float32) error {
log.Infof("Pansharpening %s and %s", panTif, mssTif)
pan, err := utils.ReadTifftoMat(panTif)
if err != nil {
@@ -53,7 +55,9 @@ func Pansharpen(panTif, mssTif, fusTif string, method PansharpenMethod) error {
case ESRI:
fus = PansharpenESRI(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3])
case IHS:
fus = PansharpenIHS(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3])
fus = PansharpenIHS(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3], weight)
case Brovey:
fus = PansharpenBrovey(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3], weight)
default:
fus = PansharpenESRI(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3])
}
@@ -102,9 +106,62 @@ func PansharpenSimpleBrovey(pan, B, G, R, I gocv.Mat) error {
}
func PansharpenBrovey(pan, B, G, R, I gocv.Mat, w float32) gocv.Mat {
pan.ConvertTo(&pan, gocv.MatTypeCV32F)
B.ConvertTo(&B, gocv.MatTypeCV32F)
G.ConvertTo(&G, gocv.MatTypeCV32F)
R.ConvertTo(&R, gocv.MatTypeCV32F)
I.ConvertTo(&I, gocv.MatTypeCV32F)
// DNF = (PAN - w*I)/(R*w + G*w + B*w)
var fus gocv.Mat
return fus
wI := gocv.NewMat()
I.CopyTo(&wI)
wI.MultiplyFloat(-1 * w)
defer wI.Close()
wR := gocv.NewMat()
R.CopyTo(&wR)
wR.MultiplyFloat(w)
defer wR.Close()
wG := gocv.NewMat()
G.CopyTo(&wG)
wG.MultiplyFloat(w)
defer wG.Close()
wB := gocv.NewMat()
B.CopyTo(&wB)
wB.MultiplyFloat(w)
defer wB.Close()
DNF := gocv.NewMat()
defer DNF.Close()
gocv.Add(pan, wI, &DNF)
gocv.Add(wR, wG, &wR)
gocv.Add(wR, wB, &wR)
gocv.Divide(DNF, wR, &DNF)
gocv.Multiply(R, DNF, &R)
gocv.Multiply(G, DNF, &G)
gocv.Multiply(B, DNF, &B)
gocv.Multiply(I, DNF, &I)
mss := gocv.NewMat()
mt := gocv.MatTypeCV16UC3
switch config.GCONFIG.CoRegistration.FUSBandOrder {
case "RGB":
gocv.Merge([]gocv.Mat{R, G, B}, &mss)
case "BGR":
gocv.Merge([]gocv.Mat{B, G, R}, &mss)
case "RGBI":
gocv.Merge([]gocv.Mat{R, G, B, I}, &mss)
mt = gocv.MatTypeCV16UC4
case "BGRI":
gocv.Merge([]gocv.Mat{B, G, R, I}, &mss)
mt = gocv.MatTypeCV16UC4
default:
gocv.Merge([]gocv.Mat{R, G, B}, &mss)
}
mss.ConvertTo(&mss, mt)
return mss
}
func PansharpenSimpleMean(pan, B, G, R, I gocv.Mat) error { return nil }
@@ -157,7 +214,7 @@ func PansharpenESRI(pan, B, G, R, I gocv.Mat) gocv.Mat {
return mss
}
func PansharpenIHS(pan, B, G, R, I gocv.Mat) gocv.Mat {
func PansharpenIHS(pan, B, G, R, I gocv.Mat, w float32) gocv.Mat {
mss := gocv.NewMat()
gocv.Merge([]gocv.Mat{B, G, R}, &mss)
mssHLS := gocv.NewMat()
@@ -179,7 +236,9 @@ func PansharpenIHS(pan, B, G, R, I gocv.Mat) gocv.Mat {
gocv.Normalize(hlsFloat, &hlsFloat, 0, 65535, gocv.NormMinMax)
// 替换亮度分量
hlsChannels[1] = panFloat
I.ConvertTo(&I, gocv.MatTypeCV32F)
I.MultiplyFloat(-1 * w)
gocv.Add(panFloat, I, &hlsChannels[1])
// 合并通道
gocv.Merge(hlsChannels, &mssHLS)

View File

@@ -242,7 +242,7 @@ func (r *Registrator) SaveScenesToTiff(panScenes []*Scene, mssScenes []*Scene) e
func (r *Registrator) 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)
err := fusion.Pansharpen(panScenes[i].Tiff, mssScenes[i].Tiff, fusedTiff, fusion.ESRI, 0.1)
if err != nil {
return err
}