From 0936506e3767b86365d9bbf9b2e038afaf8da6f8 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Fri, 28 Jul 2023 11:20:31 +0800 Subject: [PATCH] =?UTF-8?q?v2.2.1add=EF=BC=9A=E8=83=BD=E5=A4=9F=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=85=89=E8=B0=B1bin1=E7=A9=BA=E9=97=B4bin1=E7=9A=84?= =?UTF-8?q?=E5=AE=9A=E6=A0=87=E6=96=87=E4=BB=B6=E7=94=9F=E6=88=90=E5=85=89?= =?UTF-8?q?=E8=B0=B1bin2=E7=A9=BA=E9=97=B4bin1=E7=9A=84=E5=AE=9A=E6=A0=87?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1.1radiance_calibration_300tc.py | 139 ++++++++ change_bin_for_calfile.py | 55 --- radiance_calibration_ui.py | 123 ++++++- radiance_calibration_ui.ui | 557 ++++++++++++++++++++----------- 5 files changed, 619 insertions(+), 256 deletions(-) delete mode 100644 change_bin_for_calfile.py diff --git a/.gitignore b/.gitignore index a648c2f..355127a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /.idea *.xlsx *.cal +testdata # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/1.1radiance_calibration_300tc.py b/1.1radiance_calibration_300tc.py index cb36572..55a44a5 100644 --- a/1.1radiance_calibration_300tc.py +++ b/1.1radiance_calibration_300tc.py @@ -14,6 +14,7 @@ from osgeo import gdal from scipy.interpolate import interp1d import spectral import time +import copy from PyQt5.QtWidgets import QMainWindow, QFileDialog, QApplication from PyQt5.QtCore import Qt @@ -25,6 +26,7 @@ class EnterWindow(QMainWindow, Ui_MainWindow): self.setupUi(self) self.radiance_calibration_object = RadianceCalibration() + self.changeBinForCorning_object = ChangeBinForCorning() # self.setWindowState(Qt.WindowMaximized) # 初始化时就最大化窗口 @@ -32,6 +34,9 @@ class EnterWindow(QMainWindow, Ui_MainWindow): self.dn_bt.clicked.connect(self.select_dn) self.dark_bt.clicked.connect(self.select_dark) self.out_file_bt.clicked.connect(self.select_out_file) + self.calfile_bin1_bt.clicked.connect(self.select_calfile_changebin) + self.out_calfile_bt.clicked.connect(self.select_out_file_changebin) + self.operate_bt.clicked.connect(self.operate) self.dark_checkBox.stateChanged.connect(self.disabledDark) @@ -41,6 +46,14 @@ class EnterWindow(QMainWindow, Ui_MainWindow): self.tmp_dark_file_path = None # 用于保存当前路径,下次打开就默认在此路径下 self.tmp_out_file_path = None # 用于保存当前路径,下次打开就默认在此路径下 + self.spatialbin_comboBox.addItem("1") + # self.spatialbin_comboBox.addItem("2") + # self.spectral_comboBox.addItem("1") + self.spectral_comboBox.addItem("2") + + self.change_bin_operate_bt.clicked.connect(self.operate_changebin) + + def select_rad(self): if self.tmp_rad_file_path == None: rad_file_path = QFileDialog.getOpenFileName(self, '选择asd辐亮度文件', os.path.dirname(__file__))[0] @@ -93,12 +106,29 @@ class EnterWindow(QMainWindow, Ui_MainWindow): self.radiance_calibration_object.out_file_path = out_file_path self.out_file_le.setText(out_file_path) + def select_calfile_changebin(self): + tmp = QFileDialog.getExistingDirectory(self, 'bin1定标文件夹', os.path.dirname(__file__)) + + self.changeBinForCorning_object.calfile_path = tmp + self.calfile_bin1_le.setText(tmp) + + def select_out_file_changebin(self): + tmp = QFileDialog.getExistingDirectory(self, '选择输出路径', os.path.dirname(__file__)) + self.changeBinForCorning_object.out_file_path = tmp + self.out_calfile_changebin_le.setText(tmp) + def operate(self): if(self.dark_checkBox.isChecked()): self.radiance_calibration_object.operate() else: self.radiance_calibration_object.operate_without_dark() + def operate_changebin(self): + self.changeBinForCorning_object.spatialbin = int(self.spatialbin_comboBox.currentText()) + self.changeBinForCorning_object.spectralbin = int(self.spectral_comboBox.currentText()) + + self.changeBinForCorning_object.changebin() + def disabledDark(self, isEnable): self.dark_le.setEnabled(isEnable) self.dark_bt.setEnabled(isEnable) @@ -284,6 +314,115 @@ class RadianceCalibration(): traceback.print_exc() +class ChangeBinForCorning(): + def __init__(self): + self.calfile_path = None + self.out_file_path = None + self.spatialbin = None + self.spectralbin = None + + def get_hdr_filename(self, file_path): + return os.path.splitext(file_path)[0] + ".hdr" + + def get_hdr_filename_with_bip(self, file_path): + return os.path.splitext(file_path)[0] + ".bip.hdr" + + def write_img(self, dst_filename, data): + format = "ENVI" + driver = gdal.GetDriverByName(format) + RasterXSize = data.shape[2] # 遥感影像的sample(列数) + RasterYSize = data.shape[1] # 遥感影像的line(行数) + band = data.shape[0] + # driver.Create()函数中RasterXSize代表影像的sample(列数),RasterYSize代表影像的line(行数) + dst_ds = driver.Create(dst_filename, RasterXSize, RasterYSize, band, gdal.GDT_Float64, + options=["INTERLEAVE=BIP"]) + for i in range(band): + dst_ds.GetRasterBand(i + 1).WriteArray(data[i, :, :]) # gdal的band从1开始,所以dst_ds.GetRasterBand(i+1) + dst_ds = None + + def write_fields_to_hdrfile(self, fields, hdr_file): + header_tmp = spectral.envi.read_envi_header(hdr_file) + + fields['generated time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + with open(hdr_file, "a", encoding='utf-8') as f: + for key in fields.keys(): + if key in header_tmp or key == "description": + continue + + if type(fields[key]) == list: + f.write(key + " = {" + ", ".join(fields[key]) + "}\n") + else: + f.write(key + " = " + fields[key] + "\n") + + def process_hdr(self, hdr_file_path, envi_header_dict): + self.write_fields_to_hdrfile(envi_header_dict, self.get_hdr_filename(hdr_file_path)) + shutil.copyfile(self.get_hdr_filename(hdr_file_path), self.get_hdr_filename_with_bip(hdr_file_path)) + os.remove(self.get_hdr_filename(hdr_file_path)) + + def changebin(self): + gain_name_in = os.path.join(self.calfile_path, "gain.bip") + offset_name_in = os.path.join(self.calfile_path, "offset.bip") + img_proj, img_geotrans, img_data = ImageReaderWriter.read_img(gain_name_in) + img_proj1, img_geotrans1, img_dark = ImageReaderWriter.read_img(offset_name_in) + + in_hdr_dict = spectral.envi.read_envi_header(self.get_hdr_filename_with_bip(gain_name_in)) + + if in_hdr_dict["spectral binning"] != "1" and in_hdr_dict["sample binning"] != "1": + print("输入定标文件不是bin1。") + return + + if self.spatialbin == 1 and self.spectralbin == 1: + print("Bin1 is not need to convert.") + return + + if self.spatialbin == 1 and self.spectralbin == 2: + samples = int(in_hdr_dict["samples"]) + + if int(in_hdr_dict["bands"]) % 2 == 0: + bands = int(int(in_hdr_dict["bands"]) / 2) + else: + print("Bands is not divisible by 2.") + return + + out_hdr_dict = copy.deepcopy(in_hdr_dict) + out_hdr_dict["bands"] = str(bands) + out_hdr_dict["spectral binning"] = str(2) + wave = [] + + gain = np.empty((bands, 1, samples)) + dark = np.empty((bands, 1, samples)) + for i in range(gain.shape[0]): + gain[i, :, :] = (img_data[2 * i, :, :] + img_data[2 * i + 1, :, :]) / 2 + dark[i, :, :] = (img_dark[2 * i, :, :] + img_dark[2 * i + 1, :, :]) / 2 + + tmp = (float(out_hdr_dict["wavelength"][2 * i]) + float(out_hdr_dict["wavelength"][2 * i + 1])) / 2 + wave.append(str(round(tmp, 3))) + out_hdr_dict["wavelength"] = wave + + gain_name = os.path.join(self.out_file_path, "gain.bip") + offset_name = os.path.join(self.out_file_path, "offset.bip") + self.write_img(gain_name, gain) + self.process_hdr(gain_name, out_hdr_dict) + self.write_img(offset_name, dark) + self.process_hdr(offset_name, out_hdr_dict) + + if self.spatialbin == 2 and self.spectralbin == 2: + samples = int(in_hdr_dict["samples"]) + + if int(in_hdr_dict["bands"]) % 2 == 0: + bands = int(int(in_hdr_dict["bands"]) / 2) + else: + print("Bands is not divisible by 2.") + return + # # 空间bin + # gain = np.empty((300, 1, 688)) + # for i in range(gain.shape[2]): + # if i <= 683: + # gain[:, :, i] = img_data[:, :, i*2] # 丢弃 + # else: + # gain[:, :, i] = img_data[:, :, 683] # 重复 + + if __name__ == '__main__': app = QApplication(sys.argv) diff --git a/change_bin_for_calfile.py b/change_bin_for_calfile.py deleted file mode 100644 index a2dcfd3..0000000 --- a/change_bin_for_calfile.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -import os -import glob -import sys, traceback, re -from osgeo import gdal -import numpy as np -import matplotlib.pyplot as plt -from library.image_reader_writer import ImageReaderWriter -import spectral - - -def write_img(dst_filename, data): - format = "ENVI" - driver = gdal.GetDriverByName(format) - RasterXSize = data.shape[2] # 遥感影像的sample(列数) - RasterYSize = data.shape[1] # 遥感影像的line(行数) - band = data.shape[0] - # driver.Create()函数中RasterXSize代表影像的sample(列数),RasterYSize代表影像的line(行数) - dst_ds = driver.Create(dst_filename, RasterXSize, RasterYSize, band, gdal.GDT_Float64, - options=["INTERLEAVE=BIP"]) - for i in range(band): - dst_ds.GetRasterBand(i + 1).WriteArray(data[i, :, :]) # gdal的band从1开始,所以dst_ds.GetRasterBand(i+1) - dst_ds = None - - -gainfilepath = r'D:\delete\254_11\offset.bip' -gainfilepathhdr = r'D:\delete\254_11\offset.bip.hdr' -gainfilepath_out = r'D:\delete\254_11\convert\offset.bip' -img_proj, img_geotrans, img_data = ImageReaderWriter.read_img(gainfilepath) - -# # 空间bin -# gain = np.empty((300, 1, 688)) -# for i in range(gain.shape[2]): -# if i <= 683: -# gain[:, :, i] = img_data[:, :, i*2] # 丢弃 -# else: -# gain[:, :, i] = img_data[:, :, 683] # 重复 - -# 光谱bin -gain = np.empty((150, 1, 1368)) -for i in range(gain.shape[0]): - gain[i, :, :] = (img_data[2 * i, :, :] + img_data[2 * i + 1, :, :]) / 2 - -header_tmp = spectral.envi.read_envi_header(gainfilepathhdr) - -wavetmp = [] -for i in range(150): # len(header_tmp["wavelength"]) - x = (float(header_tmp["wavelength"][2 * i]) + float(header_tmp["wavelength"][2 * i + 1])) / 2 - wavetmp.append(x) - - print("%.4f, " % x, end='') - -write_img(gainfilepath_out, gain) diff --git a/radiance_calibration_ui.py b/radiance_calibration_ui.py index 2e9eb30..b7f0d42 100644 --- a/radiance_calibration_ui.py +++ b/radiance_calibration_ui.py @@ -14,12 +14,18 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(964, 621) + MainWindow.resize(1153, 696) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout_2.setObjectName("gridLayout_2") - self.frame = QtWidgets.QFrame(self.centralwidget) + self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) + self.tabWidget.setObjectName("tabWidget") + self.tab = QtWidgets.QWidget() + self.tab.setObjectName("tab") + self.gridLayout_3 = QtWidgets.QGridLayout(self.tab) + self.gridLayout_3.setObjectName("gridLayout_3") + self.frame = QtWidgets.QFrame(self.tab) self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") @@ -74,6 +80,11 @@ class Ui_MainWindow(object): self.dn_bt.setObjectName("dn_bt") self.gridLayout.addWidget(self.dn_bt, 1, 2, 1, 1) self.dark_checkBox = QtWidgets.QCheckBox(self.frame) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.dark_checkBox.sizePolicy().hasHeightForWidth()) + self.dark_checkBox.setSizePolicy(sizePolicy) self.dark_checkBox.setChecked(True) self.dark_checkBox.setObjectName("dark_checkBox") self.gridLayout.addWidget(self.dark_checkBox, 2, 0, 1, 1) @@ -122,14 +133,100 @@ class Ui_MainWindow(object): self.out_file_bt.setSizePolicy(sizePolicy) self.out_file_bt.setObjectName("out_file_bt") self.gridLayout.addWidget(self.out_file_bt, 3, 2, 1, 1) - self.gridLayout_2.addWidget(self.frame, 0, 0, 1, 1) - self.operate_bt = QtWidgets.QPushButton(self.centralwidget) + self.gridLayout_3.addWidget(self.frame, 0, 0, 1, 1) + self.operate_bt = QtWidgets.QPushButton(self.tab) self.operate_bt.setMaximumSize(QtCore.QSize(16777215, 60)) self.operate_bt.setObjectName("operate_bt") - self.gridLayout_2.addWidget(self.operate_bt, 1, 0, 1, 1) + self.gridLayout_3.addWidget(self.operate_bt, 1, 0, 1, 1) + self.tabWidget.addTab(self.tab, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_2) + self.gridLayout_4.setObjectName("gridLayout_4") + self.label_2 = QtWidgets.QLabel(self.tab_2) + self.label_2.setAlignment(QtCore.Qt.AlignCenter) + self.label_2.setObjectName("label_2") + self.gridLayout_4.addWidget(self.label_2, 0, 0, 1, 1) + self.calfile_bin1_le = QtWidgets.QLineEdit(self.tab_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.calfile_bin1_le.sizePolicy().hasHeightForWidth()) + self.calfile_bin1_le.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(18) + self.calfile_bin1_le.setFont(font) + self.calfile_bin1_le.setReadOnly(True) + self.calfile_bin1_le.setObjectName("calfile_bin1_le") + self.gridLayout_4.addWidget(self.calfile_bin1_le, 0, 1, 1, 1) + self.calfile_bin1_bt = QtWidgets.QPushButton(self.tab_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.calfile_bin1_bt.sizePolicy().hasHeightForWidth()) + self.calfile_bin1_bt.setSizePolicy(sizePolicy) + self.calfile_bin1_bt.setObjectName("calfile_bin1_bt") + self.gridLayout_4.addWidget(self.calfile_bin1_bt, 0, 2, 1, 1) + self.label_5 = QtWidgets.QLabel(self.tab_2) + self.label_5.setAlignment(QtCore.Qt.AlignCenter) + self.label_5.setObjectName("label_5") + self.gridLayout_4.addWidget(self.label_5, 1, 0, 1, 1) + self.spatialbin_comboBox = QtWidgets.QComboBox(self.tab_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.spatialbin_comboBox.sizePolicy().hasHeightForWidth()) + self.spatialbin_comboBox.setSizePolicy(sizePolicy) + self.spatialbin_comboBox.setStyleSheet("") + self.spatialbin_comboBox.setEditable(False) + self.spatialbin_comboBox.setCurrentText("") + self.spatialbin_comboBox.setObjectName("spatialbin_comboBox") + self.gridLayout_4.addWidget(self.spatialbin_comboBox, 1, 1, 1, 1) + self.label_6 = QtWidgets.QLabel(self.tab_2) + self.label_6.setAlignment(QtCore.Qt.AlignCenter) + self.label_6.setObjectName("label_6") + self.gridLayout_4.addWidget(self.label_6, 2, 0, 1, 1) + self.spectral_comboBox = QtWidgets.QComboBox(self.tab_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.spectral_comboBox.sizePolicy().hasHeightForWidth()) + self.spectral_comboBox.setSizePolicy(sizePolicy) + self.spectral_comboBox.setObjectName("spectral_comboBox") + self.gridLayout_4.addWidget(self.spectral_comboBox, 2, 1, 1, 1) + self.label_7 = QtWidgets.QLabel(self.tab_2) + self.label_7.setAlignment(QtCore.Qt.AlignCenter) + self.label_7.setObjectName("label_7") + self.gridLayout_4.addWidget(self.label_7, 3, 0, 1, 1) + self.out_calfile_changebin_le = QtWidgets.QLineEdit(self.tab_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.out_calfile_changebin_le.sizePolicy().hasHeightForWidth()) + self.out_calfile_changebin_le.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(18) + self.out_calfile_changebin_le.setFont(font) + self.out_calfile_changebin_le.setReadOnly(True) + self.out_calfile_changebin_le.setObjectName("out_calfile_changebin_le") + self.gridLayout_4.addWidget(self.out_calfile_changebin_le, 3, 1, 1, 1) + self.out_calfile_bt = QtWidgets.QPushButton(self.tab_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.out_calfile_bt.sizePolicy().hasHeightForWidth()) + self.out_calfile_bt.setSizePolicy(sizePolicy) + self.out_calfile_bt.setObjectName("out_calfile_bt") + self.gridLayout_4.addWidget(self.out_calfile_bt, 3, 2, 1, 1) + self.change_bin_operate_bt = QtWidgets.QPushButton(self.tab_2) + self.change_bin_operate_bt.setMaximumSize(QtCore.QSize(16777215, 60)) + self.change_bin_operate_bt.setObjectName("change_bin_operate_bt") + self.gridLayout_4.addWidget(self.change_bin_operate_bt, 4, 0, 1, 3) + self.tabWidget.addTab(self.tab_2, "") + self.gridLayout_2.addWidget(self.tabWidget, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 964, 26)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1153, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) @@ -137,12 +234,13 @@ class Ui_MainWindow(object): MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "Corning Calibration v2.1")) - self.label.setText(_translate("MainWindow", "ASD辐亮度")) + MainWindow.setWindowTitle(_translate("MainWindow", "Corning Calibration v2.2.1")) + self.label.setText(_translate("MainWindow", "能量")) self.rad_bt.setText(_translate("MainWindow", "浏览...")) self.label_3.setText(_translate("MainWindow", "DN")) self.dn_bt.setText(_translate("MainWindow", "浏览...")) @@ -151,6 +249,15 @@ class Ui_MainWindow(object): self.label_4.setText(_translate("MainWindow", "输出路径")) self.out_file_bt.setText(_translate("MainWindow", "浏览...")) self.operate_bt.setText(_translate("MainWindow", "执行")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "rad cal")) + self.label_2.setText(_translate("MainWindow", "bin1 cal file")) + self.calfile_bin1_bt.setText(_translate("MainWindow", "浏览...")) + self.label_5.setText(_translate("MainWindow", "spatial bin")) + self.label_6.setText(_translate("MainWindow", "spectral bin")) + self.label_7.setText(_translate("MainWindow", "out")) + self.out_calfile_bt.setText(_translate("MainWindow", "浏览...")) + self.change_bin_operate_bt.setText(_translate("MainWindow", "执行")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "change bin")) if __name__ == "__main__": diff --git a/radiance_calibration_ui.ui b/radiance_calibration_ui.ui index 94340ea..089775b 100644 --- a/radiance_calibration_ui.ui +++ b/radiance_calibration_ui.ui @@ -6,205 +6,376 @@ 0 0 - 964 - 621 + 1153 + 696 - Corning Calibration v2.1 + Corning Calibration v2.2.1 - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - ASD辐亮度 - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 18 - - - - true - - - - - - - - 0 - 0 - - - - 浏览... - - - - - - - DN - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 18 - - - - true - - - - - - - - 0 - 0 - - - - 浏览... - - - - - - - dark_300tc - - - true - - - - - - - - 0 - 0 - - - - - 18 - - - - true - - - - - - - true - - - - 0 - 0 - - - - 浏览... - - - - - - - 输出路径 - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 18 - - - - true - - - - - - - - 0 - 0 - - - - 浏览... - - - - - - - - - - - 16777215 - 60 - - - - 执行 + + + 0 + + + rad cal + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 能量 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 18 + + + + true + + + + + + + + 0 + 0 + + + + 浏览... + + + + + + + DN + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 18 + + + + true + + + + + + + + 0 + 0 + + + + 浏览... + + + + + + + + 0 + 0 + + + + dark_300tc + + + true + + + + + + + + 0 + 0 + + + + + 18 + + + + true + + + + + + + true + + + + 0 + 0 + + + + 浏览... + + + + + + + 输出路径 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 18 + + + + true + + + + + + + + 0 + 0 + + + + 浏览... + + + + + + + + + + + 16777215 + 60 + + + + 执行 + + + + + + + + change bin + + + + + + bin1 cal file + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 18 + + + + true + + + + + + + + 0 + 0 + + + + 浏览... + + + + + + + spatial bin + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + + + false + + + + + + + + + + spectral bin + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + + + + out + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 18 + + + + true + + + + + + + + 0 + 0 + + + + 浏览... + + + + + + + + 16777215 + 60 + + + + 执行 + + + + + @@ -214,8 +385,8 @@ 0 0 - 964 - 26 + 1153 + 23