Brovey method and IHS method with weight
This commit is contained in:
@@ -17,6 +17,7 @@ var (
|
|||||||
outputDir string
|
outputDir string
|
||||||
fusReport string
|
fusReport string
|
||||||
fusMethod int
|
fusMethod int
|
||||||
|
weight float32
|
||||||
)
|
)
|
||||||
|
|
||||||
var fusCmd = &cobra.Command{
|
var fusCmd = &cobra.Command{
|
||||||
@@ -41,7 +42,8 @@ var fusCmd = &cobra.Command{
|
|||||||
|
|
||||||
err := fusion.Pansharpen(panImage, mssImage,
|
err := fusion.Pansharpen(panImage, mssImage,
|
||||||
filepath.Join(outputDir, fusedTiff),
|
filepath.Join(outputDir, fusedTiff),
|
||||||
fusion.PansharpenMethod(fusMethod))
|
fusion.PansharpenMethod(fusMethod),
|
||||||
|
weight)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Fatal(err)
|
logrus.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -66,7 +68,8 @@ func init() {
|
|||||||
fusCmd.Flags().StringVarP(&mssImage, "mss", "m", "", "path to the MSS image")
|
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(&outputDir, "output", "o", "", "path to the output directory")
|
||||||
fusCmd.Flags().StringVarP(¶msXML, "params", "x", "", "path to the XML file containing parameters for GDAL_Pansharpen")
|
fusCmd.Flags().StringVarP(¶msXML, "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() {
|
func initFUSParams() {
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import (
|
|||||||
"starwiz.cn/sjy01/image-proc/pkg/utils"
|
"starwiz.cn/sjy01/image-proc/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Reference: https://www.kaggle.com/code/resolut/panchromatic-sharpening
|
||||||
|
|
||||||
type PansharpenMethod int
|
type PansharpenMethod int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -24,7 +26,7 @@ const (
|
|||||||
GIHS
|
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)
|
log.Infof("Pansharpening %s and %s", panTif, mssTif)
|
||||||
pan, err := utils.ReadTifftoMat(panTif)
|
pan, err := utils.ReadTifftoMat(panTif)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -53,7 +55,9 @@ func Pansharpen(panTif, mssTif, fusTif string, method PansharpenMethod) error {
|
|||||||
case ESRI:
|
case ESRI:
|
||||||
fus = PansharpenESRI(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3])
|
fus = PansharpenESRI(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3])
|
||||||
case IHS:
|
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:
|
default:
|
||||||
fus = PansharpenESRI(*pan, BGRI[0], BGRI[1], BGRI[2], BGRI[3])
|
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 {
|
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)
|
// DNF = (PAN - w*I)/(R*w + G*w + B*w)
|
||||||
var fus gocv.Mat
|
wI := gocv.NewMat()
|
||||||
return fus
|
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 }
|
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
|
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()
|
mss := gocv.NewMat()
|
||||||
gocv.Merge([]gocv.Mat{B, G, R}, &mss)
|
gocv.Merge([]gocv.Mat{B, G, R}, &mss)
|
||||||
mssHLS := gocv.NewMat()
|
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)
|
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)
|
gocv.Merge(hlsChannels, &mssHLS)
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ func (r *Registrator) SaveScenesToTiff(panScenes []*Scene, mssScenes []*Scene) e
|
|||||||
func (r *Registrator) DoScenePansharpen(panScenes []*Scene, mssScenes []*Scene) error {
|
func (r *Registrator) DoScenePansharpen(panScenes []*Scene, mssScenes []*Scene) error {
|
||||||
for i := 0; i < len(panScenes); i++ {
|
for i := 0; i < len(panScenes); i++ {
|
||||||
fusedTiff := strings.Replace(mssScenes[i].Tiff, "MSS", "FUS", -1)
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user