only store valid pixels
This commit is contained in:
@@ -50,6 +50,7 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
|
|
||||||
var afh AuxFrameHead
|
var afh AuxFrameHead
|
||||||
|
|
||||||
|
pandata := make([]byte, 0)
|
||||||
msdata := make([][]byte, 4)
|
msdata := make([][]byte, 4)
|
||||||
var header []byte
|
var header []byte
|
||||||
var ebAux []byte
|
var ebAux []byte
|
||||||
@@ -107,19 +108,22 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
platAux = append(platAux, data[dataIndex:dataIndex+32]...)
|
platAux = append(platAux, data[dataIndex:dataIndex+32]...)
|
||||||
dataIndex += 32
|
dataIndex += 32
|
||||||
|
|
||||||
|
if !afh.B0 || !afh.B1 || !afh.B2 || !afh.B3 || !afh.B4 {
|
||||||
|
log.Error("not all bands are available")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
// 存储图像数据到临时文件 - 以 ENVI BSQ 格式存储,同时提供 HDR 描述文件
|
// 存储图像数据到临时文件 - 以 ENVI BSQ 格式存储,同时提供 HDR 描述文件
|
||||||
if afh.B0 {
|
if afh.B0 {
|
||||||
// wpan.Write(data[dataIndex : dataIndex+19040])
|
// wpan.Write(data[dataIndex : dataIndex+19040])
|
||||||
write16bPixelLittleEndian(lw.ws[PAN_RAW].w, data[dataIndex:dataIndex+19040])
|
pandata = append(pandata, data[dataIndex:dataIndex+19040]...)
|
||||||
dataIndex += 19040
|
dataIndex += 19040
|
||||||
panEnviHdr.Lines += 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if afh.B1 {
|
if afh.B1 {
|
||||||
// write16bPixelLittleEndian(wmss, data[dataIndex:dataIndex+1192])
|
// write16bPixelLittleEndian(wmss, data[dataIndex:dataIndex+1192])
|
||||||
msdata[0] = append(msdata[0], data[dataIndex:dataIndex+1192]...)
|
msdata[0] = append(msdata[0], data[dataIndex:dataIndex+1192]...)
|
||||||
dataIndex += 1192
|
dataIndex += 1192
|
||||||
mssEnviHdr.Lines += 1
|
|
||||||
}
|
}
|
||||||
if afh.B2 {
|
if afh.B2 {
|
||||||
// write16bPixelLittleEndian(wmss, data[dataIndex:dataIndex+1192])
|
// write16bPixelLittleEndian(wmss, data[dataIndex:dataIndex+1192])
|
||||||
@@ -139,53 +143,12 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
i = dataIndex // 完成一行数据解析
|
i = dataIndex // 完成一行数据解析
|
||||||
}
|
}
|
||||||
|
|
||||||
// var bands = 0
|
|
||||||
// for i := 0; i < 4; i++ {
|
|
||||||
// if len(msdata[i]) > 0 {
|
|
||||||
// log.Println("write mss data of band B", i+1)
|
|
||||||
// _, err := write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[i])
|
|
||||||
// if err != nil {
|
|
||||||
// log.Error("write mss data error:", err.Error())
|
|
||||||
// }
|
|
||||||
// bands += 1
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
if len(msdata[0]) != len(msdata[1]) || len(msdata[2]) != len(msdata[3]) {
|
if len(msdata[0]) != len(msdata[1]) || len(msdata[2]) != len(msdata[3]) {
|
||||||
log.Error("mss data of bands B1-B4 are not equal")
|
log.Error("mss data of bands B1-B4 are not equal")
|
||||||
return errors.New("mss data of bands B1-B4 are not equal")
|
return errors.New("mss data of bands B1-B4 are not equal")
|
||||||
}
|
}
|
||||||
|
|
||||||
mssRowLen := 1192 * 4
|
// 先判断辅助数据是否完整
|
||||||
for i := 0; i < len(msdata[0]); i += mssRowLen {
|
|
||||||
var err error
|
|
||||||
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[0][i:i+mssRowLen])
|
|
||||||
if err != nil {
|
|
||||||
log.Error("write mss 1 data error:", err.Error())
|
|
||||||
}
|
|
||||||
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[1][i:i+mssRowLen])
|
|
||||||
if err != nil {
|
|
||||||
log.Error("write mss 2 data error:", err.Error())
|
|
||||||
}
|
|
||||||
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[2][i:i+mssRowLen])
|
|
||||||
if err != nil {
|
|
||||||
log.Error("write mss 3 data error:", err.Error())
|
|
||||||
}
|
|
||||||
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[3][i:i+mssRowLen])
|
|
||||||
if err != nil {
|
|
||||||
log.Error("write mss 4 data error:", err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
panEnviHdr.Samples = 9520
|
|
||||||
panEnviHdr.Bands = 1
|
|
||||||
lw.ws[PAN_HDR].w.Write([]byte(panEnviHdr.String()))
|
|
||||||
|
|
||||||
mssEnviHdr.Lines = mssEnviHdr.Lines / 4 // 多光谱波段分别在 4 行中传输
|
|
||||||
mssEnviHdr.Samples = 2384 * 4
|
|
||||||
mssEnviHdr.Bands = 1
|
|
||||||
lw.ws[MSS_HDR].w.Write([]byte(mssEnviHdr.String()))
|
|
||||||
|
|
||||||
// 帧头+辅助数据
|
// 帧头+辅助数据
|
||||||
if len(header)/24 < len(ebAux)/128 || len(ebAux)/128 != len(platAux)/512 {
|
if len(header)/24 < len(ebAux)/128 || len(ebAux)/128 != len(platAux)/512 {
|
||||||
fmt.Println("aux data length:", len(header)/24, len(ebAux)/128, len(platAux)/512)
|
fmt.Println("aux data length:", len(header)/24, len(ebAux)/128, len(platAux)/512)
|
||||||
@@ -204,6 +167,64 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auxHeight := len(aps) * 16 // 16行图像数据为一组辅助数据
|
||||||
|
panHeight := len(pandata) / 19040
|
||||||
|
mssHeight := 4 * len(msdata[0]) / 4768
|
||||||
|
log.Println("pan height:", panHeight, "mss height:", mssHeight, "aux height:", auxHeight)
|
||||||
|
// 取最小值作为有效数据长度
|
||||||
|
efficientHeight := int(math.Min(float64(panHeight), float64(mssHeight)))
|
||||||
|
efficientHeight = int(math.Min(float64(efficientHeight), float64(auxHeight)))
|
||||||
|
log.Println("efficient height:", efficientHeight)
|
||||||
|
|
||||||
|
// 写入pan数据
|
||||||
|
for i := 0; i < len(pandata); i += 19040 {
|
||||||
|
start := i + (2+48+38)*2
|
||||||
|
end := start + 18688
|
||||||
|
write16bPixelLittleEndian(lw.ws[PAN_RAW].w, pandata[start:end])
|
||||||
|
panEnviHdr.Lines += 1
|
||||||
|
if panEnviHdr.Lines >= efficientHeight {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mssRowLen := 1192 * 4
|
||||||
|
for i := 0; i < len(msdata[0]); i += mssRowLen {
|
||||||
|
var err error
|
||||||
|
start := i + (1+11+10)*2
|
||||||
|
end := start + 4672
|
||||||
|
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[0][start:end])
|
||||||
|
if err != nil {
|
||||||
|
log.Error("write mss 1 data error:", err.Error())
|
||||||
|
}
|
||||||
|
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[1][start:end])
|
||||||
|
if err != nil {
|
||||||
|
log.Error("write mss 2 data error:", err.Error())
|
||||||
|
}
|
||||||
|
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[2][start:end])
|
||||||
|
if err != nil {
|
||||||
|
log.Error("write mss 3 data error:", err.Error())
|
||||||
|
}
|
||||||
|
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[3][start:end])
|
||||||
|
if err != nil {
|
||||||
|
log.Error("write mss 4 data error:", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
mssEnviHdr.Lines += 1
|
||||||
|
if mssEnviHdr.Lines*4 >= efficientHeight {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
panEnviHdr.Samples = 9344
|
||||||
|
panEnviHdr.Bands = 1
|
||||||
|
lw.ws[PAN_HDR].w.Write([]byte(panEnviHdr.String()))
|
||||||
|
|
||||||
|
mssEnviHdr.Samples = 2336 * 4
|
||||||
|
mssEnviHdr.Bands = 1
|
||||||
|
lw.ws[MSS_HDR].w.Write([]byte(mssEnviHdr.String()))
|
||||||
|
|
||||||
|
fmt.Println("pan height:", panEnviHdr.Lines, "mss height:", mssEnviHdr.Lines)
|
||||||
|
|
||||||
e.mutex.Lock()
|
e.mutex.Lock()
|
||||||
defer e.mutex.Unlock()
|
defer e.mutex.Unlock()
|
||||||
seg := Segment{
|
seg := Segment{
|
||||||
@@ -310,3 +331,25 @@ func (e *Extractor) trimImgRawData(data []byte) ([]byte, *AuxFrameHead) {
|
|||||||
|
|
||||||
return data[start:end], afh
|
return data[start:end], afh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 9520 16bit 像素 19040 字节,返回有效像素字节起始位置
|
||||||
|
// 9520 像素 2(Margin) + 48(OB) + 38(Margin) + 9344(Effective Pixels) + 38(Margin) + 48(OB) + 2(Margin)
|
||||||
|
// 7056 像素 2(Margin) + 12(OB) + 18(Margin) + 20(Margin) + 7000(Effective Pixels) + 4(Margin)
|
||||||
|
func PanEffectivePixel(row []byte) (start, end int) {
|
||||||
|
if len(row) < 19040 {
|
||||||
|
return -1, -1
|
||||||
|
}
|
||||||
|
start = (0 + 2 + 48 + 38) * 2
|
||||||
|
end = 19040 - (2+48+28)*2
|
||||||
|
return start, end
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2384 像素 1+11+10+2336+10+8+8
|
||||||
|
func MssEffectivePixel(row []byte) (start, end int) {
|
||||||
|
if len(row) < 4768 {
|
||||||
|
return -1, -1
|
||||||
|
}
|
||||||
|
start = (1 + 11 + 10) * 2
|
||||||
|
end = 4768 - (10+8+8)*2
|
||||||
|
return start, end
|
||||||
|
}
|
||||||
|
|||||||
@@ -95,6 +95,9 @@ func (p *Extractor) ExtractOriginalImageData(aosDataFile string) ([]string, erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.Println("null transfer frame cnt:", nullFrmCnt)
|
log.Println("null transfer frame cnt:", nullFrmCnt)
|
||||||
|
if len(snRange) == 0 {
|
||||||
|
log.Errorf("no valid transfer frame found in %s", aosDataFile)
|
||||||
|
}
|
||||||
|
|
||||||
for k, v := range snRange {
|
for k, v := range snRange {
|
||||||
vv := slice.Unique(v)
|
vv := slice.Unique(v)
|
||||||
|
|||||||
5
go.mod
5
go.mod
@@ -2,7 +2,10 @@ module starwiz.cn/sjy01/preprocessing
|
|||||||
|
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require github.com/xuri/excelize/v2 v2.8.1
|
require (
|
||||||
|
github.com/xuri/excelize/v2 v2.8.1
|
||||||
|
gocv.io/x/gocv v0.36.1
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/jonboulle/clockwork v0.4.0 // indirect
|
github.com/jonboulle/clockwork v0.4.0 // indirect
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -84,6 +84,8 @@ github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluU
|
|||||||
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4=
|
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4=
|
||||||
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
|
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
gocv.io/x/gocv v0.36.1 h1:6XkEaPOk7h/umjy+MXgSEtSeCIgcPJhccUjrJFhjdTY=
|
||||||
|
gocv.io/x/gocv v0.36.1/go.mod h1:lmS802zoQmnNvXETpmGriBqWrENPei2GxYx5KUxJsMA=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ func init() {
|
|||||||
DisableColors: true,
|
DisableColors: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
configureLogger(logrus.StandardLogger(), "log/app.log", logrus.InfoLevel)
|
configureLogger(logrus.StandardLogger(), "log/SJY01-preproc.log", logrus.InfoLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLogger(logfile string) *logrus.Logger {
|
func NewLogger(logfile string) *logrus.Logger {
|
||||||
|
|||||||
Reference in New Issue
Block a user