pansharpen IHS
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,3 +5,4 @@ data
|
|||||||
*.jpeg
|
*.jpeg
|
||||||
*.png
|
*.png
|
||||||
*.PNG
|
*.PNG
|
||||||
|
bin
|
||||||
|
|||||||
11
Makefile
Normal file
11
Makefile
Normal 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
|
||||||
@@ -13,17 +13,17 @@ const (
|
|||||||
|
|
||||||
// IHS 变换是一种将 RGB 空间转换为亮度、色调和饱和度的变换方法
|
// IHS 变换是一种将 RGB 空间转换为亮度、色调和饱和度的变换方法
|
||||||
func PansharpenIHS(panImage, mssImage gocv.Mat) gocv.Mat {
|
func PansharpenIHS(panImage, mssImage gocv.Mat) gocv.Mat {
|
||||||
pan32 := gocv.NewMat()
|
// pan32 := gocv.NewMat()
|
||||||
defer pan32.Close()
|
// defer pan32.Close()
|
||||||
panImage.ConvertTo(&pan32, gocv.MatTypeCV32FC1)
|
// panImage.ConvertTo(&pan32, gocv.MatTypeCV32FC1)
|
||||||
|
|
||||||
mss32 := gocv.NewMat()
|
mss32F := gocv.NewMat()
|
||||||
mssImage.ConvertTo(&mss32, gocv.MatTypeCV32FC4)
|
mssImage.ConvertTo(&mss32F, gocv.MatTypeCV32FC4)
|
||||||
|
|
||||||
// 调整 MSS 图像的大小到与 PAN 图像相同的大小
|
// 调整 MSS 图像的大小到与 PAN 图像相同的大小
|
||||||
mssResized := gocv.NewMat()
|
mssResized := gocv.NewMat()
|
||||||
defer mssResized.Close()
|
defer mssResized.Close()
|
||||||
gocv.Resize(mss32, &mssResized,
|
gocv.Resize(mss32F, &mssResized,
|
||||||
image.Point{X: panImage.Cols(), Y: panImage.Rows()}, 0, 0, gocv.InterpolationCubic)
|
image.Point{X: panImage.Cols(), Y: panImage.Rows()}, 0, 0, gocv.InterpolationCubic)
|
||||||
|
|
||||||
// 将 MSS 图像从 BGR 转换为 HLS
|
// 将 MSS 图像从 BGR 转换为 HLS
|
||||||
@@ -32,14 +32,29 @@ func PansharpenIHS(panImage, mssImage gocv.Mat) gocv.Mat {
|
|||||||
gocv.CvtColor(mssResized, &mssHLS, gocv.ColorBGRToHLS)
|
gocv.CvtColor(mssResized, &mssHLS, gocv.ColorBGRToHLS)
|
||||||
|
|
||||||
// 分离 HLS 通道 只有3个通道
|
// 分离 HLS 通道 只有3个通道
|
||||||
|
// Hue
|
||||||
|
// Lightness
|
||||||
|
// Saturation
|
||||||
hlsChannels := gocv.Split(mssHLS)
|
hlsChannels := gocv.Split(mssHLS)
|
||||||
|
|
||||||
fmt.Println("size of channels:", len(hlsChannels), mssImage.Channels(), mssResized.Channels(), mssHLS.Channels())
|
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 通道
|
// 使用 PAN 图像替换亮度分量(Intensity)
|
||||||
hlsChannels[1] = pan32
|
// 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)
|
gocv.Merge(hlsChannels, &mssHLS)
|
||||||
@@ -48,8 +63,19 @@ func PansharpenIHS(panImage, mssImage gocv.Mat) gocv.Mat {
|
|||||||
fusedImage := gocv.NewMat()
|
fusedImage := gocv.NewMat()
|
||||||
defer fusedImage.Close()
|
defer fusedImage.Close()
|
||||||
gocv.CvtColor(mssHLS, &fusedImage, gocv.ColorHLSToBGR)
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user