diff --git a/.gitignore b/.gitignore index 66ddb60..53321f8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ data *.jpeg *.png *.PNG +bin diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..77975f8 --- /dev/null +++ b/Makefile @@ -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 diff --git a/gdal_pansharpen.go b/gdal_pansharpen.go index a6bb06c..77d5de4 100644 --- a/gdal_pansharpen.go +++ b/gdal_pansharpen.go @@ -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 }