版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 設計題目:直方圖均衡化</p><p> 1、直方圖的理論基礎:</p><p> ?。?)直方圖概念:灰度直方圖表示圖像中每種灰度出現(xiàn)的頻率。</p><p> (2)直方圖的作用: 反映一幅圖像的灰度分布特性</p><p> ?。?)直方圖的計算:</p><p> 式中:nk為圖像中
2、出現(xiàn)rk級灰度的像素數(shù),n是圖像像素總數(shù),而nk/n即為頻數(shù)。</p><p> 2、設計目的: 產生一幅灰度級分布具有均勻概率密度的圖像,擴展像素取值的動態(tài)范圍,達到了圖象增強的目的。</p><p> 3、直方圖均衡化的效果 : </p><p> 1)變換后直方圖趨向平坦,灰級減少,灰度合并。 </p><p> 2)原始象含
3、有象素數(shù)多的幾個灰級間隔被拉大了,壓縮的只是象素數(shù)少的幾個灰度級,實際視覺能夠接收的信息量大大地增強了,增加了圖象的反差。同時,也增加了圖象的可視粒度。 </p><p> 4、離散情況下的直方圖均衡化的算法:</p><p> A、列出原始圖像的灰度級 </p><p> B、統(tǒng)計各灰度級的像素數(shù)目</p><p> C、計
4、算原始圖像直方圖各灰度級的頻數(shù)</p><p> D、計算累積分布函數(shù)</p><p> F、應用以下公式計算映射后的輸出圖像的灰度級,P為輸出圖像灰度級的個數(shù),其中INT為取整符號:</p><p> G、用的映射關系修改原始圖像的灰度級,從而獲得直方圖近似為均勻分布的輸出圖像。</p><p><b> 3、源程序代碼&
5、lt;/b></p><p> // cqxhistView.cpp : implementation of the CCqxhistView class</p><p> #include "stdafx.h"</p><p> #include "cqxhist.h"</p><p>
6、 #include "cqxhistDoc.h"</p><p> #include "cqxhistView.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p>
7、<p> static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> /
8、/ CCqxhistView</p><p> IMPLEMENT_DYNCREATE(CCqxhistView, CView)</p><p> BEGIN_MESSAGE_MAP(CCqxhistView, CView)</p><p> //{{AFX_MSG_MAP(CCqxhistView)</p><p> ON_COMM
9、AND(ID_OPEN_IMAGE, OnOpenImage)</p><p> ON_COMMAND(ID_HIST_IMAGE, OnHistImage)</p><p> //}}AFX_MSG_MAP</p><p> // Standard printing commands</p><p> ON_COMMAND(ID_F
10、ILE_PRINT, CView::OnFilePrint)</p><p> ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)</p><p> ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)</p><p> END_MESSA
11、GE_MAP()</p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CCqxhistView construction/destruction</p><p> CCqxhistView::CCqxhistView
12、()</p><p><b> {</b></p><p> // TODO: add construction code here</p><p><b> }</b></p><p> CCqxhistView::~CCqxhistView()</p><p>&
13、lt;b> {</b></p><p><b> }</b></p><p> BOOL CCqxhistView::PreCreateWindow(CREATESTRUCT& cs)</p><p><b> {</b></p><p> // TODO: Mo
14、dify the Window class or styles here by modifying</p><p> // the CREATESTRUCT cs</p><p> return CView::PreCreateWindow(cs);</p><p><b> }</b></p><p> //
15、///////////////////////////////////////////////////////////////////////////</p><p> // CCqxhistView drawing</p><p> void CCqxhistView::OnDraw(CDC* pDC)</p><p><b> {</b&g
16、t;</p><p> CCqxhistDoc* pDoc = GetDocument();</p><p> ASSERT_VALID(pDoc);</p><p> // TODO: add draw code for native data here</p><p> if(m_dib.m_bLoaded==true) //判
17、斷是否加載圖像</p><p><b> {</b></p><p><b> //獲取圖像寬和高</b></p><p> int nw=m_dib.GetDIBWidth();</p><p> int nh=m_dib.GetDIBHeight();</p><p&
18、gt; // 顯示圖像(具體的參數(shù)見CDIB類的該函數(shù)說明)</p><p> m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);</p><p> m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI);</p><
19、p><b> }</b></p><p> if(m_bHist==true)</p><p><b> {</b></p><p> //繪制原圖像的直方圖</p><p> CString str;</p><p> int nh=m_dib.GetDI
20、BHeight();</p><p><b> int i;</b></p><p><b> //畫坐標軸</b></p><p><b> // 繪制坐標軸</b></p><p> pDC->MoveTo(410,nh+20); //(410,nh+20
21、 )是直方圖的左上角坐標 </p><p><b> // 垂直軸</b></p><p> pDC->LineTo(410,nh+200);//(410,nh+200 )是直方圖的左下角坐標 </p><p><b> // 水平軸</b></p><p> pDC->Line
22、To(710,nh+200);//(710,nh+200 )是直方圖的右下角坐標 </p><p><b> // 寫X軸刻度值</b></p><p> str.Format("0");</p><p> pDC->TextOut(410, nh+200+10, str);</p><p&g
23、t; str.Format("50");</p><p> pDC->TextOut(460, nh+200+10, str);</p><p> str.Format("100");</p><p> pDC->TextOut(510, nh+200+10, str);</p><p&
24、gt; str.Format("150");</p><p> pDC->TextOut(560, nh+200+10, str);</p><p> str.Format("200");</p><p> pDC->TextOut(610, nh+200+10, str);</p><
25、p> str.Format("255");</p><p> pDC->TextOut(665, nh+200+10, str);</p><p><b> // 繪制X軸刻度</b></p><p> for ( i = 0; i < 256; i += 25)</p><p&
26、gt;<b> {</b></p><p> if ((i & 1) == 0)</p><p><b> {</b></p><p><b> // 10的倍數(shù)</b></p><p> pDC->MoveTo(i + 10, nh+200-2);&l
27、t;/p><p> pDC->LineTo(i + 10, nh+200+2);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> //
28、 10的倍數(shù)</b></p><p> pDC->MoveTo(i + 10, nh+200-2);</p><p> pDC->LineTo(i + 10, nh+200+2);</p><p><b> }</b></p><p><b> }</b></p
29、><p><b> // 繪制X軸箭頭</b></p><p> pDC->MoveTo(705,nh+200-5);</p><p> pDC->LineTo(710,nh+200);</p><p> pDC->LineTo(705,nh+200+5);</p><p>
30、<b> // 繪制y軸箭頭</b></p><p> pDC->MoveTo(410,nh+20);</p><p> pDC->LineTo(405,nh+20+5);</p><p> pDC->MoveTo(410,nh+20);</p><p> pDC->LineTo(415
31、,nh+20+5);</p><p> int max=0;</p><p> for(i=0;i<256;i++)</p><p> if(m_yuan[i]>max)</p><p> max=m_yuan[i];</p><p> for(i=0;i<256;i++)</p&
32、gt;<p><b> {</b></p><p> pDC->MoveTo(410+i,nh+200);</p><p> pDC->LineTo(410+i,nh+200-(m_yuan[i]*160/max));</p><p><b> }</b></p><p
33、><b> }</b></p><p> if(m_bHist==true)</p><p><b> {</b></p><p><b> //繪畫直方圖</b></p><p> CString str;</p><p> int
34、nh=m_dib.GetDIBHeight();</p><p><b> int i;</b></p><p><b> //畫坐標軸</b></p><p><b> // 繪制坐標軸</b></p><p> pDC->MoveTo(10,nh+20);
35、 //(10,nh+20 )是直方圖的左上角坐標 </p><p><b> // 垂直軸</b></p><p> pDC->LineTo(10,nh+200);//(10,nh+200 )是直方圖的左下角坐標 </p><p><b> // 水平軸</b></p><p> pD
36、C->LineTo(310,nh+200);//(310,nh+200 )是直方圖的右下角坐標 </p><p><b> // 寫X軸刻度值</b></p><p> str.Format("0");</p><p> pDC->TextOut(10, nh+200+10, str);</p>
37、<p> str.Format("50");</p><p> pDC->TextOut(60, nh+200+10, str);</p><p> str.Format("100");</p><p> pDC->TextOut(110, nh+200+10, str);</p>
38、<p> str.Format("150");</p><p> pDC->TextOut(160, nh+200+10, str);</p><p> str.Format("200");</p><p> pDC->TextOut(210, nh+200+10, str);</p&g
39、t;<p> str.Format("255");</p><p> pDC->TextOut(265, nh+200+10, str);</p><p><b> // 繪制X軸刻度</b></p><p> for ( i = 0; i < 256; i += 25)</p>
40、<p><b> {</b></p><p> if ((i & 1) == 0)</p><p><b> {</b></p><p><b> // 10的倍數(shù)</b></p><p> pDC->MoveTo(i + 10, nh+2
41、00-2);</p><p> pDC->LineTo(i + 10, nh+200+2);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b
42、> // 10的倍數(shù)</b></p><p> pDC->MoveTo(i + 10, nh+200-2);</p><p> pDC->LineTo(i + 10, nh+200+2);</p><p><b> }</b></p><p><b> }</b&g
43、t;</p><p><b> // 繪制X軸箭頭</b></p><p> pDC->MoveTo(305,nh+200-5);</p><p> pDC->LineTo(310,nh+200);</p><p> pDC->LineTo(305,nh+200+5);</p>&
44、lt;p><b> // 繪制y軸箭頭</b></p><p> pDC->MoveTo(10,nh+20);</p><p> pDC->LineTo(5,nh+20+5);</p><p> pDC->MoveTo(10,nh+20);</p><p> pDC->LineTo
45、(15,nh+20+5);</p><p> int max=0;</p><p> for(i=0;i<256;i++)</p><p> if(m_hist[i]>max)</p><p> max=m_hist[i];</p><p> for(i=0;i<256;i++)<
46、/p><p><b> {</b></p><p> pDC->MoveTo(10+i,nh+200);</p><p> pDC->LineTo(10+i,nh+200-(m_hist[i]*160/max));</p><p><b> }</b></p><
47、p><b> }</b></p><p><b> }</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CCqxhistView printing<
48、;/p><p> BOOL CCqxhistView::OnPreparePrinting(CPrintInfo* pInfo)</p><p><b> {</b></p><p> // default preparation</p><p> return DoPreparePrinting(pInfo);&l
49、t;/p><p><b> }</b></p><p> void CCqxhistView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)</p><p><b> {</b></p><p> // TODO: add extra
50、initialization before printing</p><p><b> }</b></p><p> void CCqxhistView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)</p><p><b> {</b></p>
51、<p> // TODO: add cleanup after printing</p><p><b> }</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CCqxh
52、istView diagnostics</p><p> #ifdef _DEBUG</p><p> void CCqxhistView::AssertValid() const</p><p><b> {</b></p><p> CView::AssertValid();</p><p
53、><b> }</b></p><p> void CCqxhistView::Dump(CDumpContext& dc) const</p><p><b> {</b></p><p> CView::Dump(dc);</p><p><b> }</
54、b></p><p> CCqxhistDoc* CCqxhistView::GetDocument() // non-debug version is inline</p><p><b> {</b></p><p> ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCqxhistD
55、oc)));</p><p> return (CCqxhistDoc*)m_pDocument;</p><p><b> }</b></p><p> #endif //_DEBUG</p><p> //////////////////////////////////////////////////////
56、///////////////////////</p><p> // CCqxhistView message handlers</p><p> void CCqxhistView::OnOpenImage() </p><p><b> {</b></p><p> // TODO: Add your co
57、mmand handler code here</p><p> // TODO: Add your command handler code here</p><p> static char szFilter[]="BMP文件(*.bmp)|*.bmp||"; //定義過濾文件的類型</p><p> CFileDialog dlg(
58、TRUE,"bmp",NULL,</p><p> OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);//定義文件對話框對象</p><p> CString filename;</p><p> int ret=dlg.DoModal(); //運行打開文件對方框</p><
59、;p> if(ret==IDOK)</p><p><b> {</b></p><p> filename=dlg.GetFileName(); //獲取所選擇圖像的路徑</p><p> m_dib.LoadFromFile(filename); //加載圖像</p><p> if(!m
60、_dib.m_bLoaded) //判斷是否加載圖像成功</p><p><b> {</b></p><p> AfxMessageBox("圖像打不開");</p><p><b> return;</b></p><p><b> }
61、</b></p><p> for(int i=0;i<256;i++) //初始化直方圖數(shù)組</p><p> { m_hist[i]=0;</p><p> m_yuan[i]=0;</p><p><b> }</b></p><p> m_bHist=f
62、alse;</p><p><b> }</b></p><p><b> {</b></p><p> int nw=m_dib.GetDIBWidth();</p><p> int nh=m_dib.GetDIBHeight();</p><p> for(i
63、nt j=0;j<nh;j++)</p><p> for(int i=0;i<nw;i++)</p><p><b> {</b></p><p> BYTE temp=m_dib.m_pdata[j*nw+i];</p><p> m_yuan[temp]++;</p><p&
64、gt;<b> }</b></p><p><b> }</b></p><p> Invalidate(1);//刷新屏幕</p><p><b> }</b></p><p> void CCqxhistView::OnHistImage() </p>
65、;<p><b> {</b></p><p> // TODO: Add your command handler code here</p><p> //功能:實現(xiàn)直方圖均衡化</p><p> //////////////////////////</p><p> //判斷圖像是否打開,沒
66、打開,則彈出提示框并退出函數(shù)</p><p> if(!m_dib.m_bLoaded) </p><p><b> {</b></p><p> AfxMessageBox("圖像還打開,請先打開圖像!");</p><p><b> return;</b></
67、p><p><b> }</b></p><p><b> //獲取圖像寬和高</b></p><p> int nw=m_dib.GetDIBWidth();</p><p> int nh=m_dib.GetDIBHeight();</p><p> int i,j
68、,k;</p><p> int count[256]={0};//定義一個數(shù)組,用于存放灰度級個數(shù)</p><p> float p[256];//定義一個數(shù)組,用于存放灰度級出現(xiàn)頻率</p><p> //對圖像進行直方圖均衡化處理</p><p> for(i=0;i<nh;i++)</p><p>
69、; for(j=0;j<nw;j++)</p><p><b> {</b></p><p> k=m_dib.m_pdata[i*nw+j];//計算灰度級個數(shù)</p><p> count[k]++;</p><p><b> }</b></p><p>
70、 for(k=0;k<256;k++)</p><p> p[k]=count[k]/(nw*nh*1.0f);</p><p> float c[256]={0};</p><p> float sum=0.0;</p><p> int ngray[256];//新的灰度級</p><p> fo
71、r(k=0;k<256;k++)//計算累積頻率</p><p><b> {</b></p><p> sum+=p[k];</p><p><b> c[k]=sum;</b></p><p> ngray[k]=(int)(255.0*c[k]+0.5);</p>
72、<p><b> }</b></p><p> for(i=0;i<nh;i++)</p><p> for(j=0;j<nw;j++)</p><p><b> {</b></p><p> k=m_dib.m_pdata[i*nw+j];</p>&
73、lt;p> m_dib.m_pdata[i*nw+j]=ngray[k];</p><p><b> }</b></p><p><b> {</b></p><p> int nw=m_dib.GetDIBWidth();</p><p> int nh=m_dib.GetDIBH
74、eight();</p><p> for(int j=0;j<nh;j++)</p><p> for(int i=0;i<nw;i++)</p><p><b> {</b></p><p> BYTE temp=m_dib.m_pdata[j*nw+i];</p><p>
75、; m_hist[temp]++;</p><p><b> }</b></p><p><b> }</b></p><p> //將修改的m_pdata的數(shù)據(jù)賦值給m_pDIBData,以顯示修改的結果</p><p> m_dib.UpdateData();</p>&
76、lt;p> m_bHist=true;</p><p> //將修改的m_pdata的數(shù)據(jù)賦值給m_pDIBData,以顯示修改的結果</p><p> m_dib.UpdateData();</p><p><b> //刷新屏幕</b></p><p> Invalidate(); </p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字圖像課程設計----直方圖均衡化
- 數(shù)字圖像處理課程設計---數(shù)字圖像處理
- 數(shù)字圖像處理課程設計
- 數(shù)字圖像處理課程設計
- 數(shù)字圖像處理課程設計
- 2013數(shù)字圖像處理課程設計報告
- 數(shù)字圖像處理-課程設計報告-matlab
- 數(shù)字圖像處理課程設計--數(shù)字圖像處理系統(tǒng)
- 數(shù)字圖像處理課程設計
- 數(shù)字圖像處理課程設計
- 數(shù)字圖像處理課程設計--基于matlab的數(shù)字圖像處理
- 信息方向課程設計報告---數(shù)字圖像處理
- 數(shù)字圖像課程設計--基于直方圖變換實現(xiàn)的圖像增強
- 數(shù)字圖像處理課程設計--基于matlab的數(shù)字圖像處理
- 圖像的直方圖均衡、匹配及圖像分割【數(shù)字圖像處理大作業(yè)】
- 數(shù)字圖像處理課程設計報告---車輛識別
- 數(shù)字圖像處理課程設計實驗報告
- 數(shù)字圖像處理課程設計論文
- matlab課程設計報告-數(shù)字圖像處理研究
- 數(shù)字圖像處理課程設計報告-- 彩色圖像增強軟件
評論
0/150
提交評論