图像处理的开闭运算.pdf

上传人:tbuqq 文档编号:4513212 上传时间:2019-11-13 格式:PDF 页数:16 大小:1.51MB
返回 下载 相关 举报
图像处理的开闭运算.pdf_第1页
第1页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《图像处理的开闭运算.pdf》由会员分享,可在线阅读,更多相关《图像处理的开闭运算.pdf(16页珍藏版)》请在三一文库上搜索。

1、1 / 16 图像处理的开运算与闭运算 0. 前言 腐蚀和膨胀是依据数学形态学集合论方法发展起来的图像处理方法,起源于岩相对岩石结构的定量描述工作, 在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析方法和理论。数学形 态学是图像处理和模式识领域的新方法,其基本思想是:用具有一定形态的结构元素去量度和提取图像中的 对应形状,以达到图像分析和识别的目的。优势有以下几点:有效滤除噪声,保留图像中原有信息,算法易 于用并行处理方法有效实现,基于数学形态学的边缘信息提取处理优于基于微分运算的边缘提取算法,提取 的边缘比较平滑,提取的图像骨架也比较连续,断点少b5E2RGbCA

2、P 腐蚀 : 是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。 膨胀: 是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空 洞。 开运算: 先腐蚀后膨胀的过程开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时 并不明显改变其面积。开运算通常是在需要去除小颗粒噪声,以及断开目标物之间粘连时使用。其主要作用 与腐蚀相似,与腐蚀操作相比,具有可以基本保持目标原有大小不变的优点。p1EanqFDPw 闭运算 : 先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并 不明显改变其面积。DXD

3、iTa9E3d 原因 :虽然腐蚀处理可以将粘连的目标物进行分离,膨胀处理可以将断开的目标物进行接续,但同时都存在 一个问题,就是经过腐蚀处理后,目标物的面积小于原有面积,而经过膨胀处理之后,目标物的面积大于原 有面积。开、闭运算就是为了解决这个问题而被提出的。RTCrpUDGiT 数学形态学中二值图像的形态变换是一种针对集合的处理过程。其形态算子的实质是表达物体或形状的集合 与结构元素间的相互作用,结构元素的形状就决定了这种运算所提取的信号的形状信息。形态学图像处理是 在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算。5PCzVD7HxA 1. 系统分析 系统功能需

4、求 。 void Open( 。 void Dilate( 。 void GrayDilate(BYTE *pData。 void Erosion( 。 void GrayErosion(BYTE *pData。 void Sort(int *pBuf, int l, int r。 void MidFilter(int nWidth, int nHeight。 void GrayErosion(int D。 void Save8(LPCTSTR lpszPathName。 void Save24(LPCTSTR lpszPathName。 void Save(LPCTSTR lpszPathN

5、ame, int nType。 void DrawIntensity(CDC *pDC, BYTE *lpSrc, int nType。 7 / 16 void Show(CDC *pDC, int x=0, int y=0, char *pStr=NULL。 void F24to8(const BYTE *pSrc, BYTE *pDest。 void F32to24(BYTE *lpBit。 void F8To24(BYTE *lpBit。 BOOL Initial(LPCTSTR lpszPathName。 void Clean( 。 CImageProcess(。 virtual CI

6、mageProcess( 。 private: BYTE *m_lpSrcBit。 /图像像素数据 / 构造函数:用于对成员变量进行初始化; m_lpSrcBit = NULL。 m_lpBmif = NULL。 m_lpModifyBit1 = NULL。 m_lpModifyBit2 = NULL。 m_nLineByte =1 。 m_nLineByte8 =1 。 m_nHeight = 1 。 m_nWidth = 1 。 m_nImgByteSize = 1 。 m_sImgPath = NULL 。 m_nMse = 0 。 m_pD = NULL 。 m_pa = NULL 。

7、 m_pe = NULL 。 m_Rmax = 0。 m_Rmax2 = 0 。 m_lpSrcBit8 = NULL。 m_lpModifyBit8 = NULL。 m_mes = “。 m_sCodeTime = “ 。 2)CImageProcess:CImageProcess( /析构函数;用于释放内存,避免内存泄露! NrpoJac3v1 Clean(。 3)voidCImageProcess:Clean( / 实际的释放内存函数 if ( m_lpSrcBit != NULL delete m_lpSrcBit 。 m_lpSrcBit = NULL。 if ( m_lpModif

8、yBit1 != NULL delete m_lpModifyBit1。 m_lpModifyBit1 = NULL。 if ( m_lpModifyBit2 != NULL 11 / 16 delete m_lpModifyBit2。 m_lpModifyBit2 = NULL。 if ( m_lpBmif != NULL delete m_lpBmif 。 m_lpBmif = NULL。 if ( m_sImgPath != NULL delete m_sImgPath。 m_sImgPath = NULL 。 if ( m_pD != NULL delete m_pD 。 m_pD =

9、 NULL 。 if ( m_pa != NULL delete m_pa。 m_pa = NULL 。 if ( m_pe != NULL delete m_pe。 m_pe = NULL 。 if ( m_lpSrcBit8 != NULL delete m_lpSrcBit8 。 m_lpSrcBit8 = NULL。 if ( m_lpModifyBit8 != NULL delete m_lpModifyBit8。 m_lpModifyBit8 = NULL。 4)BOOL Initial(LPCTSTR lpszPathName。 /打开图像及其初始化工作 1nowfTG4KI /

10、* fjnFLDa5Zo 初始化函数 功能:进行一系列的初始化操作,初始化位图的基本数据, 如长、宽,信息头等。 */ tfnNhnE6e5 BOOL CImageProcess:Initial(LPCTSTR lpszPathName /读取图像文件数据 CFile file(lpszPathName, CFile:modeRead 。 /使用 MSDN 讲解 HbmVN777sL DWORD len = file.GetLength(。 BYTE *pTemp = new BYTElen。 if ( (file.ReadHuge(pTemp, len != len AfxMessageBo

11、x(“ 文件读取失败!“。 delete pTemp。 return FALSE 。 if ( ( (BITMAPFILEHEADER *pTemp -bfType != *(WORD *“BM“ V7l4jRB8Hs AfxMessageBox(“ 目前只支持BMP 格式! “。 delete pTemp。 12 / 16 return FALSE 。 /清除上一次数据 Clean(。 /取得文件头指针 BITMAPFILEHEADER *lpbmfh = (BITMAPFILEHEADER *pTemp。83lcPA59W9 /取得信息头指针 BITMAPINFO *lpBMheader

12、= (BITMAPINFO *( lpbmfh + 1 。mZkklkzaaP /取得像素指针 BYTE *lpBit = (BYTE *lpbmfh+lpbmfh-bfOffBits。 /初始化图像信息 int nBitNum = lpBMheader-bmiHeader.biBitCount。 m_nWidth = lpBMheader-bmiHeader.biWidth。 m_nHeight = lpBMheader-bmiHeader.biHeight。 m_nLineByte = (m_nWidth*3*8+31/32*4。 m_nLineByte8 = (m_nWidth*8+31

13、/32*4。 m_nImgByteSize = m_nLineByte*m_nHeight。 /为像素数据申请存储空间 m_lpSrcBit = new BYTEm_nHeight*m_nLineByte。 m_lpSrcBit8 = new BYTEm_nLineByte8*m_nLineByte。 m_lpModifyBit8 = new BYTEm_nLineByte8*m_nLineByte。/颜色数转换 AVktR43bpw if ( nBitNum = 8 F8To24(lpBit 。 else if ( nBitNum = 32 F32to24(lpBit 。 else if (

14、nBitNum = 24 memcpy(m_lpSrcBit, lpBit, m_nHeight*m_nLineByte。 else AfxMessageBox(“ 不支持的BMP 格式! “。 delete pTemp。 Clean(。 return FALSE 。 /保存图像文件的路径 m_sImgPath = new charMAX_PATH。 strcpy(m_sImgPath, lpszPathName 。 /把信息头该为24 位, 8,32 位统一按 24 位处理 lpBMheader-bmiHeader.biBitCount = 24。 m_lpBmif = new BITMAP

15、INFO。 memcpy(m_lpBmif, lpBMheader, sizeof(BITMAPINFO 。 delete pTemp。 m_lpModifyBit1 = new BYTEm_nHeight*m_nLineByte。 memcpy(m_lpModifyBit1, m_lpSrcBit, m_nHeight*m_nLineByte。ORjBnOwcEd m_lpModifyBit2 = new BYTEm_nHeight*m_nLineByte。 memcpy(m_lpModifyBit2, m_lpSrcBit, m_nHeight*m_nLineByte。2MiJTy0dTT

16、 F24to8(m_lpSrcBit, m_lpSrcBit8。 return TRUE 。 5) /8 位灰度图像转24 位 void CImageProcess:F8To24(BYTE *lpBit int nLineByte = (8*m_nWidth+31/32*4。 13 / 16 for (int i=0 。 i for (int j=0 。 j BYTE *pTemp = m_lpSrcBit + i*m_nLineByte +j*3。 *pTemp = *(lpBit + i*nLineByte + j。 *(pTemp+1 = *pTemp 。 *(pTemp+2 = *pT

17、emp 。 6) /32 位灰度图像转24位 void CImageProcess:F32to24(BYTE *lpBit int nLineByte = m_nWidth*4。 for (int i=0 。 i for (int j=0 。 j BYTE *pTemp = m_lpSrcBit + i*m_nLineByte +j*3。 BYTE *pTemp2 = lpBit + i*nLineByte + j*4。 *pTemp = *pTemp2 。 *(pTemp+1 = *(pTemp2+1。 *(pTemp+2 = *(pTemp2+2。 7) /画直方图 void CImage

18、Process:DrawIntensity(CDC *pDC, BYTE *lpSrc, int nTypegIiSpiue7A if ( m_lpSrcBit = NULL | lpSrc = NULL return。 int anCount256 。 for (int k=0 。 k anCountk = 0 。 /统计直方图 for (int i=0 。 i for (int j=0 。 j BYTE *pTemp = lpSrc + i*m_nLineByte +j*3。 anCount*pTemp+ 。 / 字符串 CString str。 / 最大计数 LONG lMaxCount

19、 = 0 。 / 计算最大计数值 for (i = 0 。 i / 判断是否大于当前最大值 if (anCounti lMaxCount / 更新最大值 14 / 16 lMaxCount = anCounti 。 pDC-Rectangle(10+310*nType, m_nHeight+20, 310+310*nType, m_nHeight+350 。uEh0U1Yfmh / 创建画笔对象 CPen* pPenRed = new CPen。 / 红色画笔 pPenRed-CreatePen(PS_SOLID,1,RGB(255,0,0 。 / 创建画笔对象 CPen* pPenBlue

20、= new CPen 。 / 蓝色画笔 pPenBlue-CreatePen(PS_SOLID,1,RGB(0,0, 255 。 / 创建画笔对象 CPen* pPenGreen = new CPen。 / 绿色画笔 pPenGreen-CreatePen(PS_DOT,1,RGB(0,255,0 。 / 选中当前红色画笔,并保存以前的画笔 CGdiObject* pOldPen = pDC-SelectObject(pPenRed。 / 绘制坐标轴 pDC-MoveTo(20+310*nType, m_nHeight+30。 / 垂直轴 pDC-LineTo(20+310*nType, m_

21、nHeight+320。 / 水平轴 pDC-LineTo(300+310*nType, m_nHeight+320 / 绘制 Y 轴箭头 pDC-MoveTo(15+310*nType, m_nHeight+40。 pDC-LineTo(20+310*nType, m_nHeight+30。 pDC-LineTo(25+310*nType, m_nHeight+40。 / 绘制 X 轴箭头 pDC-MoveTo(290+310*nType, m_nHeight+315。 pDC-LineTo(300+310*nType, m_nHeight+320。 pDC-LineTo(290+310*n

22、Type, m_nHeight+325。 / 写 X 轴刻度值 for (k=0 。 k str.Format(“%d“, k 。 pDC-TextOut(12+310*nType+k, m_nHeight+330, str。 / 绘制 X 轴刻度 for (i = 0 。 i if (i & 1 = 0 / 10 的倍数 pDC-MoveTo(i+20+310*nType, m_nHeight+320。 pDC-LineTo(i+20+310*nType, m_nHeight+326。 else / 10 的倍数 pDC-MoveTo(i+20+310*nType, m_nHeight+32

23、0。 pDC-LineTo(i+20+310*nType, m_nHeight+323。 if ( i%50 = 0 pDC-MoveTo(i+20+310*nType, m_nHeight+320。 pDC-LineTo(i+20+310*nType, m_nHeight+329。 15 / 16 / 输出最大计数值 pDC-MoveTo(20+310*nType, m_nHeight+45。 pDC-LineTo(25+310*nType, m_nHeight+45。 str.Format(“%d“, lMaxCount。 pDC-TextOut(22+310*nType, m_nHeig

24、ht+50, str。 / 更改成蓝色画笔 pDC-SelectObject(pPenBlue 。 / 判断是否有计数 if (lMaxCount 0 / 绘制直方图 for (i = 0 。 i pDC-MoveTo(i+20+310*nType, m_nHeight+320。 pDC-LineTo(i+20+310*nType, m_nHeight+320 - (int (anCounti * 260 / lMaxCount。IAg9qLsgBX / 恢复以前的画笔 pDC-SelectObject(pOldPen 。 / 删除新的画笔 delete pPenRed。 delete pPe

25、nBlue。 delete pPenGreen。 8) /* WwghWvVhPE 显示函数 功能:显示原图像和处理后的图像 */ asfpsfpi4k void CImageProcess:Show(CDC *pDC, int x, int y, char *pStr ooeyYZTjj1 if (m_lpSrcBit = NULL return。 if (m_lpSrcBit != NULL /显示位图 :SetDIBitsToDevice(pDC-m_hDC, 10, 10, m_nWidth, m_nHeight, 0, 0, 0, m_nHeight, m_lpSrcBit, m_l

26、pBmif, DIB_RGB_COLORS 。 /画直方图 DrawIntensity(pDC, m_lpSrcBit, 0。 if ( m_lpModifyBit1 != NULL :SetDIBitsToDevice(pDC-m_hDC, 20+m_nWidth, 10, m_nWidth, m_nHeight, 16 / 16 0, 0, 0, m_nHeight, m_lpModifyBit1, m_lpBmif, DIB_RGB_COLORS 。 DrawIntensity(pDC, m_lpModifyBit1, 1。 if ( m_lpModifyBit2 != NULL :Se

27、tDIBitsToDevice(pDC-m_hDC, 30+2*m_nWidth, 10, m_nWidth, m_nHeight, 0, 0, 0, m_nHeight, m_lpModifyBit2, m_lpBmif, DIB_RGB_COLORS 。 DrawIntensity(pDC, m_lpModifyBit2, 2。 if ( pStr != NULL pDC-TextOut(x, y, pStr 。 pDC-TextOut(m_nWidth*3/2, m_nHeight+11, m_mes。 pDC-TextOut(m_nWidth*3/2, m_nHeight+25, m_

28、sCodeTime。BkeGuInkxI 9) /保存处理后的图像 void CImageProcess:Save(LPCTSTR lpszPathName, int nType PgdO0sRlMo /* if ( m_lpModifyBit1 = NULL AfxMessageBox(“ 图像还没有处理过不需要保存“。 return 。 */ /根据选择的文件类型来保存 switch(nType case 1: Save24(lpszPathName。 break。 case 2: Save8(lpszPathName。 break。 default: / MessageBox(“未知的文件类型!“ 。 break。 申明: 所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1