基于自适应阈值的视网膜图像分割及其程序设计毕业设计论文(编辑修改稿)内容摘要:

+ 为开发平 台,以 CxImage 图像处理库为开发工具,设计并实现了相关算法。 上述核心算法的描述和代码如下: 固定阈值 本算法先选固定阈值为全局像素值的平均值,即先对全局像素值求和为 Tp,并记录像素个数 C,然后再求得全局像素均值 cTpAp 为固定阈值,最后遍历整图中的像素值与固定阈值进行比较并重新赋值进行显示。 void CDemoDoc::OnCximage_YBBCT() { // 在这里开始添加自己的命令代码 if (image==NULL) return。 /*如果没有读取到图像,返回 */ long w, h, x, y。 /*w 为图像的宽度, h 为图像的高度, x 为像素的横坐标, y为像素的纵坐标 */ int c=0。 double v=0。 w = imageGetWidth()。 /*读取图像的宽度 */ h = imageGetHeight()。 /*读取图像的高度 */ imageGrayScale()。 /*把图像转换为灰度图 */ BYTE *thd_img。 /*建立图像数据的 指针 */ thd_img = (BYTE *)malloc((w)*(h)*sizeof(BYTE))。 /*给图像分配内存 */ for (y = 0。 y h。 y++) /*对图像的高度 h 开始遍历 */ { 宁波工程学院本科毕业设计论文 11 for (x =0。 x w。 x++) /*对图像的宽度 w 开始遍历 */ { v+= imageGetPixelIndex(x,y)。 c++。 } } v/=c。 if(imageGetPixelIndex(x,y)=(BYTE)v) /*跟所求阈值进 行比较并赋值 */ thd_img[y*w+x]=255。 else thd_img[y*w+x]=0。 imageSetPixelIndex(x,y,(BYTE)thd_img[y*w+x])。 /*对所得的像素点进行显示 */ } } free(thd_img)。 /*释放指针 */ } 自适应阈值 本算法先对每个像素选取一个大小为 18*18 的邻域,然后针对每一个邻域求出它相应的均值,即 118*18 1118*181  iPiAt 为自适应阈值,然后针 对该邻域中的每个像素的值与该邻域的阈值进行比较并重新赋值,依次遍历整图,最后对所得的像素点进行显示。 void CDemoDoc::OnCximage_YBBAT() { //在这里开始添加自己的命令代码 if (image==NULL) return。 /*如果没有读取到图像,返回 */ long w, h, x, y。 /*w 为图像的宽度, h 为图像的高度, x 为像素的横坐标, y宁波工程学院本科毕业设计论文 12 为像素的纵坐标 */ int k, l, c。 /*k 表示所取子领域的宽度, l 为所取子领域的高度, c 作为灰度值的和加总 */ double v。 /*v 为所求灰度的均值 */ w = imageGetWidth()。 /*读取图像的宽度 */ h = imageGetHeight()。 /*读取图像的高度 */ imageGrayScale()。 /*把图像转换为灰度图 */ BYTE *thd_img。 /*建立图像数据的指针 */ thd_img = (BYTE *)malloc((w)*(h)*sizeof(BYTE))。 /*给图像分配内存 */ for (y = 0。 y h。 y++) /*对图像的高度 h 开始遍历 */ { for (x =0。 x w。 x++) /*对图像的宽度 w 开始遍历 */ { v =0。 /*对变量 v 赋初值 0*/ c =0。 /*对变量 c 赋初值 0*/ for (l=9。 l10。 l++) /*对邻域的高度 l 开始遍历 */ { for(k=9。 k10。 k++) /*对邻域的宽度 k 开始遍历 */ { if((y+l)=0amp。 amp。 (y+l)hamp。 amp。 (x+k)=0amp。 amp。 (x+k)w) /*像素点的坐标要满足在图像内 */ { v+= imageGetPixelIndex(x+k,y+l)。 c++。 } } } v/=c。 if(imageGetPixelIndex(x,y)=(BYTE)v) /*跟所求阈值进行比较并赋值 */ thd_img[y*w+x]=255。 宁波工程学院本科毕业设计论文 13 else thd_img[y*w+x]=0。 } } for (y = 0。 y h。 y++) { for (x =0。 x w。 x++) { imageSetPixelIndex(x,y,(BYTE)thd_img[y*w+x])。 /*对所得的像素点进行显示 */ } } free(thd_img)。 /*释放指针 */ } Canny 算子 本算法先是利用高斯函数对图像进行平滑,去除图像中的噪声,并产生一个一维高斯分布函数,在高斯平滑函数中生成高斯滤波函系数 [7],然后采用二阶范数计算梯度,抑制局部像素非最大梯度点,根据梯度计算及经过非最大值抑制后的结果设定阈值,再利用函数寻找边界的起点,最后用 Hysteresis[2]执行的结果,从一个像素点开始进行搜索,搜索以该像素为边界起点的一条边界所有的边界点。 void Canny(unsigned char *pUnchImage, int nWidth, int nHeight, double sigma, double dRatioLow, double dRatioHigh, unsigned char *pUnchEdge) { unsigned char * pUnchSmooth。 /*经过高斯滤波后的图像数据 */ int * pnGradX。 /*指向 x 方向导数的指针 */ int * pnGradY。 /*指向 y 方向导数的指针 */ int * pnGradMag。 /*梯度的幅度 */ pUnchSmooth = new unsigned char[nWidth*nHeight]。 pnGradX = new int [nWidth*nHeight]。 宁波工程学院本科毕业设计论文 14 pnGradY = new int [nWidth*nHeight]。 pnGradMag = new int [nWidth*nHeight]。 GaussianSmooth(pUnchImage, nWidth, nHeight, sigma, pUnchSmooth)。 /*对原图像进行滤波 */ DirGrad(pUnchSmooth, nWidth, nHeight, pnGradX, pnGradY)。 /*计算方向导数 */ GradMagnitude(pnGradX, pnGradY, nWidth, nHeight, pnGradMag)。 /*计算梯度的幅度 */ NonmaxSuppress(pnGradMag, pnGradX, pnGradY, nWidth, nHeight, pUnchEdge)。 /*应用 nonmaximum 抑制 */ Hysteresis(pnGradMag, nWidth, nHeight, dRatioLow, dRatioHigh, pUnchEdge)。 /*应用 Hysteresis,找到所有的边界 */ delete pnGradX。 pnGradX = NULL。 delete pnGradY。 pnGradY = NULL。 delete pnGradMag。 pnGradMag = NULL。 delete pUnchSmooth。 pUnchSmooth = NULL。 } void CImageProcessingView::OnEdgeCanny() { CImageProcessingDoc*pDoc=(CImageProcessingDoc*)thisGetDocument()。 CDib * pDib = pDocm_pDibInit。 LPBITMAPINFOHEADER lpBMIH=pDibm_lpBMIH。 if (lpBMIHbiBitCount != 8) /*判断是否是 8bpp 位图 */ { MessageBox(目前只支持 256 色位图的图像分割。 , 系统提示 , MB_ICONINFORMATION | MB_OK)。 /*提示用户 */ 宁波工程学院本科毕业设计论文 15 return。 } int y。 int x。 CSize sizeImage = pDibGetDimensions()。 /*获得图像的大小 */ int nWidth =。 int nHeight=。 int nSaveWidth = pDibGetDibSaveDim().cx。 unsigned char * pUnchImage = new unsigned char[nWidth*nHeight]。 /*开辟内存,存储图像数据 */ for(y=0。 ynHeight。 y++) { for(x=0。 xnWidth。 x++) { pUnchImage[y*nWidth+x] = pDibm_lpImage[y*nSaveWidth+x]。 } } unsigned char * pUnchEdge = new unsigned char[nWidth*nHeight]。 /* canny 算子计算后的结果 */ Canny(pUnchImage, nWidth, nHeight, , , , pUnchEdge)。 /*调用 canny 函数进行边界提取 */ for(y=0。 ynHeight。 y++) { for(x=0。 xnWidth。 x++) { pDibm_lpImage[y*nWidth+x]=(unsigned char)(255pUnchEdge[y*nWidth+x])。 } } delete []pUnchImage。 宁波工程学院本科毕业设计论文 16 pUnchImage = NULL。 delete []pUnchEdge。 pUnchEdge = NULL。 EndWaitCursor()。 Invalidate()。 } 实验结果 本节给出了几幅主要的视网膜图像分割的测试结果:图 4 为原始图,图 5 为所转换成的 256 级灰度图,图 6 为用固定阈 值进行的视网膜图像分割,图 7 至图11 为选取了各种大小的子邻域对视网膜图像分别进行的分割测试。 图 12 为用canny 算子所进行的边缘检测分割,用此与自适应阈值分割来进行对比。 图 4 所要测试的原图 宁波工程学院本科毕业设计论文 17 图 5 转换成的 256级灰度图 图 6 固定阈值分割 图 7 邻域为 3x3的自适应阈值分割 图 8 邻域为 5x5的自适应阈值分割 宁波工程学院本科毕业设计论文 18 图 9 邻域为 9x9的自适应阈值分割 图 10邻域为 15x15的自适应阈值分割 图 11邻域为 23x23的自适应阈值分割 宁波工程学院本科毕业设计论文 19 图 12 canny 算子所进行的边缘检测分割 性能 分析 通过 节的图 4 至图 12 可以验证本课题的可行性。  图 6 的固定阈值分割结果只显示了一个眼球的整体轮廓,由此可见这种固定阈值的分割法显然无法从事繁琐的视网膜图像分割,用于精确的血管分割便。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。