#pragma once #include #include #include #include #include #include #include #include #include #include "ui_niirs.h" #include #include #include #include #include //#include //#include #include "gdal_priv.h" using namespace std; struct ImgInfo { GDALDataType dataType; //标示数据类型 int bandCount; //数据波段数目 int xSize; //数据在x方向上的尺寸 int ySize; //数据在y方向上的尺寸 int xOffset; //x方向上的偏移; int yOffset; //y方向上的偏移; char projWkt[1024]; //数据的投影方式 double geoTransform[6]; //数据的仿射坐标 double noData; //数据的背景值 }; class NIIRS : public QMainWindow { Q_OBJECT public: NIIRS(QWidget* parent = Q_NULLPTR); void setXmlInterface(QString strXmlInterface); /* 计算NIIRS * @return NIIRS */ double calculateNiirsScore(); //计算10个客观参数 void calculateObjectivePara(); //void calculateEvaluationImage(); double calculateRER(); /* * @brief 获取图像基础信息并保存至结构体 * @param srcImgPath 输入文件路径 * @param imgInfo 结构体,保存获取的tiff文件信息 * @return 返回错误信息 */ int getImageInfo(const char* srcImgPath, struct ImgInfo* imgInfo); /* * @brief 按波段读取tiff * @param srcImgPath 输入文件路径 * @param imgInfo 结构体,存储tiff文件信息 * @param imgArray 读取的tiff数组 * @param bandIndex 要读取的波段,bandIndex=0,则读取所有波段 * @return 返回错误信息 */ int readTiffFile(const char* srcImgPath, ImgInfo imgInfo, void* imgArray, int bandIndex); void initTableWidget(int rowNum, int colNum); void setTableWidgetValue(double val, int row, int col); /* * @brief 遍历文件夹下文件 * @param path 输入文件路径 * @param fileType 文件格式 * @return 文件路径absoluteFilePath,返回空值时为存在错误 */ QStringList getAllFiles(QString path, QString fileType); public slots: void onRadioBtn_Visi(); void onRadioBtn_Infra(); void on_pbtOpenImg_clicked(); //void on_pbtOpenEdgeX_clicked(); //void on_pbtOpenEdgeY_clicked(); private: Ui::NIIRSClass ui; /* 计算噪声增益 * @param kernel MTFC所使用的滤波器 * @return MTFC_G噪声增益 */ double calculateMTFC_G(cv::Mat kernel); ////计算信噪比,mean/StdDev //double calculateSNR(cv::Mat img); /* 计算数字图像亮度 * @return 灰度图片平均亮度 */ double calculateMeanStdDev(cv::Mat img); ////计算图像标准差方差 //float calculateStdDev(cv::Mat img); //计算图像对比度 double calculateContrastRatio(cv::Mat img); ////计算信息熵 //double calculateEntropy(cv::Mat img); /* * @brief 计算单波段的图像熵 * @param imgArray tiff数组 * @param maxVal tiff波段中的最大值 * @return 该波段的图像熵 */ double calculateTiffEntropy(unsigned short* bandBuf, int bufSize, int maxVal); //计算相对边缘相应 // double calculateERx(cv::Mat img); // double calculateERy(cv::Mat img); //return pair.first:ER, pair.second:H QPair calculateERx(cv::Mat img); QPair calculateERy(cv::Mat img); QPair calculate_rer_h(cv::Mat img, cv::Point pointA, cv::Point pointB); cv::Point2d calculateFootPoint(array& ps); //float SFRCalculation(cv::Mat& ROI, double gamma); //void de_Gamma(cv::Mat& Src, double gamma); //std::vector CentroidFind(cv::Mat& Src, std::vector& y_shifts, double* CCoffset); //void SLR(std::vector& Cen_Shifts, std::vector& y_shifts, double* a, double* b); //void ReduceRows(double slope, int* ImgHeight); //std::vector OverSampling(cv::Mat& Src, double slope, double CCoffset, int height, int width, int* SamplingLen); //std::vector HammingWindows(std::vector& deSampling, int SamplingLen); //void DFT(std::vector& data, int size); //陡度 //基于sobel算子,计算平均梯度 double gradient_Sobel(cv::Mat img); //基于Laplacian算子,拉普拉斯导数,评价清晰度 double definition_Laplacian(cv::Mat img); //四个方向的角二阶矩 void get_GLCM_0deg(cv::Mat& input, cv::Mat& dst); void get_GLCM_90deg(cv::Mat& input, cv::Mat& dst); void get_GLCM_45deg(cv::Mat& input, cv::Mat& dst); void get_GLCM_135deg(cv::Mat& input, cv::Mat& dst); //计算二阶矩的特征值 double calculateASM(cv::Mat& src); //PIQE double calculatePIQEScore(cv::Mat& img); bool noticeDistCriterion(cv::Mat Block, int nSegments, int blockSize_1, int windowSize, float blockImpairedThreshold, int blockSize); cv::Mat segmentEdge(cv::Mat blockEdge, int nSegments, int blockSize_1, int windowSize); float noiseCriterion(cv::Mat Block, int blockSize_1, float blockVar, float blockStdDev); float centerSurDev(cv::Mat Block, int blockSize_1); // 计算垂足的坐标,array:点、直线两端点 cv::Point calculate_foot_point(array& ps); // 计算两点距离 float pointDistance(cv::Point pt1, cv::Point pt2); //// 计算两直线交点 //cv::Point line_intersection(array& line1, array& line2); //// 根据一条线的点pt、斜率k、另一条水平或垂直的直线的端点,求交点 //cv::Point point_k_edge_intersection(cv::Point pt, double k, array& line); //// 计算点到直线距离 //int calculate_distance(array& ps); bool jpegTest = false; //int mBandCount = 0; QString mXmlInterface = ""; //QString mXmlImgPath = "/home/testdata/19data/VALID-ALIGACE/JB19-2_MSS_000811113_MMB04_001_01_001_003_L1/JB19-2_MSS_000811113_MMB04_001_01_001_003_L1.tiff"; QString mXmlImgPath = "";//D:\\A_testdata\\niirs_test\\data\\GF2_mask1024.tif QString mXmlTopLeftX = "0";//311,336 QString mXmlTopLeftY = "0";//324,293 QString mXmlBottomRightX = "0";//335,348 QString mXmlBottomRightY = "0";//337,311 QString mXmlProductDir = ""; QString mResultXmlDir = ""; cv::Point mRerEdgePointA; cv::Point mRerEdgePointB; double imgLight = 0.0; //亮度 double imgStdDev = 0.0; //标准差 double imgContrastRadio = 0.0; //对比度 double imgEntropy = 0.0; //熵 double imgSNR = 0.0; //信噪比 double imgGradient = 0.0; //陡度 double imgDefinition = 0.0; //清晰度 double imgASM = 0.0; //角二阶矩 double imgPIQE = 0.0; //PIQE double imgRER = 0.986; //相对边缘响应 };