欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    中南大学图像处理实验报告(共28页).doc

    • 资源ID:17329452       资源大小:1.85MB        全文页数:28页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    中南大学图像处理实验报告(共28页).doc

    精选优质文档-倾情为你奉上数字图像处理实验报告学院:信息科学与工程学院姓名: * 班级:*学号:*指导老师:罗三定实验1 PhotoShop功能操作一、实验目的1、了解数码相机基本使用。2、熟悉PHOTOSHOP在图像处理上的用途。3、掌握PHOTOSHOP一些基本的图像操作。二、实验内容1、观察图像大小(宽与高像素)。图像菜单中图像大小选项图1,图像大小2、改变图像大小。在上述图像大小窗口改变数值就可以改变图像大小。3、观察各处的RGB值、色度、亮度、饱和度的值。将鼠标移动到图上各处,在右侧信息栏里可以看到RGB值。图2,RGB值再取颜色取样工具,右键点击图片,选择HSB即为色度亮度饱和度的值。图3,HSB值4、单独观察红色、绿色、蓝色分量图像。右下角选择通道,选择不同通道即可观察红色,绿色,蓝色分量图像图4,红色分量图图5,绿色分量图图6,蓝色分量图5、将彩色图像转换为灰度图像,存盘后观察文件大小。先选择图像模式灰度,选择扔掉图7,灰度图像然后另存为bmp格式的图像,可以看出文件大小变小了很多。6、观察图像的直方图。 直接在右侧栏可观察到直方图。图8,直方图7、改变图像的亮度、对比度、饱和度,观察操作结果。在图像中选择调整亮度/对比度即可调整然后观察效果同样在调整中选择色相饱和度。即可调整饱和度8、以不同阈值二值化图像。在图像调整阈值,可以调整色阶,观察不同阈值二值化图像。图9,观察不懂阈值二值化图像实验2 Photoshop图像处理实验一、实验目的1、了解bmp图像的数据存储形式。2、学习使用不同的滤波方法处理图像。3、掌握PHOTOSHOP一些图像增强处理方法。二、实验内容1、打开一个bmp图像2、自定义滤波器处理图像。(1)滤波中选择自定义图像有一定程度的模糊。常用的图像平滑模板有:、选择第一种模板,得到(2)从频谱的角度分析,图像的锐化类似于一个高通滤波器。常用的锐化模板有:、等。这两个模板又称为拉普拉斯模板。选择第二个模板得到(3)边缘查找又称为边缘检测,边缘是指周围像素灰度发生阶跃型或凸缘型变化的像素的集合。常用的边缘检测算子,包括Sobel、Prewitt、Krisch、Laplace算子等。这里采用Sobel得到图像3、练习使用模糊、锐化、涂抹、减淡和加深等工具进行图像的编辑。这些工具都在右侧工具栏可以找到,比如说锐化工具和模糊工具减淡加深工具:实验3 图像处理编程实验一、实验目的1、熟悉VB或VC的基本编程方法。2、了解bmp位图文件的结构。3、掌握灰度直方图的原理及绘制过程。二、实验内容1、读取BMP位图文件 BMP 位图包括位图文件头结构BITMAPFILEHEADER 、位图信息头结构BITMAPINFOHEADER、位图颜色表 RGBQUAD 和位图像素数据四部分。处理位图时要根据文件的这些结构得到位图文件大小、位图的宽、高、实现调色板、得到位图像素值等等。对于256 级灰度图像每个像素用 8bit 表示颜色的索引值,这里要注意的一点是在 BMP位图中,位图的每行像素值要填充到一个四字节边界,即位图每行所占的存储长度为四字节的倍数,不足时将多余位用0 填充。 在处理图像应用程序的文档类(CdibDoc.h)中声明如下宏及公有变量: #define WIDTHBYTES(bits) (bits) + 31) / 32 * 4)/ 计算图像每行象素所占的字节数目 HANDLE m_hDIB;/存放位图数据的句柄 CPalette* m_palDIB;/指向调色板Cpalette类的指针 CSize m_sizeDoc; file:/ 初始化视图的尺寸 根据BMP 位图文件的结构,操作 BMP 位图文件读入数据,重载了文挡类的OnOpenDocument 函数如下: BOOL CDibDoc:OnOpenDocument(LPCTSTR lpszPathName) CFile file; CFileException fe; if (!file.Open(lpszPathName, Cfile:modeRead | Cfile:shareDenyWrite, &fe) AfxMessageBox("文件打不开"); return FALSE; /打开文件 DeleteContents();/删除文挡 BeginWaitCursor(); BITMAPFILEHEADER bmfHeader;/定义位图文件头结构 DWORD dwBitsSize; HANDLE hDIB; LPSTR pDIB; BITMAPINFOHEADER *bmhdr;/指向位图信息头结构的指针 dwBitsSize = file.GetLength();/ 得到文件长度 if (file.Read(LPSTR)&bmfHead er, sizeof(bmfHeader) != sizeof(bmfHeader) return FALSE; if (bmfHeader.bfType != 0x4d42) file:/ 检查是否为 BMP文件 return FALSE; hDIB=(HANDLE) :GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize); file:/申请缓冲区 if (hDIB = 0) return FALSE; pDIB = (LPSTR) :GlobalLock(HGLOBAL)hDIB); file:/得到申请的缓冲区的指针 if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER) != dwBitsSize - sizeof(BITMAPFILEHEADER) ) :GlobalUnlock(HGLOBAL)hDIB); hDIB=NULL; return FALSE; /读数据,包括位图信息、位图颜色表、图像像素的灰度值 bmhdr=(BITMAPINFOHEADER*)pDIB;/ 为指向位图信息头结构的指针付值 :GlobalUnlock(HGLOBAL)hDIB); if (*bmhdr).biBitCount!=8) file:/ 验证是否为8bit 位图 return FALSE; m_hDIB=hDIB; InitDIBData(); file:/自定义函数,根据读入的数据得到位图的宽、高、颜色表 file:/ 来得到初始化视的尺寸、生成调色板 EndWaitCursor(); SetPathName(lpszPathName);/ 设置存储路径 SetModifiedFlag(FALSE); / 设置文件修改标志为FALSE return TRUE; 为了将图像处理后所得到的像素值保存起来,重载了文档类的OnSaveDocument函数,其具体实现如下: BOOL CDibDoc:OnSaveDocument(LPCTSTR lpszPathName) CFile file; CFileException fe; BITMAPFILEHEADER bmfHdr; / 位图文件头结构 LPBITMAPINFOHEADER lpBI; file:/指向位图信息结构的指针 DWORD dwDIBSize; if (!file.Open(lpszPathName, Cfile:modeCreate | Cfile:modeReadWrite | Cfile:shareExclusive, &fe) AfxMessageBox("文件打不开"); /打开文件 BOOL bSuccess = FALSE; BeginWaitCursor(); lpBI = (LPBITMAPINFOHEADER) : GlobalLock(HGLOB AL) m_hDIB); if (lpBI = NULL) return FALSE; dwDIBSize = *(LPDWORD)lpBI + 256*sizeof(RGBQUAD); / Partial Calculation DWORD dwBmBitsSize;/BMP 文件信息结构所占的字节数 dwBmBitsSize=WIDTHBYTES(lpBI->biWidth)*(DWORD)lpBI->biBitCount) *lpBI->biHeight;/ 存储时位图所有像素所占的总字节数 dwDIBSize += dwBmBitsSize; lpBI->biSizeImage = dwBmBitsSize; / 位图所有像素所占的总字节数 file:/以下五句为文件头结构填充值 bmfHdr.bfType =0x4d42; / 文件为"BMP" 类型 bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);/ 文件总长度 bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize + 256*sizeof(RGBQUAD); file:/位图数据距问件头的偏移量 file.Write(LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER);/写文件头 file.WriteHuge(lpBI, dwDIBSize); file:/将位图信息(信息头结构、颜色表、像素数据)写入文件 :GlobalUnlock(HGLOBAL) m_hDIB); EndWaitCursor(); SetModifiedFlag(FALSE); / back to unmodified return TRUE; 灰度图像要正确显示,必须实现逻辑调色板和系统调色板,通过在主框架类中处理Windows 定义的消息 WM_QUERYNEWPALETTE 、WM_PALETTECHANGED及视图类中处理自定义消息 WM_DOREALIZE (该消息在主框架窗口定义如下:#define WM_REALIZEPAL (WM_USER+100))来实现调色板的操作。 void CMainFrame:OnPaletteChanged(CWnd* pFocusWnd) file:/ 总实现活动视的调色板 CMDIFrameWnd:OnPaletteChanged(pFocusWnd); CMDIChildWnd* pMDIChildWnd = MDIGetActive(); if (pMDIChildWnd = NULL) return CView* pView = pMDIChildWnd->GetActiveView(); ASSERT(pView != NULL); SendMessageToDescendants(WM_DOREALIZE, (WPARAM)pView->m_hWnd); file:/通知所有子窗口系统调色板已改变 BOOL CMainFrame:OnQueryNewPalette()/提供实现系统调色板的机会 / 实现活动视的调色板 CMDIChildWnd* pMDIChildWnd = MDIGetActive(); if (pMDIChildWnd = NULL) return FALSE; / no active MDI child frame (no new palette) CView* pView = pMDIChildWnd->GetActiveView(); ASSERT(pView != NULL); file:/通知活动视图实现系统调色板 pView->SendMessage(WM_DOREALIZE, (WPARAM)pView->m_hWnd); return TRUE; LRESULT CDibView:OnDoRealize(WPARAM wParam, LPARAM)/实现系统调色板 ASSERT(wParam != NULL); CDibDoc* pDoc = GetDocument(); if (pDoc->m_hDIB = NULL) return 0L; / must be a new document CPalette* pPal = pDoc->m_palDIB; file:/调色板的颜色表数据在InitDIBData() 函数中实现 if (pPal != NULL) CMainFrame* pAppFrame = (CMainFr ame*) AfxGetApp()->m_pMainWnd; ASSERT_KINDOF(CMainFrame, pAppFrame); CClientDC appDC(pAppFrame); CPalette* oldPalette = appDC.SelectPa lette(pPal, (HWND)wP aram) != m_hWnd); file:/只有活动视才可以设为"FALSE" , / 即根据活动视的调色板设为"前景"调色板 if (oldPalette != NULL) UINT nColorsChanged = appDC.RealizePalette();/实现系统调色板 if (nColorsChanged > 0) pDoc->UpdateAllViews(NULL);/ 更新视图 appDC.SelectPalette(oldPalette, TRUE); file:/将原系统调色板置为逻辑调色板 else TRACE0("tSelectPalette failed in CDibView:OnPaletteChangedn"); 2、绘制灰度直方图。下面的程序显示一幅图的灰度直方图。有两段程序,第一段统计出每个灰度的像素个数,存放在数组GrayTable 中,然后产生一个新的窗口,把统计结果显示出来。第二段程序就是该窗口的消息处理函数。要注意的是,由于各灰度出现的频率可能相差很大,所以如何将结果显示在有限的窗口范围内,是一个必须考虑的问题。我们这里的做法是,在所有出现的灰度中,统计出一个最大值 max 和一个最小值min,假设能显示的窗口最大坐标为 270,最小坐标为5 ,按成比例显示,这样,灰度出现的次数和显示坐标之间呈线形关系,设 a*grayhits+b=coordinate,其中 grayhits为灰度出现的次数,coordinate 为显示坐标,a 和b 为两个常数。我们将max 和min 代入,应该满足a*max+b=270 ; a*min+b=5 可以解得a=265/(max-min); b=270.0-a* max 。 int GrayTable256; int MaxGrayNum; int MinGrayNum; BOOL Histogram(HWND hWnd) DWORD OffBits,BufSize; LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; int x,y; int grayindex; HWND hPopupWnd; int temp; /计数器清零 for(grayindex=0;grayindex<256;grayindex+) GrayTablegrayindex=0; /OffBits为到实际位图数据的偏移值 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); /BufSize 为缓冲区的大小 BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER); lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); for(y=0;y<bi.biHeight;y+) lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes); for(x=0;x<bi.biWidth;x+) grayindex=(unsigned char)*(lpPtr+); GrayTablegrayindex+; / 对应的颜色计数值加 1 MaxGrayNum=0; MinGrayNum=65535; for(grayindex=0;grayindex<256;grayindex+) temp=GrayTablegrayindex; if(temp>MaxGrayNum) MaxGrayNum=temp; / 找到更大的了 if( (temp<MinGrayNum) && (temp>0) ) MinGrayNum=temp; / 找 到更小的了 GlobalUnlock(hImgData); /产生新的窗口显示结果 hPopupWnd = CreateWindow ("PopupWindowClass", "Histogram Statistic Window",WS_OVERLAPPEDWINDOW,50,80,550,350, hWnd,NULL,ghInst,NULL); if (hPopupWnd) ShowWindow (hPopupWnd, SW_SHOW); UpdateWindow (hPopupWnd); return TRUE; 下面是新窗口的消息处理函数 long FAR PASCAL PopupWndProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) HDC hdc; PAINTSTRUCT ps; DWORD i; int xstart; static LOGPEN blp=PS_SOLID,1,1,RGB(0,0,255); / 蓝色画笔 HPEN bhp; /画笔句柄 float a,b,temp; char str10; /计算上面所说的 a,b的值 a=(float)(265.0 /( MaxGrayNum - MinGrayNum) ); b=(float) (270.0-a* MaxGrayNum); switch (message) case WM_PAINT: hdc = BeginPaint(hWnd, &ps); bhp = CreatePenIndirect(&blp); SelectObject(hdc,bhp); MoveToEx(hdc,2,270,NULL); LineTo(hdc,518,270); / 先画一条水平线 xstart=2; for(i=0;i<256;i+) MoveToEx(hdc,xstart,270,NULL); if (GrayTablei!=0) temp=(float)(a*GrayTablei+b); else temp=0.0f; /如果灰度出现的次数是零,则不画线 LineTo(hdc,xstart,270-(int)temp); / 画出该灰度的计数值 if (i%16 =0) /画出标尺,每 16 个一格 MoveToEx(hdc,xstart,270,NULL); LineTo(hdc,xstart,280); _itoa(i,str,10); TextOut(hdc,xstart,285,str,strlen(str); xstart+=2; MoveToEx(hdc,xstart,270,NULL); LineTo(hdc,xstart,280); TextOut(hdc,xstart,285,"256",strlen("256"); EndPaint(hWnd,&ps); DeleteObject(bhp); break; default: break; return DefWindowProc (hWnd, message, wParam, lParam); 3、编程实现实验2中的图像处理方法。void CDibView:OnMENUHighPass() HANDLE data1handle; LPBITMAPINFOHEADER lpBi; CDibDoc *pDoc=GetDocument(); HDIB hdib; unsigned char *hData; unsigned char *data; hdib=pDoc->GetHDIB(); BeginWaitCursor(); lpBi=(LPBITMAPINFOHEADER)GlobalLock(HGLOBAL)hdib); hData=(unsigned char*)FindDIBBits(LPSTR)lpBi); pDoc->SetModifiedFlag(TRUE); data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight); data=(unsigned char*)Global Lock(HGLOBAL)data1handle); AfxGetApp()->BeginWaitCursor(); int i,j,s,t,ms=1; int sum=0,sumw=0; int mask33= 自定义的模板; for(i=0; ibiHeight; i+) for(j=0; jbiWidth; j+) sumw=0; sum=0; for(s=(-ms); s<=ms; s+) for(t=(-ms); t<=ms; t+) if(i+s)>=0) && (j+t)>=0) && (i+s)biHeight) && (j+t)biWidth) sumw += mask1+s1+t; sum+=*(hData+(i+s)*WIDTHBYTES(lpBi- >biWidth*8)+(j+t)*mask1+s1+t; if(sumw=0) sumw=1; sum/=sumw; if(sum>255)sum=255; if(sum<0)sum=0; *(data+i*WIDTHBYTES(lpBi->biWidth*8)+j)=sum; for( j=0; jbiHeight; j+) for( i=0; ibiWidth; i+) *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j); AfxGetApp()->EndWaitCursor(); GlobalUnlock(HGLOBAL)hdib); GlobalUnlock(data1handle); EndWaitCursor(); Invalidate(TRUE); 实验4 图像处理编程量测实验一、实验目的1、掌握Hough变换。2、综合运用图像处理的各种操作,获取图像信息。二、实验内容a 平滑滤波同实验三程序实现平滑滤波,滤波后效果图如下:b 边缘增强同实验三程序实现边缘增强,增强后效果图如下:c Hough变换 BOOL Hough(HWND hWnd) / 定义一个自己的直线结构 typedef struct int topx; / 最高点的 x 坐标 int topy; / 最高点的 y 坐标 int botx; / 最低点的 x 坐标 int boty; / 最低点的 y 坐标 MYLINE; DWORD BufSize; LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HDC hDc; LONG x,y; long i,maxd; int k; int Dist,Alpha; HGLOBAL hDistAlpha,hMyLine; int *lpDistAlpha; MYLINE *lpMyLine,*TempLine,MaxdLine; static LOGPEN rlp=PS_SOLID,1,1,RGB(255,0,0); HPEN rhp; if( NumColors!=256) MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!", "Error Message",MB_OK|MB_ICONEXCLAMATION); return FALSE; / 计算最大距离 Dist=(int)(sqrt( (double)bi.biWidth*bi.biWidth+ (double)bi.biHeight*bi.biHeight)+0.5) ; Alpha=180 /2 ; /0 到 to 178 度,步长为 2 度 /为距离角度数组分配内存 if(hDistAlpha=GlobalAlloc(GHND,(DWO RD)Dist* Alpha * sizeof(int)=NULL) MessageBox(hWnd,"Error allo c memory!","Error Message",MB_OK| MB_ICONEXCLAMATION); return FALSE; /为记录直线端点的数组分配内存 if(hMyLine=GlobalAlloc(GHND,(DWO RD)Dist*Alpha*sizeof(MYLINE)=NULL) GlobalFree(hDistAlpha); return FALSE; /原图缓冲区的大小 BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER); lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpDistAlpha=(int *)GlobalLock(hDistAlpha); lpMyLine=(MYLINE *)GlobalLock(hMyLine); for (i=0;i<(long)Dist*Alpha;i+) TempLine=(MYLINE*)(lpMyLine+i); (*TempLine).boty=32767; /初始化最低点的 y 坐标为一个很大的值 for (y=0;y<bi.biHeight;y+) /lpPtr 指向位图数据 lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes); for (x=0;x<bi.biWidth;x+) if(*(lpPtr+)=0) /是个黑点 for (k=0;k<180;k+=2) /计算距离 i i=(long)fabs(x*cos(k*PI/180.0)+y*sin(k*PI/180.0) ); /相应的数组元素加 1 *(lpDistAlpha+i*Alpha+k/2)=*(lpDistAlpha+i*Alpha+k/2)+1; TempLine=(MYLINE*)(lpMyLine+i*Alpha+k/2); if(y> (*TempLine).topy) / 记录该直线最高点的 x,y 坐标 (*TempLine).topx=x; (*TempLine).topy=y; if(y< (*TempLine).boty) / 记录该直线最低点的 x,y 坐标 (*TempLine).botx=x; (*TempLine).boty=y; maxd=0; for (i=0;i<(long)Dist*Alpha;i+) TempLine=(MYLINE*)(lpMyLine+i); k=*(lpDistAlpha+i); if( k > maxd) /找到数组元素中最大的,及相应的直线端点 maxd=k; MaxdLine.topx=(*TempLine).topx; MaxdLine.topy=(*TempLine).topy; MaxdLine.botx=(*TempLine).botx; MaxdLine.boty=(*TempLine).boty; hDc = GetDC(hWnd); rhp = CreatePenIndirect(&rlp); SelectObject(hDc,rhp); MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL); /在两端点之间画一条红线用来标识 LineTo(hDc,MaxdLine.topx,MaxdLine.topy); DeleteObject(rhp); ReleaseDC(hWnd,hDc); /释放内存及资源 GlobalUnlock(hImgData); GlobalUnlock(hDistAlpha); GlobalFree(hDistAlpha); GlobalUnlock(hMyLine); GlobalFree(hMyLine)

    注意事项

    本文(中南大学图像处理实验报告(共28页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开