基于自适应阈值的视网膜图像分割及其程序设计毕业设计论文(编辑修改稿)内容摘要:
+ 为开发平 台,以 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 的固定阈值分割结果只显示了一个眼球的整体轮廓,由此可见这种固定阈值的分割法显然无法从事繁琐的视网膜图像分割,用于精确的血管分割便。基于自适应阈值的视网膜图像分割及其程序设计毕业设计论文(编辑修改稿)
相关推荐
(自变量)框中 ,把 y 移入 Dependent (因变量)框中 / Continue ; Statistics / Regression Coefficients/ Estimates、 Model fit/ DurbinWatson、 Casewise diagnostics、 Outliers outside,并在后面的方框中改为 2,即大于两个标准差单位的观测值就认为是异常值。
温度测量范围从 55℃ ~+125℃ , 10~+85℃ 时测量精度为 177。 ℃ ,测量分辨率为 ℃ ,电源电压范围从 ~5V。 它支持 “一线总线 ”的数字方式传输,可组建传感器网络。 而且,无需进行线性校正,使用非常方便 并且 成本低。 与传统的热敏电阻温度传感器不同 之处在于 它能够直接读出被测温度,并且可根据实际要求通过简单的编程实现 9~12 位 数字显示 ,可以分别在
对实验数据进行实时显示、记录、分析处理。 虚拟仪器的出现是仪器发展史上的一场革命,代表着仪器发展的最新趋势和新方向,并且是信息技 术的重要领域扩充,对科学技术的发展和工业生产将产生不可估量的影响。 虚拟仪器的开发软件 虚拟仪器的开发语言 虚拟仪器系统的开发语言有:标准 C, Visual C++ , Visual Basic 等通用程序开发语言。 但直接由这些语言开发虚拟仪器系统,是有相当难度的
我们的设计更方便。 4 第三章 系统的硬件设计 总体方案设计思想 本系统为简易蓝牙遥控系统,要在有效范围内(最少 5米)实现无线蓝牙的接收和发送,遥控对象为 4个( LED),使用 的晶振,以及 89C52 单片机进行程序的控制,我的毕业设计设计主要有两部分组成,一部分是起接受功能的,而另外的部分是发送部分。 提供的 电源为。 当发送设备进行语音控制时,在接收设备上会收到对应 LED 点亮的现象
景图像的获取 [ 9]。 但是获取背景图像的时时获取与更新 仅仅是理想实验条件下的理论 ,并不能很好地适应实际使用 , 但 由于背景图像 具有时变性 , 所以 需要 进 行背景重建,即通过视频 流 中的 帧间信息估计 与 恢复背景, 故需 选择性地进行背景更新 [ 10]。 帧间差分法( Frame difference method) , 一种 运动目标检测方法 ,通过检测视频流中的相邻两帧
毕业设计(论文) 4 分类算法研究 :在理解算法原理的基础上运用算法,实现算法功能并分析比较算法性能。 智能图像分析软件实现 : 系统以 MatLab 为平台,通过用户界面形式实现了基于聚类的智能图像分类软件,具有建立根据现有图库训练网络、对任一图像实现分类并以图文结合方式展现分类结果等功能。 系统方案 论文以水果图像的分类为目标,通过图像的预处理、特征提取与分类,基于