1、VC+图像处理程序实验数字图像处理实验指导书 天津理工大学计算机科学与通信学院 杨淑莹 2009-4-16目录数字图像处理实验指导书 11. 总述 32. 试验题目 32.1 实验(一) 32.2 实验(二) 172.3.实验(三) 262.4 实验(四) 321.总述数字图像处理课程实验使学生将理论和实际结合起来,增强学生的动手编程能力。其目的使学生将所学内容灵活运用和掌握,拓展学生的思维。本文档详细描述了数字图像处理的四次实验的实验目的和实验步骤,及较为详细的编程代码以及实验效果。2.试验题目2.1 实验(一) 实验名称 图像的特效显示 软件环境 windows VC+6.0 实验目的 1
2、 实现图像颜色修改处理。2 将图像中的红气球物体左右、上下、对称复制。3 实现图像的渐隐显示。4 自行设计图像的几何变换显示。 实验内容(应包括实验题目、实验要求、实验任务等)1 实现图像颜色修改处理要求:显示一幅位图,实现图像颜色修改处理。(1)在左视图中打开一幅bmp位图,包括256色或真彩色位图(2)制作一个【图像颜色修改处理】菜单,将消息映射到右视图中,在右视图中显示位图,完成图像颜色修改处理显示功能。2. 将图像中的红气球物体左右、上下、对称复制。要求:在左视图中打开一幅256色的灰度bmp位图。将图像中的红气球物体左右、上下、对称复制。 (1)在左视图中打开一幅bmp位图,包括25
3、6色或真彩色位图(2)制作一个【红气球复制】菜单,将消息映射到右视图中,在右视图中,完成将图像中的红气球物体左右、上下、对称复制功能。3. 实现图像渐隐显示。要求:显示一幅位图,实现图像渐隐显示。(1)在左视图中打开一幅bmp位图,包括256色或真彩色位图(2)制作一个【图像渐隐显示】菜单,将消息映射到右视图中,在右视图中显示位图,完成图像图像渐隐显示功能。 4. 自行设计图像的几何变换。(选作) 要求:自行设计图像的几何变换。 (1)在左视图中打开一幅bmp位图,包括256色或真彩色位图(2)制作一个【自行设计图像的几何变换】菜单,将消息映射到右视图中,在右视图中自行设计图像的特效显示,完成
4、图像的几何变换功能。 实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论). 图像颜色修改处理编程思路: 该程序只针对24位彩色位图,不适用于灰度位图。当原图的像素点为蓝色时,将 显示屏幕上该位置的像素点像素值置为绿色,否则不变,将原图像素值赋给新图。程序代码:void CDynSplitView2:OnYansexiugai() /刷新屏幕 CDC *pDC=GetDC(); CRect rect(0,0,1000,1000); CBrush brush(RGB(255,255,255); pDC-FillRect(&rect,&brush); /复制图像数据 clearmem(
5、); CDSplitDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(!pDoc -statedoc&state2=1 ) BYTE* pBitmapData = CDibNew1-GetData(); LPBITMAPINFO pBitmapInfo = CDibNew1-GetInfo(); int bitmapHeight= CDibNew1-GetHeight(); int bitmapWidth = CDibNew1-GetWidth(); LPBYTE temp; temp=new BYTECDibNew1-GetHeight()*
6、CDibNew1-GetWidth()*3; memset (temp,0,CDibNew1-GetHeight()*CDibNew1-GetWidth()*3); for(int j = 0; j bitmapHeight; j+) for(int i = 0; i GetSafeHdc(), 0, 0, bitmapWidth, bitmapHeight, 0, 0, bitmapWidth, bitmapHeight, temp, pBitmapInfo, DIB_RGB_COLORS, SRCCOPY);memcpy ( pBitmapData,temp,CDibNew1-GetHei
7、ght()*CDibNew1-GetWidth()*3); delete temp; 实验效果 2. 将图像中的红气球物体左右、上下、对称复制。代码设计思路:将气球画在图的上部四分一处,但图的大小为1,显示时将图像的上部四分一处复制四次,分别显示在左图。程序核心代码:void CDynSplitView2:OnHongqiqiufuzhi() / TODO: Add your command handler code here int i,j; /刷新屏幕 CDC *pDC=GetDC(); CRect rect(0,0,1000,1000); CBrush brush(RGB(255,255
8、,255); pDC-FillRect(&rect,&brush); /复制图像数据 clearmem(); CDSplitDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(!pDoc -statedoc&state2=1 ) BYTE* pBitmapData = CDibNew1-GetData(); LPBITMAPINFO pBitmapInfo = CDibNew1-GetInfo(); int bitmapHeight= CDibNew1-GetHeight(); int bitmapWidth = CDibNew1-GetWidt
9、h(); LPBYTE temp; temp=new BYTECDibNew1-GetHeight()*CDibNew1-GetWidth()*3; memset (temp,0,CDibNew1-GetHeight()*CDibNew1-GetWidth()*3); for( j = 0; j bitmapHeight; j+) for( i = 0; i GetSafeHdc(), 0,bitmapHeight/2, bitmapWidth/2, bitmapHeight/2, 0,bitmapHeight/2, bitmapWidth/2, bitmapHeight/2, temp, p
10、BitmapInfo, DIB_RGB_COLORS, SRCCOPY); :StretchDIBits(pDC-GetSafeHdc(), bitmapWidth/2, 0, bitmapWidth/2, bitmapHeight/2, 0,bitmapHeight/2, bitmapWidth/2, bitmapHeight/2, temp, pBitmapInfo, DIB_RGB_COLORS, SRCCOPY); :StretchDIBits(pDC-GetSafeHdc(), 0,0, bitmapWidth/2, bitmapHeight/2, 0,bitmapHeight/2,
11、 bitmapWidth/2, bitmapHeight/2, temp, pBitmapInfo, DIB_RGB_COLORS, SRCCOPY); :StretchDIBits(pDC-GetSafeHdc(),bitmapWidth/2, bitmapHeight/2, bitmapWidth/2, bitmapHeight/2, 0,bitmapHeight/2, bitmapWidth/2, bitmapHeight/2, temp, pBitmapInfo, DIB_RGB_COLORS, SRCCOPY);memcpy ( pBitmapData,temp,CDibNew1-G
12、etHeight()*CDibNew1-GetWidth()*3); delete temp; 实验效果3. 图像渐隐显示编程思路:先记录下图想的每个像素点的像素值,显示的时候先将屏幕显示原图,将循环显示n次,这里设n从256,255,2,1,0。每一次显示像素值的n/256倍,图像的像素点计算一遍后,显示一次,重复执行上述过程,直至屏幕上所有的像素点全变黑。程序代码:void CDynSplitView2:OnTuxiangjianyin() /刷新屏幕 CDC *pDC=GetDC(); CRect rect(0,0,1000,1000); CBrush brush(RGB(255,255
13、,255); pDC-FillRect(&rect,&brush); /复制图像数据 clearmem(); CDSplitDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(!pDoc -statedoc&state2=1 ) BYTE* pBitmapData = CDibNew1-GetData(); LPBITMAPINFO pBitmapInfo = CDibNew1-GetInfo(); int bitmapHeight= CDibNew1-GetHeight(); int bitmapWidth = CDibNew1-GetWidt
14、h(); if (CDibNew1-GetRGB() / Has a color table CPalette * hPalette=CreateBitmapPalette(CDibNew1); CPalette * hOldPalette = pDC-SelectPalette(hPalette, true); pDC-RealizePalette(); LPBYTE temp,temp1,temp2; temp=new BYTECDibNew1-GetHeight()*CDibNew1-GetWidth(); memset(temp,0,CDibNew1-GetHeight()*CDibN
15、ew1-GetWidth(); for(int n=256;n=0;n-) temp1=pBitmapData; temp2=temp; for(int j = 0; j bitmapHeight; j+) for(int i = 0; i GetSafeHdc(),0, 0, bitmapWidth,bitmapHeight, 0, 0, bitmapWidth, bitmapHeight, temp,pBitmapInfo, DIB_RGB_COLORS, SRCCOPY); Sleep(10); pDC-SelectPalette(hOldPalette, true); :DeleteO
16、bject(hPalette); delete temp; else LPBYTE temp; temp=new BYTECDibNew1-GetHeight()*CDibNew1-GetWidth()*3; memset (temp,0,CDibNew1-GetHeight()*CDibNew1-GetWidth()*3); for(int m=256;m=0;m-) for(int j = 0; j bitmapHeight; j+) for(int i = 0; i GetSafeHdc(), 0, 0, bitmapWidth, bitmapHeight, 0, 0, bitmapWi
17、dth, bitmapHeight, temp, pBitmapInfo, DIB_RGB_COLORS, SRCCOPY); Sleep(10); delete temp; 实验效果4. 自行设计图像的几何变换放大后做水平、垂直镜像编程思路:取得原图的数据区指针;通过对话框获得放大整数比例:X,Y,更改图像的宽度和高度;每个像素依稀次循环,计算该像素在原图像中的坐标,将原图的像素值赋给目标像素相应X*Y个值。放大过程完成。取得原图的数据区指针;开辟一个同样大小的缓冲区;每个像素依次循环,在水平镜像中,将原图中的像素点的水平坐标变成镜像后的坐标(用图像的宽度减去坐标值)在显示到图像上。垂直景镜
18、像中,则对垂直坐标做相应的处理。(1)放大后做镜像程序代码:void CDynSplitView2:OnFangdashuipingjingxiang() clearmem(); float xzoom,yzoom; CDlgSuoFang dlg; / 定义对话框 dlg.m_XZoom=2.0; dlg.m_YZoom=2.0; / 显示对话框,提示用户设定窗口上下限 if (dlg.DoModal() != IDOK) return; / 返回 xzoom=dlg.m_XZoom; yzoom=dlg.m_YZoom; delete dlg; / 删除对话框 / 源图像的宽度和高度 LO
19、NG wide; LONG height; / 缩放后图像的宽度和高度 LONG newwide; LONG newheight; LONG newLineBytes; LPBYTE temp; / 获取图像的宽度和高度 wide = CDibNew1-GetWidth(); height = CDibNew1-GetHeight(); if(CDibNew1-m_pBitmapInfoHeader-biBitCountm_pData=CDibNew1-FangDa(temp,xzoom,yzoom,wide,height,newLineBytes,newheight); CDibNew1-S
20、etWidth(newwide); CDibNew1-SetHeight(newheight); CDibNew1-JingXiang(TRUE); /调用水平镜像处理函数 Invalidate(); /调用刷新函数 else / 计算缩放后的图像宽度和高度 newwide = (LONG) (wide * xzoom*3); newheight = (LONG) (height * yzoom); / 分配内存,以保存新DIB temp = new BYTE newwide * newheight; memset(temp,0,newwide * newheight); CDibNew1-m
21、_pData=CDibNew1-FangDa(temp,xzoom,yzoom,wide,height,newwide,newheight); CDibNew1-SetWidth(newwide/3); CDibNew1-SetHeight(newheight); CDibNew1-JingXiang(TRUE); /调用水平镜像处理函数 Invalidate(); /调用刷新函数 放大代码:LPBYTE TeXiaoXianShiDib:FangDa(LPBYTE temp, float xzoom, float yzoom,LONG wide,LONG height,LONG newwid
22、e,LONG newheight) / 指向源图像的指针 LPBYTE p_data ; LPBYTE temp1; / 指向源象素的指针 LPBYTE lpSrc; / 指向缩放图像对应象素的指针 LPBYTE lpDst; int i; int j; / 象素在源DIB中的坐标 int i0; int j0; p_data=this-GetData(); / 获取图像的宽度 int k1=(int)yzoom ; int k2= (int)xzoom ; if(m_pBitmapInfoHeader-biBitCount9) /灰度图像 temp1 = new BYTEnewwide *
23、newheight; memset(temp1,(BYTE)255,newwide * newheight); / 针对图像每行进行操作 for(j = 0; j newheight; j+) / 针对图像每列进行操作 for(i = 0; i = 0) & (i0 = 0) & (j0 height) lpSrc=(LPBYTE)p_data + wide * j0 + i0; *lpDst=*lpSrc; temp=temp1; return temp; else /24位彩色 / 分配内存,以保存新DIB temp1 = new BYTEnewwide * newheight*4; memset(temp1,255,newwide * newheight*4); int r,g,b; / 针对图像每行进行操作 for(j = 0; j height; j+) / 针对图像每列进行操作 for(i = 0; i wide; i+) lpSrc = (LPBYTE)p_data + wide * j*3 + i*3; r=*lpSrc+
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2