default channel order of OpenCV is BGR
This commit is contained in:
@@ -9,7 +9,7 @@ import (
|
||||
"gocv.io/x/gocv"
|
||||
)
|
||||
|
||||
func GTiffToJPG(ftiff, fjpg string) error {
|
||||
func GTiffToJPG(ftiff, fjpg string, reversed bool) error {
|
||||
// 打开 TIFF 文件
|
||||
ds, err := godal.Open(ftiff)
|
||||
if err != nil {
|
||||
@@ -20,62 +20,61 @@ func GTiffToJPG(ftiff, fjpg string) error {
|
||||
|
||||
bands := ds.Bands()
|
||||
log.Infof("TIFF file %s has %d bands", ftiff, len(bands))
|
||||
if len(bands) < 3 {
|
||||
err = fmt.Errorf("TIFF file %s has less than 3 bands", ftiff)
|
||||
log.Error(err)
|
||||
return err
|
||||
}
|
||||
|
||||
// 获取图像大小
|
||||
width := bands[0].Structure().SizeX
|
||||
height := bands[0].Structure().SizeY
|
||||
bandsCnt := len(bands)
|
||||
|
||||
// 读取每个波段并转换为 8 位
|
||||
img := gocv.NewMatWithSize(height, width, gocv.MatTypeCV16UC3)
|
||||
for i := 1; i <= 3; i++ {
|
||||
band := ds.Bands()[i-1]
|
||||
// 创建 16 位图像矩阵
|
||||
var img gocv.Mat
|
||||
defer img.Close()
|
||||
if bandsCnt == 1 {
|
||||
img = gocv.NewMatWithSize(height, width, gocv.MatTypeCV16UC1)
|
||||
} else {
|
||||
bandsCnt = 3 // 只取前三个波段
|
||||
img = gocv.NewMatWithSize(height, width, gocv.MatTypeCV16UC3)
|
||||
}
|
||||
|
||||
// 读取每个波段并存储到图像矩阵中
|
||||
for i := 0; i < bandsCnt; i++ {
|
||||
band := bands[i]
|
||||
data := make([]uint16, width*height)
|
||||
err = band.Read(0, 0, data, width, height)
|
||||
if err != nil {
|
||||
log.Printf("Error reading band %d: %v", i, err)
|
||||
fmt.Printf("Error reading band %d: %v\n", i, err)
|
||||
return err
|
||||
}
|
||||
|
||||
// 计算最小值和最大值
|
||||
var minVal, maxVal uint16 = 65535, 0
|
||||
for _, value := range data {
|
||||
if value < minVal {
|
||||
minVal = value
|
||||
}
|
||||
if value > maxVal {
|
||||
maxVal = value
|
||||
}
|
||||
}
|
||||
|
||||
// 将 16 位数据缩放到 8 位并存储到图像的相应通道
|
||||
// 将 16 位数据存储到图像的相应通道
|
||||
for y := 0; y < height; y++ {
|
||||
for x := 0; x < width; x++ {
|
||||
value := data[y*width+x]
|
||||
scaledValue := uint8(float64(value-minVal) / float64(maxVal-minVal) * 255)
|
||||
img.SetUCharAt(y, x*3+(i-1), scaledValue)
|
||||
img.SetShortAt(y, x*bandsCnt+i, int16(value))
|
||||
}
|
||||
}
|
||||
|
||||
// 将 16 位数据存储到图像的相应通道
|
||||
// for y := 0; y < height; y++ {
|
||||
// for x := 0; x < width; x++ {
|
||||
// value := data[y*width+x]
|
||||
// img.SetShortAt(y, x*3+(i-1), int16(value))
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
// 调整图像大小
|
||||
resizedImg := gocv.NewMat()
|
||||
gocv.Resize(img, &resizedImg, image.Point{X: 2336, Y: 2336}, 0, 0, gocv.InterpolationCubic)
|
||||
// 重采样图像
|
||||
gocv.Resize(img, &img, image.Point{X: img.Cols() / 2, Y: img.Rows() / 2}, 0, 0, gocv.InterpolationCubic)
|
||||
|
||||
// 保存为 JPG 文件
|
||||
ok := gocv.IMWrite(fjpg, resizedImg)
|
||||
// 创建 8 位图像矩阵
|
||||
img8 := gocv.NewMat()
|
||||
defer img8.Close()
|
||||
if bandsCnt == 1 {
|
||||
img.ConvertToWithParams(&img8, gocv.MatTypeCV8UC1, 1.0/256.0*2, 0)
|
||||
} else {
|
||||
img.ConvertToWithParams(&img8, gocv.MatTypeCV8UC3, 1.0/256.0*2, 0)
|
||||
if reversed {
|
||||
channels := gocv.Split(img8)
|
||||
gocv.Merge([]gocv.Mat{channels[2], channels[1], channels[0]}, &img8)
|
||||
for _, ch := range channels {
|
||||
ch.Close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ok := gocv.IMWrite(fjpg, img8)
|
||||
if !ok {
|
||||
err = fmt.Errorf("error saving %s", fjpg)
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user