《数字图像处理实验报告全C.doc》由会员分享,可在线阅读,更多相关《数字图像处理实验报告全C.doc(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数字图像处理实验报告昆明理工大学理学院电子信息科学及技术班 级: 电信112 姓 名: 张鉴 学 号: 2 指导教师: 桂进斌 完成日期: 昆明理工大学理学院电子信息科学及技术112班目录实验一下BMP位图的读取及显示3实验二 图像基本运算点运算13实验三 图像基本运算代数、逻辑运算21实验四 图像基本运算几何运算29实验五 直方图的绘制及其均衡36实验六 图像的平滑及锐化42实验七 伪彩色及彩色图像处理50实验八 图像傅里叶变换及低通滤波和高通滤波55实验一 VC 一、 实验目的1. 掌握windows BMP格式位图文件的基本格式;2. 会使用VC+读取图像数据并显示。二、 实验原理1.
2、设备无关位图(DIB)设备无关位图(DIB)是一种及设备无关的位图,自带颜色信息,因此有利于在各种设备间传输。2. BMP中DIB的结构文件头:BITMAPtypedef struct tagBITMAP / bmfh WORD bfType ; / signature word BM or 0x4D42 DWORD bfSize ; / entire size of file WORD bfReserved1 ; / must be zero WORD bfReserved2 ; / must be zero DWORD bfOffsetBits ; / offset in DIB pixe
3、l bits BITMAP, * PBITMAP ;位图信息头:BITMAPINFOHEADERtypedef struct tagBITMAPINFOHEADER / bmih DWORD biSize ; / size of the structure = 40 LONG biWidth ; / width of the image in pixels LONG biHeight ; / height of the image in pixels WORD biPlanes ; / = 1 WORD biBitCount ; / bits per pixel (1, 4, 8, 16, 2
4、4, or 32) DWORD biCompression ; / compression code DWORD biSizeImage ; / number of bytes in image LONG biXPelsPerMeter ; / horizontal resolution LONG biYPelsPerMeter ; / vertical resolution DWORD biClrUsed ; / number of colors used DWORD biClrImportant ; / number of important colors BITMAPINFOHEADER
5、, * PBITMAPINFOHEADER ;调色板(可能没有):typedef struct tagRGBQUAD / rgbBYTE rgbBlue ; / blue level BYTE rgbGreen ; / green level BYTE rgbRed ; / red level BYTE rgbReserved ; / = 0 RGBQUAD ;实际位图数据:typedef struct tagBITMAPINFO / bmi BITMAPINFOHEADER bmiHeader ; / info-header structure RGBQUAD bmiColors1 ; /
6、color table array BITMAPINFO, * PBITMAPINFO ; 3. DIB访问函数:SetDIBitsToDevice:SetDIBitsToDevice函数显示没有延伸和缩小的DIB。DIB的每个图素对应到输出设备的一个图素上,而且DIB中的图像一定会被正确显示出来也就是说,图像的顶列在上方。任何会影响设备内容的座标转换都影响了显示DIB的开始位置,但不影响显示出来的图片大小和方向。该函数如下:iLines = SetDIBitsToDevice ( hdc, / device context handlexDst, / x destination coordi
7、nate yDst, / y destination coordinate cxSrc, / source rectangle widthcySrc, / source rectangle height xSrc, / x source coordinate ySrc, / y source coordinate yScan, / first scan line to draw cyScans, / number of scan lines to draw pBits, / pointer to DIB pixel bitspInfo, / pointer to DIB information
8、 fClrUse) ; / color use flagSetDIBitsToDevice函数传回所显示的扫描行的数目。因此,要调用SetDIBitsToDevice来显示整个DIB图像,您需要下列信息:hdc目的表面的设备句柄代号xDst和yDst图像左上角的目的坐标cxDib和cyDibDIB的图素宽度和高度,在这里,cyDib是BITMAPINFOHEADER结构内biHeight栏位的绝对值。pInfo和pBits指向点阵图信息部分和图素位元的指标StretchDIBits:int StrechDIBits(HDC hdc,int Xdest,int Ydest,int DEstWid
9、th,int nDestHeight,int XSrc, int Ysrc,int nSrcWidth,int SrcHeight,CONST VOID *lpBits,CONST BITMAPINFO *lpBitsInfo,UINT iUsage,DORD dwRo);要通过缩小或放大DIB,在输出设备上以特定的大小显示它,可以使用StretchDIBits:iLines = StretchDIBits ( hdc, / device context handle xDst, / x destination coordinate yDst, / y destination coordina
10、tecxDst, / destination rectangle width cyDst, / destination rectangle height xSrc, / x source coordinate ySrc, / y source coordinatecxSrc, / source rectangle width cySrc, / source rectangle height pBits, / pointer to DIB pixel bits pInfo, / pointer to DIB information fClrUse, / color use flagdwRop)
11、; / raster operation函数参数除了下列三个方面,均及SetDIBitsToDevice相同。三、 实验内容使用VC+读取图像数据并显示。四、 实验步骤1. ,新建一个基于MFC的应用程序项目,命名:zhangjian;2. 进根据提示,定制应用程序的特征。得到如下图所示内容;3. 修改视图类的基类心支持滚动条;4. 单击完成按钮生成应用程序框架;5. 如下图通过类向导或手动在视图类中添加成员变量m_x,类型int;6. 按同样的方法添加以下成员变量;HBITMAP m_Bmp;LPVOID m_ColorList;LPBYTE m_Image;LPBITMAPINFOHEAD
12、ER m_DibHead; enum allocate None, crtallocate, heapallocate;allocate m_nBmpallocate;allocate m_nImageallocate;DWORD m_ImageSize; int m_nPalette;HANDLE m_hFile;HANDLE m_hMap;LPVOID m_lpvFile;HPALETTE m_hPalette;HGLOBAL m_hGlob; 7. 如下图通过类向导的功能增加成员函数SetPaletteSize(int nBitCount),类型void;8. 按同样的方法添加以下成员函
13、数;void Clear();清除BOOL Read *pFile);读取数据到内存BOOL SetPalette();当前位图颜色数大于设置调色板BOOL GetPalette();创建颜色数不大于的调色板BOOL DibToDC(CDC* pDC,CSize size);显示位图BOOL MemToDib(LPVOID lmem);得到内存中位图象素位置CSize GetDibSize();返回位图尺寸9. 完善成员函数代码功能,从老师给的代码中拷贝内容,结果如下;void CZhangjianView:SetPaletteSize(int nBitCount) /设置调色板大小if(m_
14、DibHead-biSize != sizeof(BITMAPINFOHEADER) throw new CException;/抛出异常m_ImageSize = m_DibHead-biSizeImage;if(m_ImageSize = 0) DWORD dwBytes = (DWORD) m_DibHead-biWidth * m_DibHead-biBitCount) / 32;if(DWORD) m_DibHead-biWidth * m_DibHead-biBitCount) % 32)dwBytes+;dwBytes *= 4;m_ImageSize = dwBytes * m
15、_DibHead-biHeight; m_ColorList = (LPBYTE) m_DibHead + sizeof(BITMAPINFOHEADER);if(m_DibHead = NULL) | (m_DibHead-biClrUsed = 0) switch(nBitCount) case 1:m_nPalette = 2;break;case 4:m_nPalette = 16;break;case 8:m_nPalette = 256;break;case 16:case 24:case 32:m_nPalette = 0;break;default:ASSERT(FALSE);
16、else m_nPalette = m_DibHead-biClrUsed;ASSERT(m_nPalette = 0) & (m_nPalette Read(LPVOID) &bmfh, sizeof(BITMAP);if(nCount != sizeof(BITMAP) throw new CException;if(bmfh.bfType != 0x4d42) throw new CException;nSize = bmfh.bfOffBits - sizeof(BITMAP);m_DibHead = (LPBITMAPINFOHEADER) new charnSize;m_nBmpa
17、llocate = m_nImageallocate = crtallocate;nCount = pFile-Read(m_DibHead, nSize); SetPaletteSize(m_DibHead-biBitCount);GetPalette();m_Image = (LPBYTE) new charm_ImageSize;nCount = pFile-Read(m_Image, m_ImageSize); catch(CException* tmpc) AfxMessageBox(文件读取错误);tmpc-Delete();return FALSE;return TRUE;BOO
18、L CZhangjianView:SetPalette() /当前位图颜色书大于256设置调色板if(m_nPalette!=0)return FALSE;CClientDC dc(this);CDC *pDC=&dc;m_hPalette=:CreateHalftonePalette(pDC-GetSafeHdc();return TRUE;BOOL CZhangjianView:GetPalette() /创建颜色数不大于256的调色板if(m_nPalette=0)return FALSE;if(m_hPalette!=NULL):DeleteObject(m_hPalette);LPL
19、OGPALETTE pTempPalette=(LPLOGPALETTE) new char2*sizeof(WORD)+ m_nPalette*sizeof(PALETTEENTRY); pTempPalette-palVersion=0x30;pTempPalette-palNumEntries=m_nPalette;LPRGBQUAD pRGBQuad=(LPRGBQUAD)m_ColorList;for(int i=0;ipalPalEntryi.peRed=pRGBQuad-rgbRed;pTempPalette-palPalEntryi.peGreen=pRGBQuad-rgbGr
20、een;pTempPalette-palPalEntryi.peBlue=pRGBQuad-rgbBlue;pTempPalette-palPalEntryi.peFlags=0;pRGBQuad+;m_hPalette=:CreatePalette(pTempPalette);delete pTempPalette;return TRUE;BOOL CZhangjianView:DibToDC(CDC *pDC, CSize size) /显示位图if(m_DibHead=NULL) return FALSE;if(m_hPalette!=NULL)HDC hdc=pDC-GetSafeHd
21、c();:SelectPalette(hdc,m_hPalette,TRUE);pDC-SetStretchBltMode(COLORONCOLOR);:StretchDIBits(pDC-GetSafeHdc(),0,0,size.cx,size.cy, 0,0,m_DibHead-biWidth,m_DibHead-biHeight, m_Image,(LPBITMAPINFO)m_DibHead,DIB_RGB_COLORS, SRCCOPY); return TRUE;BOOL CZhangjianView:MemToDib(LPVOID lmem) /得到内存中位图像素信息Clear
22、();m_DibHead=(LPBITMAPINFOHEADER)lmem;SetPaletteSize(m_DibHead-biBitCount);m_Image=(LPBYTE)m_ColorList+sizeof(RGBQUAD)*m_nPalette;GetPalette();return TRUE;CSize CZhangjianView:GetDibSize() /返回位图尺寸if(m_DibHead=NULL) return CSize(0,0);return CSize(int)m_DibHead-biWidth,(int)m_DibHead-biHeight);10. 编译测
23、试,无误后进入下一步;11. 加入图像文件读取及显示的代码;(1) 设置初始化函数,加入如下代码;m_x=25;CSize MaxSize(24000,32000);CSize MinSize(MaxSize.cx/100,MaxSize.cy/100);SetScrollSizes(MM_HIMETRIC,MaxSize,MaxSize,MinSize);LPVOID lFirstBMP=(LPVOID):LoadResource(NULL,:FindResource(NULL,MAKEINTRESOURCE(IDB_BITMAP1),RT_BITMAP);MemToDib(lFirstBM
24、P);(2)在位图编辑器中,编写一初始位图,命名为:张鉴,并保存;(3)建立文件打开的消息映射函数On(),并加入如下代码; C (TRUE,bmp,*.bmp); if()!=IDOK) return; C; my(),C); if(Read)=TRUE) Invalidate(); SetPalette();(4)修改OnDraw函数,并加入如下代码; BeginWaitCursor(); CSize DibSize = GetDibSize(); DibSize.cx *= m_x; DibSize.cy *= -m_x; DibToDC(pDC, DibSize); EndWaitCu
25、rsor();(5)至此,上述代码已经完成读取并显示位图的功能。数据存放在视图类中m_Image指向的内存区域。12. 位图显示如下图:五、 实验总结1. 通过本实验进一步熟悉了集成开发环境;2. 初步学习了;实验二 图像基本运算点运算一、 实验目的1. 学习位图的基本运算的基本原理;2. 学习掌握实现位图各类点运算的基本算法。二、 实验原理1. 点运算的定义设输入图像的灰度为f(x,y),输出图像的灰度为g(x,y),则点运算可以表示为:g(x,y)=Tf(x,y),即灰度变换函数。其中T 是对f在(x,y)点值的一种数学运算,即点运算是一种像素的逐点运算,是灰度到灰度的映射过程,故称T 为
26、灰度变换函数。点运算可以改变图像数据所占据的灰度值范围,从而改善图像显示效果。2. 点运算的分类点运算可分为线性点运算,分段线性点运算,非线性点运算3. 线性点运算线性点运算的灰度变换函数形式可以采用线性方程描述,即s=ar+b。0a0,输出灰度压缩;a=1,b=0,输出灰度不变;a1,b=0输出灰度扩展整体变亮;0abiWidth;h=m_DibHead-biHeight;unsigned char *f=new unsigned char w*h;memset(f,0,w*h);float a=80;float b=50;float s(0);for(i=0;ih;i+)for(j=0;j
27、w;j+)s=a*m_Imagei*w+j+b;if(s255)s=255;fi*w+j=(unsigned char)(s);memcpy(m_Image,f,w*h);Invalidate();delete f;void CZhangjianView:OnFenduanxianxing() /分段线性/ TODO: Add your command handler code herelong w,h;long i,j;if(m_DibHead=NULL)MessageBox(当前无图像,请打开图像!,提示);return;w=m_DibHead-biWidth;h=m_DibHead-bi
28、Height;unsigned char *f=new unsigned char w*h;memset(f,0,w*h);float a(48),b(180);float b1(20);float c(25),d(190);float s(0);for(i=0;ih;i+)for(j=0;jw;j+)if(0m_Imagei*w+j&m_Imagei*w+ja)s=(c/a)*m_Imagei*w+j+b1;if(am_Imagei*w+j&m_Imagei*w+jb)s=(d-c)/(b-a)*(m_Imagei*w+j-a)+c;if(bm_Imagei*w+j&m_Imagei*w+j
29、255)s=(255-d)/(255-b)*(m_Imagei*w+j-b)+d;if(s255)s=255;fi*w+j=(unsigned char)(s);memcpy(m_Image,f,w*h);Invalidate();delete f;void CZhangjianView:OnDuishu() /对数运算/ TODO: Add your command handler code herelong w,h;long i,j;if(m_DibHead=NULL)MessageBox(当前无图像,请打开图像!,提示);return;w=m_DibHead-biWidth;h=m_Di
30、bHead-biHeight;unsigned char *f=new unsigned charw*h;memset(f,0,w*h);float c=100;double s(0);for(i=0;ih;i+)for(j=0;jw;j+)s=c*log10(m_Imagei*w+j+1);if(s255)s=255;fi*w+j=(unsigned char)(s);memcpy(m_Image,f,w*h);Invalidate();delete f;void CZhangjianView:OnZhishu() /指数运算/ TODO: Add your command handler
31、code herelong w,h;long i,j;if(m_DibHead=NULL)MessageBox(当前无图像,请打开图像!,提示);return;w=m_DibHead-biWidth;h=m_DibHead-biHeight;unsigned char *f=new unsigned char w*h;memset(f,0,w*h);float c=80;float r=1.5;float b=50;double s(0);for(i=0;ih;i+)for(j=0;jw;j+)s=c*pow(m_Imagei*w+j,r);if(s255)s=255;fi*w+j=(unsi
32、gned char)(s);memcpy(m_Image,f,w*h);Invalidate();delete f;void CZhangjianView:OnFanse() /反色/ TODO: Add your command handler code herelong w,h;long i,j;if(m_DibHead=NULL)MessageBox(当前无图像,请打开图像!,提示);return;w=m_DibHead-biWidth;h=m_DibHead-biHeight;unsigned char *f=new unsigned charw*h;memset(f,0,w*h);f
33、or(i=0;ih;i+)for(j=0;jbiWidth;h=m_DibHead-biHeight;unsigned char *f=new unsigned charw*h;memset(f,0,w*h);float a=127;for(i=0;ih;i+)for(j=0;jw;j+)if(0m_Imagei*w+j&m_Imagei*w+ja)m_Imagei*w+j=0;if(am_Imagei*w+j&m_Imagei*w+jbiWidth;h=m_DibHead-biHeight;unsigned char *Image1=new unsigned charw*h;memcpy(Image1,m_Image,w*h);On();for(i=0;ih;i+)for(j=0;jw;j+)*(m_Image+i*w+j)=m_Imagei*w+j+Image1i*w+j;Invalidate();delete Image1;void CZhangjianView:OnJianfayunsuan() /减法运算
限制150内