Files
sjy01-image-proc/gdal_pansharpen.go
2024-05-28 09:16:59 +08:00

81 lines
2.2 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 (
"image"
log "github.com/sirupsen/logrus"
"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 {
log.Println("start pansharpen IHS")
mss32F := gocv.NewMat()
mssImage.ConvertTo(&mss32F, gocv.MatTypeCV32FC4)
// 调整 MSS 图像的大小到与 PAN 图像相同的大小
log.Println("resize mss to pan size")
mssResized := gocv.NewMat()
defer mssResized.Close()
gocv.Resize(mss32F, &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个通道
// Hue
// Lightness
// Saturation
hlsChannels := gocv.Split(mssHLS)
// 使用 PAN 图像替换亮度分量Intensity
// hlsChannels[1] = pan32
// 将 PAN 图像转换为与 HLS 亮度分量相同的范围
panFloat := gocv.NewMat()
defer panFloat.Close()
panImage.ConvertTo(&panFloat, gocv.MatTypeCV32F)
log.Println("normalize pan to 0-255")
gocv.Normalize(panFloat, &panFloat, 0, 255, gocv.NormMinMax)
hlsFloat := gocv.NewMat()
defer hlsFloat.Close()
hlsChannels[1].ConvertTo(&hlsFloat, gocv.MatTypeCV32F)
gocv.Normalize(hlsFloat, &hlsFloat, 0, 255, gocv.NormMinMax)
// 替换亮度分量
hlsChannels[1] = panFloat
// 合并通道
gocv.Merge(hlsChannels, &mssHLS)
// 将图像从 HLS 转换回 BGR
fusedImage := gocv.NewMat()
defer fusedImage.Close()
log.Println("cvt color from HLS to BGR")
gocv.CvtColor(mssHLS, &fusedImage, gocv.ColorHLSToBGR)
// 交换 B 和 R 通道
channels := gocv.Split(fusedImage)
defer channels[0].Close() // B
defer channels[1].Close() // G
defer channels[2].Close() // R
// 交换 B 和 R 通道
swappedChannels := []gocv.Mat{channels[2], channels[1], channels[0]}
gocv.Merge(swappedChannels, &fusedImage)
fused16U := gocv.NewMat()
fusedImage.ConvertTo(&fused16U, gocv.MatTypeCV16UC3)
return fused16U
}