www.gusucode.com > VC++遥感原理与数字摄影测量实习源码程序 > VC++遥感原理与数字摄影测量实习源码程序\code\NDVI\NDVI.cpp
//Download by http://www.NewXing.com // NDVI.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "NDVI.h" #include <stdio.h> #include <stdlib.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; using namespace std; /* void Process(CString& file7, CString& file5, CString& file) { FILE* pFile7 = NULL; FILE* pFile5 = NULL; pFile7 = fopen(file7,"rb"); if(pFile7 == NULL) { printf("第7波段图像打开失败\n"); return; } pFile5 = fopen(file5,"rb"); if(pFile5 == NULL) { printf("第5波段图像打开失败\n"); return; } BITMAPFILEHEADER bmfh7, bmfh5; BITMAPINFOHEADER bmih7, bmih5; fread(&bmfh7, sizeof(BITMAPFILEHEADER), 1, pFile7); fread(&bmfh5, sizeof(BITMAPFILEHEADER), 1, pFile5); fread(&bmih7, sizeof(BITMAPINFOHEADER), 1, pFile7); fread(&bmih5, sizeof(BITMAPINFOHEADER), 1, pFile5); if(bmih7.biBitCount != 8 || bmih5.biBitCount != 8) { printf("只支持8位位图\n"); return; } DWORD width = bmih7.biWidth; DWORD height = bmih7.biHeight; DWORD _width = (width*8 + 31)/32*4; //saved width in files DWORD pixelCount = _width*height; if(width != bmih5.biWidth || height != bmih5.biHeight) { printf("两幅影像尺寸不一致\n"); return; } // printf("width:%d,height:%d\n", width, height); RGBQUAD rgbquad_7[256]; RGBQUAD rgbquad_5[256]; fread(rgbquad_7,sizeof(RGBQUAD),256,pFile7); fread(rgbquad_5,sizeof(RGBQUAD),256,pFile5); BYTE* pBits7 = new BYTE[pixelCount]; BYTE* pBits5 = new BYTE[pixelCount]; fread(pBits7,sizeof(BYTE),pixelCount,pFile7); fread(pBits5,sizeof(BYTE),pixelCount,pFile5); fclose(pFile7); fclose(pFile5); double* pExponent = new double[pixelCount]; DWORD i(0); double temp(0); double max = -100; double min = 100; BYTE* p7 = pBits7; BYTE* p5 = pBits5; double* pEx = pExponent; for(; i < pixelCount; ++ i) { int a = *p7; int b = *p5; temp = *p7 + *p5; if(temp) //如果 B7+B5 != 0,则计算该点指数 { *pEx = (*p7 - *p5)/temp; if(max < *pEx) max = *pEx; else if(min > *pEx) min = *pEx; } else *pEx = 0; //或者写成 // *pEx = (*p7+*p5)?((*p7-*p5)/(*p7++ + *p5++)):0; // if(*pEx == 1) // { // printf("%f\n",*pEx); // } pEx++; p7++; p5++; } // printf("Max:%.20f, Min:%.20f \n",max,min); //将指数归化到0-255的范围内保存为位图 pEx = pExponent; for(i = 0; i < pixelCount; ++i) { *pEx = *pEx * 127.5 + 127.5; //灰度线性变换 pEx++; } //保存位图 BITMAPINFOHEADER bmih = bmih7; bmih.biWidth = _width; FILE* pFile = fopen(file,"wb"); if(pFile == NULL) { printf("结果文件创建失败\n"); return; } fwrite(&bmfh7,sizeof(BITMAPFILEHEADER),1,pFile); fwrite(&bmih,sizeof(BITMAPINFOHEADER),1,pFile); fwrite(rgbquad_7,sizeof(RGBQUAD),256,pFile); pEx = pExponent; BYTE grayscale(0); for(i = 0; i < pixelCount; ++i) { grayscale = (BYTE)*pEx++; fwrite(&grayscale,1,1,pFile); } fclose(pFile); //clean up delete[] pBits7; delete[] pBits5; delete[] pExponent; pBits7 = p7 = NULL; pBits5 = p5 = NULL; pExponent = pEx = NULL; ShellExecute(NULL, "open", file, NULL, NULL, SW_SHOWNORMAL); }*/ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { if (argc != 5) { ::MessageBox(NULL,"启动参数不正确,请从GUI.exe启动","",MB_ICONASTERISK); return -1; } system("Mode con: COLS=50 LINES=15"); system("title NDVI"); int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } CString file7,file5,file,flag; //启动参数 file7 = argv[1]; file5 = argv[2]; file = argv[3]; flag = argv[4]; //判断是否在创建结果文件后显示 int m_flag = atoi(flag); if (GetFileAttributes(file7) == -1) { //the module does not exist CString err; err.Format("文件:%s不存在", file7); ::MessageBox(NULL,err, "Error", MB_ICONERROR); return -1; } if (GetFileAttributes(file5) == -1) { //the module does not exist CString err; err.Format("文件:%s不存在", file5); ::MessageBox(NULL,err, "Error", MB_ICONERROR); return -1; } // Process(file7, file5, file); FILE* pFile7 = NULL; FILE* pFile5 = NULL; pFile7 = fopen(file7,"rb"); if(pFile7 == NULL) { printf("第7波段图像打开失败\n"); nRetCode = 1; return nRetCode; } pFile5 = fopen(file5,"rb"); if(pFile5 == NULL) { printf("第5波段图像打开失败\n"); nRetCode = 1; return nRetCode; } BITMAPFILEHEADER bmfh7, bmfh5; BITMAPINFOHEADER bmih7, bmih5; fread(&bmfh7, sizeof(BITMAPFILEHEADER), 1, pFile7); fread(&bmfh5, sizeof(BITMAPFILEHEADER), 1, pFile5); fread(&bmih7, sizeof(BITMAPINFOHEADER), 1, pFile7); fread(&bmih5, sizeof(BITMAPINFOHEADER), 1, pFile5); if(bmih7.biBitCount != 8 || bmih5.biBitCount != 8) { printf("只支持8位位图\n"); nRetCode = 1; return nRetCode; } DWORD width = bmih7.biWidth; DWORD height = bmih7.biHeight; DWORD _width = (width*8 + 31)/32*4; //saved width in files DWORD pixelCount = _width*height; if(width != bmih5.biWidth || height != bmih5.biHeight) { printf("两幅影像尺寸不一致\n"); nRetCode = 1; return nRetCode; } RGBQUAD rgbquad_7[256]; RGBQUAD rgbquad_5[256]; fread(rgbquad_7,sizeof(RGBQUAD),256,pFile7); fread(rgbquad_5,sizeof(RGBQUAD),256,pFile5); BYTE* pBits7 = new BYTE[pixelCount]; BYTE* pBits5 = new BYTE[pixelCount]; fread(pBits7,sizeof(BYTE),pixelCount,pFile7); fread(pBits5,sizeof(BYTE),pixelCount,pFile5); fclose(pFile7); fclose(pFile5); double* pExponent = new double[pixelCount]; DWORD i(0); double temp(0); double max = -100; double min = 100; BYTE* p7 = pBits7; BYTE* p5 = pBits5; double* pEx = pExponent; for(; i < pixelCount; ++ i) { int a = *p7; int b = *p5; temp = *p7 + *p5; if(temp) //如果 B7+B5 != 0,则计算该点指数 { *pEx = (*p7 - *p5)/temp; if(max < *pEx) max = *pEx; else if(min > *pEx) min = *pEx; } else *pEx = 0; pEx++; p7++; p5++; } //将指数归化到0-255的范围内保存为位图 pEx = pExponent; for(i = 0; i < pixelCount; ++i) { *pEx = *pEx * 127.5 + 127.5; //灰度线性变换 pEx++; } //保存位图 BITMAPINFOHEADER bmih = bmih7; bmih.biWidth = _width; FILE* pFile = fopen(file,"wb"); if(pFile == NULL) { printf("结果文件创建失败\n"); nRetCode = 1; return nRetCode; } fwrite(&bmfh7,sizeof(BITMAPFILEHEADER),1,pFile); fwrite(&bmih,sizeof(BITMAPINFOHEADER),1,pFile); fwrite(rgbquad_7,sizeof(RGBQUAD),256,pFile); pEx = pExponent; BYTE grayscale(0); for(i = 0; i < pixelCount; ++i) { grayscale = (BYTE)*pEx++; fwrite(&grayscale,1,1,pFile); } fclose(pFile); //clean up delete[] pBits7; delete[] pBits5; delete[] pExponent; pBits7 = p7 = NULL; pBits5 = p5 = NULL; pExponent = pEx = NULL; if (m_flag == 1) { ShellExecute(NULL, "open", file, NULL, NULL, SW_SHOWNORMAL); } return nRetCode; }