Files
sjy01-image-proc/gdal_pansharpen.go
2024-05-27 18:14:03 +08:00

56 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package imageproc
import (
"fmt"
"image"
"gocv.io/x/gocv"
)
const (
GDALPansharpenCommand = "gdal_pansharpen.py {{.PANGTiff}} {{.MSSGTiff}} {{.FUSGTiff}} -r cubic -of GTiff"
)
// IHS 变换是一种将 RGB 空间转换为亮度、色调和饱和度的变换方法
func PansharpenIHS(panImage, mssImage gocv.Mat) gocv.Mat {
pan32 := gocv.NewMat()
defer pan32.Close()
panImage.ConvertTo(&pan32, gocv.MatTypeCV32FC1)
mss32 := gocv.NewMat()
mssImage.ConvertTo(&mss32, gocv.MatTypeCV32FC4)
// 调整 MSS 图像的大小到与 PAN 图像相同的大小
mssResized := gocv.NewMat()
defer mssResized.Close()
gocv.Resize(mss32, &mssResized,
image.Point{X: panImage.Cols(), Y: panImage.Rows()}, 0, 0, gocv.InterpolationCubic)
// 将 MSS 图像从 BGR 转换为 HLS
mssHLS := gocv.NewMat()
defer mssHLS.Close()
gocv.CvtColor(mssResized, &mssHLS, gocv.ColorBGRToHLS)
// 分离 HLS 通道 只有3个通道
hlsChannels := gocv.Split(mssHLS)
fmt.Println("size of channels:", len(hlsChannels), mssImage.Channels(), mssResized.Channels(), mssHLS.Channels())
fmt.Println("size of pan32:", pan32.Size(), pan32.Channels())
fmt.Println("size of resized mss", mss32.Size(), mss32.Rows(), mss32.Cols())
// 使用 PAN 图像替换亮度分量Intensity- 通常替换的是 G 通道
hlsChannels[1] = pan32
// 合并通道
gocv.Merge(hlsChannels, &mssHLS)
// 将图像从 HLS 转换回 BGR
fusedImage := gocv.NewMat()
defer fusedImage.Close()
gocv.CvtColor(mssHLS, &fusedImage, gocv.ColorHLSToBGR)
fused16 := gocv.NewMat()
fusedImage.ConvertTo(&fused16, gocv.MatTypeCV16UC3)
return fused16
}