56 lines
1.6 KiB
Go
56 lines
1.6 KiB
Go
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
|
||
}
|