pansharpen IHS

This commit is contained in:
nuknal
2024-05-27 23:01:40 +08:00
parent 106fc37aad
commit 720a3fd855
3 changed files with 51 additions and 13 deletions

1
.gitignore vendored
View File

@@ -5,3 +5,4 @@ data
*.jpeg
*.png
*.PNG
bin

11
Makefile Normal file
View File

@@ -0,0 +1,11 @@
.DEFAULT_GOAL := out
export DATE := $(shell date +%Y%m%d-%H:%M:%S)
export COMPILE_LDFLAGS='-s -w -X "main.BuildDate=${DATE}" '
out:
GOOS=darwin GOARCH=arm64 go build -o bin/sjy01-imgproc-darwin-arm64 -ldflags=${COMPILE_LDFLAGS} cmd/*.go
clean:
rm -rf ./bin/*
linux:
GOOS=linux GOARCH=amd64 go build -o bin/sjy01-imgproc -ldflags=${COMPILE_LDFLAGS} cmd/*.go

View File

@@ -13,17 +13,17 @@ const (
// IHS 变换是一种将 RGB 空间转换为亮度、色调和饱和度的变换方法
func PansharpenIHS(panImage, mssImage gocv.Mat) gocv.Mat {
pan32 := gocv.NewMat()
defer pan32.Close()
panImage.ConvertTo(&pan32, gocv.MatTypeCV32FC1)
// pan32 := gocv.NewMat()
// defer pan32.Close()
// panImage.ConvertTo(&pan32, gocv.MatTypeCV32FC1)
mss32 := gocv.NewMat()
mssImage.ConvertTo(&mss32, gocv.MatTypeCV32FC4)
mss32F := gocv.NewMat()
mssImage.ConvertTo(&mss32F, gocv.MatTypeCV32FC4)
// 调整 MSS 图像的大小到与 PAN 图像相同的大小
mssResized := gocv.NewMat()
defer mssResized.Close()
gocv.Resize(mss32, &mssResized,
gocv.Resize(mss32F, &mssResized,
image.Point{X: panImage.Cols(), Y: panImage.Rows()}, 0, 0, gocv.InterpolationCubic)
// 将 MSS 图像从 BGR 转换为 HLS
@@ -32,14 +32,29 @@ func PansharpenIHS(panImage, mssImage gocv.Mat) gocv.Mat {
gocv.CvtColor(mssResized, &mssHLS, gocv.ColorBGRToHLS)
// 分离 HLS 通道 只有3个通道
// Hue
// Lightness
// Saturation
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
// 使用 PAN 图像替换亮度分量Intensity
// hlsChannels[1] = pan32
// 将 PAN 图像转换为与 HLS 亮度分量相同的范围
panFloat := gocv.NewMat()
defer panFloat.Close()
panImage.ConvertTo(&panFloat, gocv.MatTypeCV32F)
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)
@@ -48,8 +63,19 @@ func PansharpenIHS(panImage, mssImage gocv.Mat) gocv.Mat {
fusedImage := gocv.NewMat()
defer fusedImage.Close()
gocv.CvtColor(mssHLS, &fusedImage, gocv.ColorHLSToBGR)
fused16 := gocv.NewMat()
fusedImage.ConvertTo(&fused16, gocv.MatTypeCV16UC3)
return fused16
// 交换 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
}