版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、實驗 直方圖均衡化的計算機實現(xiàn)一、 實驗目的: 1) 熟悉直方圖均衡化處理的理論基礎; 2) 掌握直方圖均衡化處理的計算機實現(xiàn)方法; 3) 學習 Matlab 編程方法; 4) 學習 VC+6.0 編程方法; 5) 驗證直方圖均衡化處理理論; 6) 觀察直方圖均衡化處理的結果。 二、 實驗要求: 1) 學習 Matlab 編程步驟及相關圖像處理函數(shù),利用 Matlab 實現(xiàn)圖像直方圖均衡化,并提交 Matlab 程序及說明文檔。 2) 學習 VC+編程的步驟及流程,利用 VC+實現(xiàn)圖像直方圖均衡化; 3) 提交加注釋的 VC+程序及程序說明文檔; 4) 提交第三章學過的直方圖及直方圖相關算法的
2、處理步驟及作用; 5) 提交直方圖均衡化處理的步驟及處理效果,附上實驗效果圖,寫出本次實驗的體會。 三、實驗時間: 第九周,第十周兩次實驗課,共四個學時。 附件:VC+6.0 實現(xiàn)直方圖均衡化處理編程指南 直方圖均衡化處理編程指南本程序?qū)⒃?Microsoft Visual C+6.0 開發(fā)環(huán)境下構建,所以,在開始之前,請確定您所使用的計算機已經(jīng)正確安裝了 Microsoft Visual C+6.0(具體的安裝方法請詳見 MicrosoftVisual C+6.0 用戶手冊,低于 6.0 的版本是否可以運行在此不做討論)。下面,請用該指南構建一個直方圖均衡化處理的程序。一、創(chuàng)建對話框資源利用
3、 Microsoft Visual Studio 的對話框編輯器來設計對話框并創(chuàng)建對話框資源。步驟如下:1、Visual C+6.0 啟動步驟: 安裝好 Visual C+6.0; 按路徑開始程序Microsoft Visual Studio 6.0Microsoft Visual C+ 6.0啟動 VC; 出現(xiàn) VC 界面后,按路徑“File-New”進入創(chuàng)建項目對話框;2、在彈出的對話框中單擊 Projects 選項卡,并單擊 MFC AppWizard (exe),在右側(cè)的 Projectname 一欄中輸入工程文件名,在此我們輸入 HistDemoA(讀者可以輸入自己的工程文件名,但為
4、了統(tǒng)一起見,建議初學者輸入和本文相同的名字,以便于后面的理解),如下圖所示:圖 1完成后,單擊 OK 按鈕。3、在彈出的 MFC AppWizard 中,選擇 Dialog based,如下圖所示,圖 2其它各項均接受默認的設置。生成對話框應用程序界面如下所示:圖 34、刪除“取消”按鈕及“TODO:在這里設置對話框”靜態(tài)文本框。右鍵單擊“確定”按鈕,在彈出的菜單中選擇 Properties,在彈出的按鈕屬性對話框中將“確定”按鈕的 Caption改為“關閉”。5、改變對話框的大小。用鼠標直接拖拉就可以調(diào)整這個對話框的大小。在這里,我們通過鼠標的拖拉,將對話框的大小改為 500270(為了后面
5、能合適地顯示圖像。本程序在 1024768 的分辨率下調(diào)試,如果讀者使用不同的分辨率,請根據(jù)具體情況做相應的調(diào)整),這個大小將在窗口右下側(cè)的狀態(tài)欄中顯示出來。6、添加對話框控件。通過控件調(diào)色板來添加控件(如果控件調(diào)色板不可見的話,在工具欄上單擊右鍵,從列表中選擇 Controls 即可)。可以把控件直接從控件調(diào)色板上拖拉到新的對話框中,然后放到合適的位置,并且改變控件大小。在這里,我們添加兩個靜態(tài)文本框,右鍵單擊 Properties,將它們的 Caption 分別設置為:“原始圖像”和“直方圖均衡化處理后的圖像”。然后添加兩個按鈕,右鍵單擊 Properties,在屬性設置中分別將它們的 I
6、D 設置為“IDC_OPEN”和“IDC_HIST”,Caption 分別設置為“打開文件”和“直方圖均衡化”。將新添加的這些控件拖拉到合適的位置后,對話框界面如下所示:圖 4二、創(chuàng)建 CImageWnd 類1、單擊菜單欄的 Insert,選擇 New Class,在彈出的對話框中,將 Class type 選為 GenericClass,并在 Name 欄中輸入 CImageWnd,然后點擊 OK 按鈕。如下圖所示:圖 52、通過工作區(qū)的 FileView 找到 ImageWnd.h 文件,打開它并將類定義部分的 classCImageWnd 修改為 class CImageWnd:publ
7、ic CWnd。3、為類 CImageWnd 添加成員變量。通過工作區(qū)的 ClassView,找到類 CImageWnd,單擊右鍵,在彈出的菜單中選擇 Add Member Variable,在彈出的對話框中輸入要添加的成員變量的類型及名字,及選擇訪問限定語。在這里,我們依次加入訪問限定語為 public 的下列int 型變量:HCurrentPosition,HScrollMax,HScrollPosition,VCurrentPosition,VScrollMax,VScrollPosition,nWidth,nHeight,nByteWidth。然后再添加訪問限定語為 public,類型
8、為BYTE 的成員變量*lpBits。完成類 CimageWnd 的成員變量的添加。4、為類 CimageWnd 添加成員函數(shù)。通過工作區(qū)的 ClassView,找到類 CImageWnd,單擊右鍵,在彈出的菜單中選擇 Add Member Function,在彈出的對話框中輸入要添加的成員函數(shù)的類型及聲明,及選擇訪問限定語。在此我們添加以下的成員函數(shù):訪問限定語為public,類型為 void 的 SetImage(int cx,int cy,const void *bits),在函數(shù)的定義部分加入如下的代碼:nWidth=cx;nHeight=cy;nByteWidth=nWidth*3;
9、if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);if (lpBits) delete lpBits;lpBits=new BYTEnByteWidth*nHeight;memcpy(lpBits,bits,nByteWidth*nHeight);if (cx>320 | cy>240) SetScroll(cx,cy);else SetScroll(0,0);Invalidate();然后添加訪問限定語為 public,類型為 void 的 SetScroll(int cx,int cy),并在函數(shù)的定義部分加入如下代碼:HScroll
10、Position=0;HCurrentPosition=0;VScrollPosition=0;VCurrentPosition=0;SetScrollPos(SB_HORZ,0);SetScrollPos(SB_VERT,0);SCROLLINFO sinfo;sinfo.cbSize=sizeof(SCROLLINFO);sinfo.fMask=SIF_PAGE|SIF_RANGE;sinfo.nMin=0;/HScrollsinfo.nMax=cx-1;sinfo.nPage=302;SetScrollInfo(SB_HORZ,&sinfo);HScrollMax=cx-302;
11、/VScrollsinfo.nMax=cy-1;sinfo.nPage=222;SetScrollInfo(SB_VERT,&sinfo);VScrollMax=cy-222;5、為類 CimageWnd 添加構造函數(shù)和析構函數(shù)。在構造函數(shù) CImageWnd:CImageWnd()的定義體內(nèi)加入下面的代碼:HScrollPosition=0;HCurrentPosition=0;HScrollMax=0;VScrollPosition=0;VCurrentPosition=0;VScrollMax=0;lpBits=0;在析構函數(shù) CImageWnd:CImageWnd()的定義體內(nèi)
12、加入下面的代碼:if (lpBits) delete lpBits;6、為類 CimageWnd 添加消息映射。打開文 ImageWnd.h,并添加如下代碼:protected:/AFX_MSG(CImageWnd)afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);afx_msg void
13、 OnPaint();afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);/AFX_MSGDECLARE_MESSAGE_MAP()打開文件 ImageWnd.cpp,在析構函數(shù) CImageWnd:CImageWnd()的定義后面,加入下面的代碼:BEGIN_MESSAGE_MAP(CImageWnd, CWnd)/AFX_MSG_MAP(CImageWnd)ON_WM_ERASEBKGND()ON_WM_HSCROLL()ON_WM_VSCROLL()ON_WM_PAINT()ON_WM_CREATE()/AFX_MSG_MAPEND_M
14、ESSAGE_MAP()7、添加消息處理函數(shù)。打開文件 ImageWnd.cpp,加入下面的代碼:#define BACKGROUND RGB(128,128,128)BOOL CImageWnd:OnEraseBkgnd(CDC* pDC)if (!lpBits) pDC->FillSolidRect(0,0,320,240,BACKGROUND);return TRUE;void CImageWnd:OnPaint()CPaintDC dc(this); / device context for paintingif (lpBits)int x,y;x=-HScrollPositio
15、n;y=-VScrollPosition;if (nWidth<320) x=(320-nWidth)/2;if (nHeight<240) y=(240-nHeight)/2;BITMAPINFOHEADER bmi;bmi.biSize=sizeof(BITMAPINFOHEADER);bmi.biWidth=nWidth;bmi.biHeight=nHeight;bmi.biPlanes=1;bmi.biBitCount=24;bmi.biCompression=BI_RGB;bmi.biSizeImage=0;bmi.biXPelsPerMeter=0;bmi.biYPel
16、sPerMeter=0;bmi.biClrUsed=0;bmi.biClrImportant=0;StretchDIBits(dc.m_hDC,x,y,nWidth,nHeight,0,0,nWidth,nHeight,lpBits,(BITMAPINFO *)&bmi,DIB_RGB_COLORS,SRCCOPY);void CImageWnd:OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)switch(nSBCode)case SB_LINEDOWN:HScrollPosition+=5;break;case S
17、B_LINEUP:HScrollPosition-=5;break;case SB_PAGEDOWN:HScrollPosition+=302;break;case SB_PAGEUP:HScrollPosition-=302;break;case SB_THUMBPOSITION:case SB_THUMBTRACK:HScrollPosition=nPos;break;if (HScrollPosition<0) HScrollPosition=0;if (HScrollPosition>HScrollMax) HScrollPosition=HScrollMax;SetScr
18、ollPos(SB_HORZ,HScrollPosition);if (HCurrentPosition!=HScrollPosition)ScrollWindow(HCurrentPosition-HScrollPosition),0);HCurrentPosition=HScrollPosition;CWnd:OnHScroll(nSBCode, nPos, pScrollBar);void CImageWnd:OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)switch(nSBCode)case SB_LINEDOWN:
19、VScrollPosition+=5;break;case SB_LINEUP:VScrollPosition-=5;break;case SB_PAGEDOWN:VScrollPosition+=222;break;case SB_PAGEUP:VScrollPosition-=222;break;case SB_THUMBPOSITION:case SB_THUMBTRACK:VScrollPosition=nPos;break;if (VScrollPosition<0) VScrollPosition=0;if (VScrollPosition>VScrollMax) VS
20、crollPosition=VScrollMax;SetScrollPos(SB_VERT,VScrollPosition);if (VCurrentPosition!=VScrollPosition)ScrollWindow(0,(VCurrentPosition-VScrollPosition);VCurrentPosition=VScrollPosition;CWnd:OnVScroll(nSBCode, nPos, pScrollBar);int CImageWnd:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CWnd:OnCreate(lpC
21、reateStruct) = -1)return -1;return 0;三、為 CHistDemoADlg 添加代碼1 、 找 到 并 雙 擊 打 開 文 件 HistDemoADlg.h ( 通 過 工 作 區(qū) 的 FileView ), 在 classCHistDemoADlg : public Cdialog 前添加#include "ImageWnd.h"2、在 HistDemoADlg.h 的 public 部分,CHistDemoADlg(CWnd* pParent = NULL);之后加入下面的語句:int nWidth;int nHeight;int nL
22、en;int nByteWidth;BYTE *lpBackup;BYTE *lpBitmap;BYTE *lpBits;CString FileName;CImageWnd source,dest;3、單擊菜單欄的 View,在彈出的菜單中選擇 ClassWizard,然后在彈出的對話框中選擇Message Maps 選項卡,在 Class name 下拉列表框中選擇 CHistDemoADlg,在 Object IDs中選擇 CHistDemoADlg,在 Member functions 中選擇雙擊 OnInitDialog, 如果沒有的話,在 Messages 中 雙 擊 WM_INI
23、TDIALOG 添 加 ), 窗 口 將 跳 轉(zhuǎn) 到 BOOLCHistDemoADlg:OnInitDialog()的定義部分。在“/ TODO: Add extra initialization here”(后面加入下面的代碼:source.Create(0,"Source",WS_CHILD|WS_VISIBLE,CRect(40,40,360,280), this, 10000);dest.Create(0,"Destination",WS_CHILD|WS_VISIBLE,CRect(400,40,720,280), this,10001);至
24、此,編譯我們的建立的程序,界面如下圖所示: 如有任何錯誤不能正常編譯通過,請讀者仔細檢查前面的編程步驟,筆者按此建立過程成功編譯通過并顯示出下面的界面)圖 6單擊按鈕“打開文件”和“直方圖均衡化”,沒有任何反映,因為我們還沒有給它們添加響應。單擊“關閉”按鈕,對話框關閉。四、為“打開文件”按鈕添加響應。1、為類 CHistDemoADlg 添加成員函數(shù) void LoadBitmap ( )。打開工作區(qū)的 ClassView,右鍵盤單擊類 CHistDemoADlg,在彈出的菜單中選擇 Add Member function,在彈出的對話框中加入訪問限定語為 public,函數(shù)類型為 void
25、,函數(shù)聲明為 LoadBitmap 的成員函數(shù),點擊“OK”按鈕,編輯窗口將跳轉(zhuǎn)到函數(shù) void LoadBitmap ( )的定義部分。在函數(shù) void LoadBitmap ( )的定義部分的定義部分加入下面的代碼:BITMAPINFOHEADER *pInfo;pInfo=(BITMAPINFOHEADER *)(lpBitmap+sizeof(BITMAPFILEHEADER);nWidth=pInfo->biWidth;nByteWidth=nWidth*3;if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);nHeight=pInfo
26、->biHeight;if (pInfo->biBitCount!=24)if (pInfo->biBitCount!=8)AfxMessageBox("無效位圖");delete lpBitmap;(lpBitmap=0;return;unsigned int PaletteSize=1<<pInfo->biBitCount;if (pInfo->biClrUsed!=0 && pInfo->biClrUsed<PaletteSize)PaletteSize=pInfo->biClrUsed;lp
27、Bits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);RGBQUAD *pPalette=(RGBQUAD *)lpBits;lpBits+=sizeof(RGBQUAD)*PaletteSize;nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*nHeight;BYTE *lpTemp=lpBitmap;lpBitmap=new BYTEnLen;BITMAPFILEHEADER bmh;BITMAPINFOHEADER bmi;bmh.
28、bfType='B'+'M'*256;bmh.bfSize=nLen;bmh.bfReserved1=0;bmh.bfReserved2=0;bmh.bfOffBits=54;bmi.biSize=sizeof(BITMAPINFOHEADER);bmi.biWidth=nWidth;bmi.biHeight=nHeight;bmi.biPlanes=1;bmi.biBitCount=24;bmi.biCompression=BI_RGB;bmi.biSizeImage=0;bmi.biXPelsPerMeter=0;bmi.biYPelsPerMeter=0;
29、bmi.biClrUsed=0;bmi.biClrImportant=0;int nBWidth=pInfo->biWidth;if (nBWidth%4) nBWidth+=4-(nBWidth%4);memset(lpBitmap,0,nLen);memcpy(lpBitmap,&bmh,sizeof(BITMAPFILEHEADER);memcpy(lpBitmap+sizeof(BITMAPFILEHEADER),&bmi,sizeof(BITMAPINFOHEADER);BYTE*lpBits2=lpBitmap+sizeof(BITMAPFILEHEADER)
30、+sizeof(BITMAPINFOHEADER);int x,y,p1,p2,Palette;for(y=0;y<nHeight;y+)for(x=0;x<nWidth;x+)p1=y*nBWidth+x;p2=y*nByteWidth+x*3;if (lpBitsp1<PaletteSize) Palette=lpBitsp1;else Palette=0;lpBits2p2=pPalettePalette.rgbBlue;lpBits2p2+1=pPalettePalette.rgbGreen;lpBits2p2+2=pPalettePalette.rgbRed;del
31、ete lpTemp;lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);if (lpBackup) delete lpBackup;lpBackup=new BYTEnLen;memcpy(lpBackup,lpBitmap,nLen);2、單擊菜單欄的 View,在彈出的菜單中選擇 ClassWizard,然后在彈出的對話框中選擇 Message Maps 選項卡,在 Class name 下拉列表框中選擇 CHistDemoADlg,在 ObjectIDs 中選擇 IDC_OPEN,在 Messages 中單
32、擊 BN_CLICKED,然后再單擊 ADD Function按鈕,將彈出添加成員函數(shù)的對話框,如下圖所示:圖 7接受默認的函數(shù)名,單擊“OK”按鈕,就成功地添加了該成員函數(shù)。單擊“Edit Code”按鈕,窗口將跳轉(zhuǎn)到該成員函數(shù)的定義部分,加入下面的代碼:CFile File=0;CFileDialog dlg(TRUE,0,0,OFN_HIDEREADONLY," 位 圖 文 件 |*.bmp| 所 有 文 件|*.*|",this);if (dlg.DoModal()=IDOK)FileName=dlg.GetPathName();if (!File.Open(Fil
33、eName,CFile:modeRead) return;/ TODO: add loading code hereif (lpBitmap) delete lpBitmap;nLen=File.GetLength();lpBitmap=new BYTEnLen;File.Read(lpBitmap,nLen);LoadBitmap();if (lpBitmap) source.SetImage(nWidth,nHeight,lpBits);3、在類 CHistDemoADlg 的構造函數(shù) CHistDemoADlg(CWnd* pParent /*=NULL*/)中加入下面的代碼:lpBit
34、map=0;lpBackup=0;到此為止,我們所構建的程序已經(jīng)能實現(xiàn)對單擊“打開文件”按鈕的響應。編譯程序,并打開 BMP 文件,如下圖所示:圖 8五、為“直方圖均衡化”按鈕添加響應1、單擊菜單欄的 View,在彈出的菜單中選擇 ClassWizard,然后在彈出的對話框中選擇 Message Maps 選項卡,在 Class name 下拉列表框中選擇 CHistDemoADlg,在 ObjectIDs 中選擇 IDC_HIST,在 Messages 中單擊 BN_CLICKED,然后再單擊 ADD Function按鈕,將彈出添加成員函數(shù)的對話框,如下圖所示:圖 9接受默認的函數(shù)名,單擊
35、“OK”按鈕,就成功地添加了該成員函數(shù)。單擊“Edit Code”按鈕,窗口將跳轉(zhuǎn)到該成員函數(shù)的定義部分,加入下面的代碼:HistogramEq();2、剛剛添加的 HistogramEq()實現(xiàn)直方圖均衡化處理的算法。我們在 HistDemoADlg.cpp中加入下面的代碼:#define Point(x,y) lpPoints(x)+(y)*nWidth#define Point1(x,y) lpPoints1(x)+(y)*nWidthvoid GetPoints(int nWidth,int nHeight,BYTE *lpBits,BYTE *lpPoints)int x,y,p;i
36、nt nByteWidth=nWidth*3;if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);for(y=0;y<nHeight;y+)for(x=0;x<nWidth;x+)p=x*3+y*nByteWidth;lpPointsx+y*nWidth=(BYTE)(0.299*(float)lpBitsp+2+0.587*(float)lpBitsp+1+0.114*(float)lpBitsp+0.1);void PutPoints(int nWidth,int nHeight,BYTE *lpBits,BYTE *lpPoints)
37、int nByteWidth=nWidth*3;if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);int x,y,p,p1;for(y=0;y<nHeight;y+)for(x=0;x<nWidth;x+)p=x*3+y*nByteWidth;p1=x+y*nWidth;lpBitsp=lpPointsp1;lpBitsp+1=lpPointsp1;lpBitsp+2=lpPointsp1;3、為類 CHistDemoADlg 添加成員函數(shù) HistogramEq( )。打開工作區(qū)的 ClassView,右鍵盤單擊類 CHistDemoA
38、Dlg,在彈出的菜單中選擇 Add Member function,在彈出的對話框中加入訪問限定語為 public,函數(shù)類型為 void,函數(shù)聲明為 HistogramEq 的成員函數(shù),點擊“OK”按鈕,編輯窗口將跳轉(zhuǎn)到函數(shù) void CHistDemoADlg:HistogramEq( )的定義部分。在函數(shù) void CHistDemoADlg:HistogramEq()的定義部分加入下面的代碼:if (lpBitmap=0) return;BYTE *lpOutput=new BYTEnByteWidth*nHeight;HistogramEq1(nWidth,nHeight,lpBits
39、,lpOutput);dest.SetImage(nWidth,nHeight,lpOutput);delete lpOutput;NoColor();4、為類 CHistDemoADlg 添加成員函數(shù) HistogramEq1(int nWidth,int nHeight,BYTE*lpInput,BYTE *lpOutput)。打開工作區(qū)的 ClassView,右鍵盤單擊類 CHistDemoADlg,在彈出的菜單中選擇 Add Member function,在彈出的對話框中加入訪問限定語為public,函數(shù)類型為 void,函數(shù)聲明為 HistogramEq1(int nWidth,int nHeig
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 呼吁保護動物的演講稿(9篇)
- 油漆施工行業(yè)的安全管理研究-洞察分析
- 文物修復與保護法律規(guī)范-洞察分析
- 虛擬現(xiàn)實技術在珠寶行業(yè)的應用與忠誠度提升-洞察分析
- 藥物安全性評估方法-洞察分析
- 溯源技術對農(nóng)產(chǎn)品質(zhì)量提升-洞察分析
- 虛擬現(xiàn)實縫紉設備操作模擬-洞察分析
- 太陽活動與臭氧層變化關聯(lián)性分析-洞察分析
- 圖像重建與超分辨率-洞察分析
- 網(wǎng)絡文學市場趨勢預測-洞察分析
- 人際溝通.從心開始(大學生人際交往)
- KYN28-12A開關柜技術規(guī)范書
- 化療藥物滲漏PDCA循環(huán)分析
- 國開《小學數(shù)學教學研究》形考任務二
- 維修方案模板
- 冶金行業(yè)特殊工種有哪些崗位
- 分布式光伏發(fā)電項目投標技術方案(純方案)
- 增強指數(shù)策略
- 能源中國學習通課后章節(jié)答案期末考試題庫2023年
- 初中部綜合素質(zhì)評價實施方案范本(三篇)
- 寧夏困難殘疾人生活補貼申請審批表
評論
0/150
提交評論