图像分割.docx
《图像分割.docx》由会员分享,可在线阅读,更多相关《图像分割.docx(15页珍藏版)》请在冰豆网上搜索。
图像分割
实验四图像分割
一、实验内容:
用Matlab语言、C语言或C++语言编制图像处理软件,并对某幅图像进行阈值分割处理、边缘检测处理、区域分割处理。
二、实验目的和意义:
1.掌握基于阈值选取的图像分割方法
2.掌握基于区域的图像分割方法
3.掌握基于边缘检测的图像分割方法
三、实验原理与主要框架:
3.1实验所用编程环境:
VisualC++6.0(简称VC)
3.2实验处理的对象:
256色的BMP(BITMAP)格式图像
BMP(BITMAP)位图的文件结构:
(如图3.1)
图3.1位图的文件结构
具体组成图:
3.3数字图像基本概念
数字图像是连续图像
的一种近似表示,通常用由采样点的值所组成的矩阵来表示:
每一个采样单元叫做一个像素(pixel),上式(2.1)中,M、N分别为数字图像在横(行)、纵(列)方向上的像素总数。
在计算机内通常用二维数组来表示数字图像的矩阵,把像素按不同的方式进行组织或存储,就得到不同的图像格式,把图像数据存成文件就得到图像文件。
图像文件按其数字图像格式的不同一般具有不同的扩展名。
最常见的图像格式是位图格式,其文件名以BMP为扩展名。
图像数字化的精度包括两部分,即分辨率和颜色深度。
分辨率指图像数字化的空间精细度,有显示分辨率和图像分辨率两种。
数字图像的颜色深度表示每一像素的颜色值所占的二进制位数。
颜色深度越大则能表示的颜色数目越多。
颜色深度的不同,就产生不同种类的图像文件,在计算机中常使用图像文件的类型有单色图像、灰度图像、伪彩色图像和24位真彩色图像。
它们之间的关系取决于数字图像采用的颜色表示法。
常用的颜色表示法有RGB、CMYK、HSL和YUV等。
3.4图像的分割
图像的分割包括基于阈值的分割、基于区域的分割和基于边缘的分割,基本框架(如图3.2)和图像分割菜单设计图(如图3.3)如下:
图3.2图像分割流程图
图3.3bmp图像分割菜单设计图
4、数字图像分割技术:
4.1阈值分割方法
阈值分割方法的历史可追溯到近40年前,现已提出了大量算法,对灰度图像的取阈分割就是先确定一个处于图像灰度取值范围之中的灰度阈值,然后将图像中各个象素的灰度值都与这个阈值相比较,并根据比较结果将对应的象素分为两类。
这两类象素一般分属图像的两类区域,从而达到分割的目的。
从该方法中可以看出,确定一个最优阈值是分割的关键。
现有的大部分算法都是集中在阈值确定的研究上。
阈值分割方法根据图像本身的特点,可分为单阈值分割方法和多阈值分割方法;也可分为基于象素值的阈值分割方法、基于区域性质的阈值分割方法和基于坐标位置的阈值分割方法;若根据分割算法所有的特征或准则,还可以分为直方图与直方图变换法、最大类空间方差法、最小误差法与均匀化误差法、共生矩阵法、最大熵法、简单统计法与局部特性法、概率松驰法、模糊集法、特征空间聚类法、基于过渡区的阈值选取法等。
4.2基于区域的分割方法
区域分割的实质就是把具有某种相似性质的像素连通起来,从而构成最终的分割区域。
它利用了图像的局部空间信息,可有效的克服其它方法存在的图像分割空间不连续的缺点,但它通常会造成图像的过度分割。
在此类方法中,如果从全图出发,按区域属性特征一致的准则,决定每个像元的区域归属,形成区域图,这常称之为区域生长的分割方法;如果从像元出发,按区域属性特征一致的准则,将属性接近的连通像元聚集为区域是区域增长的分割方法;若综合利用上述两种方法,就是分裂—合并的方法。
区域生长法[9]的基本思想是将具有相似性质的象素合起来构成区域,具体做法是选给定图像中要分割的目标物体内的一个小块或者说种子区域,再在种子区域的基础上不断将其周围的象素点以一定的规则加入其中,达到最终将代表该物体的所有象素点结合成一个区域的目的,该方法的关键是要选择合适的生长或相似准则,生长准则一般可分为3种:
基于区域灰度差准则、基于区域内灰度分布统计性质准则和基于区域形状准则。
分裂合并法是先将图像分割成很多的一致性较强的小区域,再按一定的规则将小区域融合成大区域,达到分割图像的目的。
4.3基于边缘的分割方法
这种方法是人们研究得比较多的一种方法,它通过检测图像中不同区域的边缘来达到分割图像的目的。
边缘是图像最基本的特征,它是图像局部特性不连续或突变的结果。
例如,灰度值的突变、颜色的突变、纹理的突变等。
边缘检测方法是利用图像一阶导数的极值或二阶导数的过零点信息来提供判断边缘点的基本依据,经典的边缘检测方法是构造对图像灰度阶跃变化敏感的差分算子来进行图像分割,如Robert算子、Sobel算子、Prewitt算子、Laplace算子等。
根据检测边缘采用方式的不同,边缘检测方法大致包括以下几类:
基于局部图像函数的方法、多尺度方法、图像滤波法、基于反应—扩散方程的方法、多分辨分法、基于边界曲线拟合方法、状态空间搜索法、动态规划法、边界跟踪法、哈夫变换法等。
五、实验内容:
5.1基于阈值分割
5.1.1基于阈值分割算法实现
BOOLWINAPIThresholdTrans(LPSTRlpDIBBits,LONGlWidth,LONGlHeight,BYTEbThre)
{
//指向源图像的指针
unsignedchar*lpSrc;
//循环变量
LONGi;
LONGj;
//图像每行的字节数
LONGlLineBytes;
//计算图像每行的字节数
lLineBytes=WIDTHBYTES(lWidth*8);
//每行
for(i=0;i{//每列for(j=0;j{//指向DIB第i行,第j个象素的指针lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;//判断是否小于阈值if((*lpSrc){//直接赋值为0*lpSrc=0;}else{//直接赋值为255*lpSrc=255;}}}//返回returnTRUE;}5.2基于边缘分割5.2.1Robert边缘检测运算算法实现voidCEdgeContourView::OnEdgeRobert(){//Robert边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用RobertDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->RobertDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.2Sober边缘检测运算算法实现voidCEdgeContourView::OnEdgeSobel(){//Sobel边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用SobelDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->SobelDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.3Prewitt边缘检测运算算法实现voidCEdgeContourView::OnEdgePrewitt(){//Prewitt边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用PrewittDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->PrewittDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.4Kirsch边缘检测运算算法实现voidCEdgeContourView::OnEdgeKirsch(){//Kirsch边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用KirschDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->KirschDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.5Gauss边缘检测运算算法实现voidCEdgeContourView::OnEdgeGauss(){//Gauss边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用GaussDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->GaussDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}六、实验结果:图6.1位图图像“原始lena图像”6.1基于阈值分割结果图6.2基于阈值分割运行结果6.2基于边缘分割结果图6.3Robert算法图6.4Sober算法图6.5Prewitt算法图6.6Kirsch算法图6.3Gauss-Laplace算法 七、总结与体会:图像分割是数字图像处理中的关键技术之一,是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,选择一种合适的图像分割方法,很大程度上取决于要处理的图像类型和应用的领域,至今还没有哪一种图像分割算法是通用的。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。
//每列
for(j=0;j{//指向DIB第i行,第j个象素的指针lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;//判断是否小于阈值if((*lpSrc){//直接赋值为0*lpSrc=0;}else{//直接赋值为255*lpSrc=255;}}}//返回returnTRUE;}5.2基于边缘分割5.2.1Robert边缘检测运算算法实现voidCEdgeContourView::OnEdgeRobert(){//Robert边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用RobertDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->RobertDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.2Sober边缘检测运算算法实现voidCEdgeContourView::OnEdgeSobel(){//Sobel边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用SobelDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->SobelDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.3Prewitt边缘检测运算算法实现voidCEdgeContourView::OnEdgePrewitt(){//Prewitt边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用PrewittDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->PrewittDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.4Kirsch边缘检测运算算法实现voidCEdgeContourView::OnEdgeKirsch(){//Kirsch边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用KirschDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->KirschDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.5Gauss边缘检测运算算法实现voidCEdgeContourView::OnEdgeGauss(){//Gauss边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用GaussDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->GaussDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}六、实验结果:图6.1位图图像“原始lena图像”6.1基于阈值分割结果图6.2基于阈值分割运行结果6.2基于边缘分割结果图6.3Robert算法图6.4Sober算法图6.5Prewitt算法图6.6Kirsch算法图6.3Gauss-Laplace算法 七、总结与体会:图像分割是数字图像处理中的关键技术之一,是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,选择一种合适的图像分割方法,很大程度上取决于要处理的图像类型和应用的领域,至今还没有哪一种图像分割算法是通用的。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。
//指向DIB第i行,第j个象素的指针
lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
//判断是否小于阈值
if((*lpSrc){//直接赋值为0*lpSrc=0;}else{//直接赋值为255*lpSrc=255;}}}//返回returnTRUE;}5.2基于边缘分割5.2.1Robert边缘检测运算算法实现voidCEdgeContourView::OnEdgeRobert(){//Robert边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用RobertDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->RobertDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.2Sober边缘检测运算算法实现voidCEdgeContourView::OnEdgeSobel(){//Sobel边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用SobelDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->SobelDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.3Prewitt边缘检测运算算法实现voidCEdgeContourView::OnEdgePrewitt(){//Prewitt边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用PrewittDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->PrewittDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.4Kirsch边缘检测运算算法实现voidCEdgeContourView::OnEdgeKirsch(){//Kirsch边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用KirschDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->KirschDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}5.2.5Gauss边缘检测运算算法实现voidCEdgeContourView::OnEdgeGauss(){//Gauss边缘检测运算CEdgeContourDoc*pDoc=GetDocument();LPSTRlpDIB;//指向DIB的指针LPSTRlpDIBBits;//指向DIB象素指针lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!=256){MessageBox("目前只支持256色位图的运算!","系统提示",MB_ICONINFORMATION|MB_OK);::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());return;}BeginWaitCursor();//找到DIB图像象素起始位置lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);//调用GaussDIB()函数对DIB进行边缘检测if(pDoc->GetDibImage()->GaussDIB(lpDIBBits,WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),pDoc->GetDibImage()->DIBHeight(lpDIB))){pDoc->SetModifiedFlag(TRUE);//设置脏标记pDoc->UpdateAllViews(NULL);//更新视图}else{MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());EndWaitCursor();}六、实验结果:图6.1位图图像“原始lena图像”6.1基于阈值分割结果图6.2基于阈值分割运行结果6.2基于边缘分割结果图6.3Robert算法图6.4Sober算法图6.5Prewitt算法图6.6Kirsch算法图6.3Gauss-Laplace算法 七、总结与体会:图像分割是数字图像处理中的关键技术之一,是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,选择一种合适的图像分割方法,很大程度上取决于要处理的图像类型和应用的领域,至今还没有哪一种图像分割算法是通用的。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。
//直接赋值为0
*lpSrc=0;
}
else
//直接赋值为255
*lpSrc=255;
//返回
returnTRUE;
5.2基于边缘分割
5.2.1Robert边缘检测运算算法实现
voidCEdgeContourView:
:
OnEdgeRobert()
//Robert边缘检测运算
CEdgeContourDoc*pDoc=GetDocument();
LPSTRlpDIB;//指向DIB的指针
LPSTRlpDIBBits;//指向DIB象素指针
lpDIB=(LPSTR):
GlobalLock((HGLOBAL)pDoc->GetHDIB());
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推)
if(pDoc->GetDibImage()->DIBNumColors(lpDIB)!
=256)
MessageBox("目前只支持256色位图的运算!
","系统提示",
MB_ICONINFORMATION|MB_OK);
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
return;
BeginWaitCursor();
//找到DIB图像象素起始位置
lpDIBBits=pDoc->GetDibImage()->FindDIBBits(lpDIB);
//调用RobertDIB()函数对DIB进行边缘检测
if(pDoc->GetDibImage()->RobertDIB(lpDIBBits,
WIDTHBYTES(pDoc->GetDibImage()->DIBWidth(lpDIB)*8),
pDoc->GetDibImage()->DIBHeight(lpDIB)))
pDoc->SetModifiedFlag(TRUE);//设置脏标记
pDoc->UpdateAllViews(NULL);//更新视图
MessageBox("分配内存失败!
","系统提示",MB_ICONINFORMATION|MB_OK);
EndWaitCursor();
5.2.2Sober边缘检测运算算法实现
OnEdgeSobel()
//Sobel边缘检测运算
//调用SobelDIB()函数对DIB进行边缘检测
if(pDoc->GetDibImage()->SobelDIB(lpDIBBits,
5.2.3Prewitt边缘检测运算算法实现
OnEdgePrewitt()
//Prewitt边缘检测运算
//调用PrewittDIB()函数对DIB进行边缘检测
if(pDoc->GetDibImage()->PrewittDIB(lpDIBBits,
5.2.4Kirsch边缘检测运算算法实现
OnEdgeKirsch()
//Kirsch边缘检测运算
//调用KirschDIB()函数对DIB进行边缘检测
if(pDoc->GetDibImage()->KirschDIB(lpDIBBits,
5.2.5Gauss边缘检测运算算法实现
OnEdgeGauss()
//Gauss边缘检测运算
//调用GaussDIB()函数对DIB进行边缘检测
if(pDoc->GetDibImage()->GaussDIB(lpDIBBits,
六、实验结果:
图6.1位图图像“原始lena图像”
6.1基于阈值分割结果
图6.2基于阈值分割运行结果
6.2基于边缘分割结果
图6.3Robert算法图6.4Sober算法
图6.5Prewitt算法图6.6Kirsch算法
图6.3Gauss-Laplace算法
七、总结与体会:
图像分割是数字图像处理中的关键技术之一,是进一步进行图像识别、分析和理解的基础。
虽然目前已研究出不少边缘提取、区域分割的方法,选择一种合适的图像分割方法,很大程度上取决于要处理的图像类型和应用的领域,至今还没有哪一种图像分割算法是通用的。
因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1