數(shù)字圖像處理實(shí)驗(yàn)三中值濾波和均值濾波實(shí)驗(yàn)報(bào)告_第1頁(yè)
數(shù)字圖像處理實(shí)驗(yàn)三中值濾波和均值濾波實(shí)驗(yàn)報(bào)告_第2頁(yè)
數(shù)字圖像處理實(shí)驗(yàn)三中值濾波和均值濾波實(shí)驗(yàn)報(bào)告_第3頁(yè)
數(shù)字圖像處理實(shí)驗(yàn)三中值濾波和均值濾波實(shí)驗(yàn)報(bào)告_第4頁(yè)
數(shù)字圖像處理實(shí)驗(yàn)三中值濾波和均值濾波實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上數(shù)字圖像處理實(shí)驗(yàn)三均值濾波、中值濾波的計(jì)算機(jī)實(shí)現(xiàn) 崔雪瑩 計(jì)科1202班一、實(shí)驗(yàn)?zāi)康模?)熟悉均值濾波、中值濾波處理的理論基礎(chǔ);2)掌握均值濾波、中值濾波的計(jì)算機(jī)實(shí)現(xiàn)方法;3)學(xué)習(xí)VC+ 6。0 的編程方法;4)驗(yàn)證均值濾波、中值濾波處理理論;5)觀察均值濾波、中值濾波處理的結(jié)果。二、實(shí)驗(yàn)的軟、硬件平臺(tái): 硬件: 微型圖像處理系統(tǒng),包括:主機(jī), PC機(jī);攝像機(jī);軟件: 操作系統(tǒng):WINDOWS2000或WINDOWSXP應(yīng)用軟件:VC+ 6.0三、實(shí)驗(yàn)內(nèi)容:1)握高級(jí)語(yǔ)言編程技術(shù);2)編制均值濾波、中值濾波處理程序的方法;3)編譯并生成可執(zhí)行文件;4)考察處理結(jié)果。四

2、、實(shí)驗(yàn)要求:1)學(xué)習(xí)VC+確6。0 編程的步驟及流程;2)編寫均值濾波、中值濾波的程序;3)編譯并改錯(cuò);4)把該程序嵌入試驗(yàn)二給出的界面中(作適當(dāng)修改);5)提交程序及文檔;6)寫出本次實(shí)驗(yàn)的體會(huì)。五、實(shí)驗(yàn)結(jié)果截圖實(shí)驗(yàn)均值濾波采用的是3X3的方塊,取周圍的像素點(diǎn)取得其均值代替原像素點(diǎn)。邊緣像素的處理方法是復(fù)制邊緣的像素點(diǎn),增加一個(gè)邊框,計(jì)算里面的像素值得均值濾波。六、實(shí)驗(yàn)體會(huì)本次實(shí)驗(yàn)在前一次的實(shí)驗(yàn)基礎(chǔ)上增加均值濾波和中值濾波,對(duì)于椒鹽噪聲的處理,發(fā)現(xiàn)中值濾波的效果更為好一點(diǎn),而均值濾波是的整個(gè)圖像變得模糊了一點(diǎn),效果差異較大。本次實(shí)驗(yàn)更加增加了對(duì)數(shù)字圖像處理的了解與學(xué)習(xí)。七、實(shí)驗(yàn)程序代碼注釋及

3、分析/ HistDemoADlg.h : 頭文件/#include "ImageWnd.h"#pragma once/ CHistDemoADlg 對(duì)話框class CHistDemoADlg : public CDialogEx/ 構(gòu)造public:CHistDemoADlg(CWnd* pParent = NULL);/ 標(biāo)準(zhǔn)構(gòu)造函數(shù)int nWidth;int nHeight;int nLen;int nByteWidth;BYTE *lpBackup;BYTE *lpBitmap;BYTE *lpBits;CString FileName;CImageWnd sou

4、rce,dest;/ 對(duì)話框數(shù)據(jù)enum IDD = IDD_HISTDEMOA_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV 支持/ 實(shí)現(xiàn)protected:HICON m_hIcon;/ 生成的消息映射函數(shù)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLAR

5、E_MESSAGE_MAP()public:void LoadBitmap(void);afx_msg void OnOpen();afx_msg void OnHist();void HistogramEq(void);void NoColor(void);void HistogramEq1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput);void MeanFilter(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput);void MedianFilter(int nWidth,i

6、nt nHeight,BYTE *lpInput,BYTE *lpOutput);afx_msg void OnBnClickedClose();afx_msg void OnBnClickedMeanfilter();afx_msg void OnBnClickedMedianfilter();HistDemoADlg.cpp對(duì)HistDemoADlg.h進(jìn)行具體的實(shí)現(xiàn),OnOpen()函數(shù)響應(yīng)ID為IDC_OPEN的按鈕事件,而且會(huì)調(diào)取文件選擇對(duì)話框,選取文件之后,會(huì)顯示在原始圖像區(qū)域顯示對(duì)應(yīng)的位圖圖像,OnHist()函數(shù)會(huì)響應(yīng)ID為IDC_HIST的按鈕事件,調(diào)用HistogramEq

7、()進(jìn)行直方圖均衡化的處理,HistogramEq()會(huì)調(diào)用HistogramEq1()進(jìn)行直方圖均衡化的處理,并用dst.setImage()顯示處理之后的圖像,以及NoColor()函數(shù),對(duì)原始圖像轉(zhuǎn)化為灰度圖像之后再顯示。/ HistDemoADlg.cpp : 實(shí)現(xiàn)文件/#include "stdafx.h"#include "HistDemoA.h"#include "HistDemoADlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG

8、_NEW#endif#define Point(x,y) lpPoints(x)+(y)*nWidth#define Point1(x,y) lpPoints1(x)+(y)*nWidth/ 用于應(yīng)用程序“關(guān)于”菜單項(xiàng)的 CAboutDlg 對(duì)話框class CAboutDlg : public CDialogExpublic:CAboutDlg();/ 對(duì)話框數(shù)據(jù)enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 實(shí)現(xiàn)protected:DECLAR

9、E_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialogEx(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()/ CHistDemoADlg 對(duì)話框CHistDemoADlg:CHistDemoADlg(CWnd* pParent /*=NULL*/): CDialogEx(CHistDemoADlg:IDD,

10、 pParent)m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);lpBitmap = 0;lpBackup = 0;void CHistDemoADlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CHistDemoADlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_OPEN, &CHistDem

11、oADlg:OnOpen)ON_BN_CLICKED(IDC_HIST, &CHistDemoADlg:OnHist)ON_BN_CLICKED(IDCLOSE, &CHistDemoADlg:OnBnClickedClose)ON_BN_CLICKED(IDC_MEANFILTER, &CHistDemoADlg:OnBnClickedMeanfilter)ON_BN_CLICKED(IDC_MEDIANFILTER, &CHistDemoADlg:OnBnClickedMedianfilter)END_MESSAGE_MAP()/ CHistDemoADlg

12、 消息處理程序BOOL CHistDemoADlg:OnInitDialog()CDialogEx:OnInitDialog();/ 將“關(guān)于.”菜單項(xiàng)添加到系統(tǒng)菜單中。/ IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)BOOL bNameValid;CString strAboutMenu;bNameVali

13、d = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ 設(shè)置此對(duì)話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對(duì)話框時(shí),框架將自動(dòng)/ 執(zhí)行此操作SetIcon(m_hIcon, TRUE);/ 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE);/ 設(shè)置小圖標(biāo)/ TODO: 在此添

14、加額外的初始化代碼source.Create(0,L"Source",WS_CHILD|WS_VISIBLE,CRect(40,40,360,280),this,10000);dest.Create(0,L"Destination",WS_CHILD|WS_VISIBLE,CRect(400,40,720,280),this,10001);return TRUE; / 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUEvoid CHistDemoADlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFF

15、F0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialogEx:OnSysCommand(nID, lParam);/ 如果向?qū)υ捒蛱砑幼钚』粹o,則需要下面的代碼/ 來(lái)繪制該圖標(biāo)。對(duì)于使用文檔/視圖模型的 MFC 應(yīng)用程序,/ 這將由框架自動(dòng)完成。void CHistDemoADlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用于繪制的設(shè)備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(d

16、c.GetSafeHdc(), 0);/ 使圖標(biāo)在工作區(qū)矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ 繪制圖標(biāo)dc.DrawIcon(x, y, m_hIcon);elseCDialogEx:OnPaint();/當(dāng)用戶拖動(dòng)最小化窗口

17、時(shí)系統(tǒng)調(diào)用此函數(shù)取得光標(biāo)/顯示。HCURSOR CHistDemoADlg:OnQueryDragIcon()return static_cast<HCURSOR>(m_hIcon);void CHistDemoADlg:LoadBitmap()/位圖文件:BITMAPFILEHEADER+BITMAPINFOHEADER+有效信息部分BITMAPINFOHEADER *pInfo; /位圖文件的頭部信息指針pInfopInfo=(BITMAPINFOHEADER *)(lpBitmap+sizeof(BITMAPFILEHEADER); /pInfo指向位圖文件的頭部信息nWid

18、th=pInfo->biWidth; /圖片寬度nByteWidth=nWidth*3; /字節(jié)寬度if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4); /使字節(jié)寬度為4的整數(shù)倍nHeight=pInfo->biHeight;/圖片高度if (pInfo->biBitCount!=24) /位圖的位深度不為24if (pInfo->biBitCount!=8) /位深度不為8AfxMessageBox(L"無(wú)效位圖");delete lpBitmap;lpBitmap=0;return;/位深度為8unsig

19、ned int PaletteSize=1<<pInfo->biBitCount; /左移8位,PaletteSize調(diào)色板尺寸if (pInfo->biClrUsed!=0 && pInfo->biClrUsed<PaletteSize) PaletteSize=pInfo->biClrUsed; / biClrUsed 位圖實(shí)際使用的顏色表中的顏色數(shù)lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);/lpBits指向有效信息部分RGBQUAD *pPa

20、lette=(RGBQUAD *)lpBits; /顏色表部分/*typedef struct tagRGBQUAD BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved; RGBQUAD;*/lpBits+=sizeof(RGBQUAD)*PaletteSize;/lpBits指向圖像有效信息部分nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*nHeight;/整個(gè)位圖文件的長(zhǎng)度BYTE *lpTemp=lpBitmap;lpBitmap=new BY

21、TEnLen;BITMAPFILEHEADER bmh;BITMAPINFOHEADER bmi;bmh.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.biSiz

22、eImage=0;bmi.biXPelsPerMeter=0;bmi.biYPelsPerMeter=0;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(BITM

23、APINFOHEADER);/位圖信息頭部BYTE *lpBits2=lpBitmap+sizeof(BITMAPFILEHEADER)+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.rgbBlu

24、e;lpBits2p2+1=pPalettePalette.rgbGreen;lpBits2p2+2=pPalettePalette.rgbRed;delete lpTemp;lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);if (lpBackup) delete lpBackup;lpBackup=new BYTEnLen;memcpy(lpBackup,lpBitmap,nLen);void CHistDemoADlg:OnOpen() /點(diǎn)擊打開文件之后,對(duì)應(yīng)的事件處理函數(shù)/ TODO: 在此添加控件通知

25、處理程序代碼CFile File;CFileDialog dlg(TRUE,0,0,OFN_HIDEREADONLY,L"位圖文件|*.bmp|所有文件|*.*|",this);/新建文件選擇對(duì)話框if (dlg.DoModal()=IDOK) FileName=dlg.GetPathName(); /得到文件的路徑if (!File.Open(FileName,CFile:modeRead) return; /以只讀方式打開文件/ TODO: add loading code hereif (lpBitmap) delete lpBitmap;/保證lpBitmap為空n

26、Len=(int)File.GetLength(); /得到文件的長(zhǎng)度lpBitmap=new BYTEnLen; /為lpBitmap分配空間File.Read(lpBitmap,nLen);/將文件的內(nèi)容讀入到lpBitmap所指向的內(nèi)存區(qū)域LoadBitmap();/調(diào)用LoadBitmap(),加載位圖圖像if (lpBitmap) source.SetImage(nWidth,nHeight,lpBits);void CHistDemoADlg:OnHist()/ TODO: 在此添加控件通知處理程序代碼HistogramEq();void GetPoints(int nWidth,

27、int nHeight,BYTE *lpBits,BYTE *lpPoints)int x,y,p;int 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); /三種

28、顏色的比例計(jì)算對(duì)應(yīng)點(diǎn)的顏色值,并且強(qiáng)制轉(zhuǎn)換成BYTEvoid PutPoints(int nWidth,int nHeight,BYTE *lpBits,BYTE *lpPoints) /逐個(gè)對(duì)lpBits進(jìn)行賦值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;

29、lpBitsp+1=lpPointsp1;lpBitsp+2=lpPointsp1;void CHistDemoADlg:HistogramEq(void)if (lpBitmap=0) return;BYTE *lpOutput=new BYTEnByteWidth*nHeight;HistogramEq1(nWidth,nHeight,lpBits,lpOutput);dest.SetImage(nWidth,nHeight,lpOutput); /在直方圖均衡化的區(qū)域顯示結(jié)果delete lpOutput;NoColor(); /將原始圖像轉(zhuǎn)換成灰度圖像void CHistDemoADl

30、g: NoColor()if (lpBitmap=0) return;int x,y,p;BYTE Point;for(y=0;y<nHeight;y+) /每一行for(x=0;x<nWidth;x+) /每一列p=x*3+y*nByteWidth;Point=(BYTE)(0.299*(float)lpBitsp+2+0.587*(float)lpBitsp+1+0.114*(float)lpBitsp+0.1);/計(jì)算顏色值,在0-255的灰度級(jí)之間lpBitsp+2=Point;lpBitsp+1=Point;lpBitsp=Point;source.SetImage(nW

31、idth,nHeight,lpBits);/將彩色圖像轉(zhuǎn)化成灰度圖像void CHistDemoADlg:HistogramEq1(int nWidth, int nHeight, BYTE *lpInput, BYTE *lpOutput)int x,y;BYTE *lpPoints=new BYTEnWidth*nHeight;/像素點(diǎn)的個(gè)數(shù)GetPoints(nWidth,nHeight,lpInput,lpPoints); /lpPoints存的是顏色值int r256,s256; /顏色值數(shù)組,統(tǒng)計(jì)對(duì)應(yīng)顏色值像素點(diǎn)的個(gè)數(shù)ZeroMemory(r,1024);ZeroMemory(s,

32、1024);for(y=0;y<nHeight;y+) /統(tǒng)計(jì)對(duì)應(yīng)顏色值像素點(diǎn)的個(gè)數(shù),Point(x,y)是lpPoints(x,y)for(x=0;x<nWidth;x+)rPoint(x,y)+;s0=r0;for(y=1;y<256;y+)sy=sy-1;sy+=ry; /計(jì)算顏色值的前y種顏色的總像素點(diǎn)的個(gè)數(shù)(像素點(diǎn)顏色值<=y)for(y=0;y<nHeight;y+) /將計(jì)算對(duì)應(yīng)點(diǎn)的像素值,直方圖均勻化的結(jié)果保存在lpPointsfor(x=0;x<nWidth;x+)Point(x,y)=sPoint(x,y)*255/nWidth/nHei

33、ght;PutPoints(nWidth,nHeight,lpOutput,lpPoints); /輸出lpPoints到lpOutputdelete lpPoints;void CHistDemoADlg:OnBnClickedClose()/ TODO: 在此添加控件通知處理程序代碼/ExitProcess(0);/注意使用時(shí)先釋放分配的內(nèi)存,以免造成內(nèi)存泄露 /exit(0) ;/正常終止程序; exit(非0)非正常終止程序PostQuitMessage(0);/最常用void CHistDemoADlg:OnBnClickedMeanfilter()/ TODO: 在此添加控件通知處

34、理程序代碼if (lpBitmap=0) return;BYTE *lpOutput=new BYTEnByteWidth*nHeight;MeanFilter(nWidth,nHeight,lpBits,lpOutput);dest.SetImage(nWidth,nHeight,lpOutput); /在直方圖均衡化的區(qū)域顯示結(jié)果delete lpOutput;NoColor(); /將原始圖像轉(zhuǎn)換成灰度圖像void CHistDemoADlg:MeanFilter (int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput) int x,y;

35、BYTE *lpPoints=new BYTEnWidth*nHeight;/像素點(diǎn)的個(gè)數(shù)BYTE *lpPoints1 = new BYTE(nWidth+2)*(nHeight+2);GetPoints(nWidth,nHeight,lpInput,lpPoints); /lpPoints存的是顏色值for(y=1;y<nHeight+1;y+) /中間最整塊圖像的拷貝for(x=1;x<nWidth;x+)Point1(x,y) = Point(x-1,y-1);/lpPoints1yx = lpPointsy-1x-1;for(y=1;y<nHeight+1;y+)

36、/最左邊和最右邊一列的拷貝Point1(0,y) = Point(0,y-1);Point1(nWidth+1,y) = Point(nWidth-1,y-1);/lpPoints1y0 = lpPointsy-10;/lpPoints1ynWidth+1 = lpPointsy-1nWidth-1;for(x=0;x<nWidth+2;x+) /最上邊和最下邊一行的拷貝Point1(x,0) = Point1(x,1);Point1(x,nHeight+1) = Point1(x,nHeight);/lpPoints10x = lpPoints11x;/lpPoints1nHeight

37、+1x = lpPoints1nHeightx;for(y=0;y<nHeight;y+) /求以某點(diǎn)為中心的九個(gè)數(shù)平均值for (x=0;x<nWidth;x+)Point(x,y) = ( Point1(x,y) + Point1(x+1,y) + Point1(x+2,y) +Point1(x,y+1) + Point1(x+1,y+1) + Point1(x+2,y+1) +Point1(x,y+2) + Point1(x+1,y+2) + Point1(x+2,y+2) )/9;/*lpPointsyx = (lpPoints1yx + lpPoints1yx+1 + l

38、pPoints1yx+2 + lpPoints1y+1x + lpPoints1y+1x+1 + lpPoints1y+1x+2 + lpPoints1y+2x + lpPoints1y+2x+1 + lpPoints1y+2x+2)/9;*/PutPoints(nWidth,nHeight,lpOutput,lpPoints); /輸出lpPoints到lpOutputdelete lpPoints; void CHistDemoADlg:MedianFilter(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput) int x,y;BYT

39、E *lpPoints=new BYTEnWidth*nHeight;/像素點(diǎn)的個(gè)數(shù)BYTE *lpPoints1 = new BYTE(nWidth+2)*(nHeight+2);GetPoints(nWidth,nHeight,lpInput,lpPoints); /lpPoints存的是顏色值for(y=1;y<nHeight+1;y+) /中間一整塊拷貝for(x=1;x<nWidth;x+)Point1(x,y) = Point(x-1,y-1);for(y=1;y<nHeight+1;y+) /最左邊和最右邊一列的拷貝Point1(0,y) = Point(0,y

40、-1);Point1(nWidth+1,y) = Point(nWidth-1,y-1);for(x=0;x<nWidth+2;x+) /最上邊和最下邊一行的拷貝Point1(x,0) = Point1(x,1);Point1(x,nHeight+1) = Point1(x,nHeight);BYTE *window = new BYTE9;for(y=0;y<nHeight;y+)for (x=0;x<nWidth;x+)int k = 0;for(int i=y ; i <= y+2 ; i+)for(int j=x ; j <= x+2; j+)if(k &

41、lt; 9)windowk+ = Point1(j,i);for (int m = 0; m < 5; +m) /求9個(gè)數(shù)的中值,window4為中值 int min = m; for (int n = m + 1; n < 9; +n) if (windown < windowmin) min = n; / Put found minimum element in its place BYTE temp = windowm; windowm = windowmin; windowmin = temp; Point(x,y) = window4;PutPoints(nWidt

42、h,nHeight,lpOutput,lpPoints); /輸出lpPoints到lpOutputdelete lpPoints; void CHistDemoADlg:OnBnClickedMedianfilter()/ TODO: 在此添加控件通知處理程序代碼if (lpBitmap=0) return;BYTE *lpOutput=new BYTEnByteWidth*nHeight;MedianFilter(nWidth,nHeight,lpBits,lpOutput);dest.SetImage(nWidth,nHeight,lpOutput); /在中值濾波的區(qū)域顯示結(jié)果dele

43、te lpOutput;NoColor(); /將原始圖像轉(zhuǎn)換成灰度圖像CImageWnd.h類繼承自CWnd主要是圖像顯示方面的函數(shù),如水平滾輪和垂直滾輪的事件函數(shù),以及繪制函數(shù)OnPaint(),初始化函數(shù)等等,以及存放需要繪制的圖像信息的成員變量。setImage(),外接提供繪制的信息,通過(guò)參數(shù)傳遞給內(nèi)部的成員變量。#pragma onceclass CImageWnd:public CWndpublic:int HCurrentPosition; /當(dāng)前位置(水平)int HScrollMax;/滑動(dòng)最大位置(水平)int HScrollPosition;/滑動(dòng)位置(水平)int V

44、CurrentPosition; /當(dāng)前位置(垂直)int VScrollMax; /滑動(dòng)最大位置(垂直)int VScrollPosition; /滑動(dòng)位置(垂直)int nWidth;/寬度int nHeight;/高度int nByteWidth;/字節(jié)寬度BYTE *lpBits;/指向字節(jié)的指針public:CImageWnd(void);CImageWnd(void);void SetImage(int cx,int cy,const void *bits);void SetScroll(int cx,int cy);protected:afx_msg BOOL OnEraseBk

45、gnd(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 OnPaint();afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);DECLARE_MESSAGE_MAP()/*protected:/AFX_MSG(CImageWnd)afx_msg BOOL OnEras

46、eBkgnd(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 OnPaint();afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);/AFX_MSGDECLARE_MESSAGE_MAP()*/;ImageWnd.cpp 具體實(shí)現(xiàn)ImageWnd.h的一些功能

47、函數(shù),注釋已經(jīng)給出,在此不再贅述。#include "StdAfx.h"#include "ImageWnd.h"#define BACKGROUND RGB(128,128,128)CImageWnd:CImageWnd(void) /初始化,將其全設(shè)為0HScrollPosition = 0;HCurrentPosition = 0;HScrollMax = 0;VScrollPosition = 0;VCurrentPosition = 0;VScrollMax = 0;lpBits = 0;CImageWnd:CImageWnd(void) /析

48、構(gòu)函數(shù),釋放空間if(lpBits) delete lpBits;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_MESSAGE_MAP()BOOL CImageWnd:OnEraseBkgnd(CDC *pDC) /設(shè)置背景色,320,240if(!lpBits) pDC->FillSolidRect(0,0,320,240,BACKGROU

49、ND);return TRUE;void CImageWnd:OnPaint() /繪制函數(shù),每次需要顯示的圖像發(fā)生變化,就會(huì)重畫,重復(fù)調(diào)用這個(gè)函數(shù)進(jìn)行重畫CPaintDC dc(this); /當(dāng)前對(duì)象作為參數(shù)if(lpBits)int x,y;x = -HScrollPosition;y = -VScrollPosition;if(nWidth<320) x = (320-nWidth)/2;if(nHeight<240) y = (240-nHeight)/2;/設(shè)置繪制位圖文件的頭信息BITMAPINFOHEADER bmi;bmi.biSize = sizeof(BITM

50、APINFOHEADER);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;bmi.biClrUsed = 0;bmi.biClrImportant = 0;/將像素點(diǎn)填充到繪圖區(qū)域StretchDIBits(dc.m_hDC,x,y,nWidth,nHeight,0,0,nWidth,nHei

51、ght,lpBits,(BITMAPINFO *)&bmi,DIB_RGB_COLORS,SRCCOPY);void CImageWnd:OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar) /水平滾輪事件處理函數(shù),switch(nSBCode)case SB_LINEDOWN: /每次滑動(dòng)的間隔為5個(gè)像素點(diǎn)HScrollPosition += 5;break;case SB_LINEUP:HScrollPosition -= 5;break;case SB_PAGEDOWN: /滑到最底端HScrollPosition+=320;break;case SB_PAGEUP: /滑到最頂端HScrollPosition -= 320;break;case SB_THUMBPOSITION:case SB_THUMBTRACK:HScrollPosition=nPos;break;if(HScrollPositi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論