一种自动裁剪眼底图像的方法、装置及其可读存储介质与流程

文档序号:13686516阅读:287来源:国知局
一种自动裁剪眼底图像的方法、装置及其可读存储介质与流程

本发明涉及图像处理领域,具体涉及一种自动裁剪眼底图像的方法、装置及其可读存储介质。



背景技术:

眼底图像是使用眼底照相机对眼球内壁从不同的角度进行拍摄得到的图像,眼底图像是眼科诊断中最重要的依据之一,在诊断糖尿病视网膜病变、青光眼、白内障等常见眼科疾病的过程中起到非常关键的作用,当前针对眼底图像的计算机自动诊断系统发展很快,其中一些系统诊断的准确率已经达到甚至超过人类的专家医生,例如gwenolequellec等人开发的眼科病理检查系统(themessidorsystemoreyepathologyscreening),美国google公司研制的自动诊断糖尿病视网膜病变的系统。

这些计算机自动诊断系统都是基于ai(artificialintelligence人工智能)的深度神经网络,眼底图像在进入深度神经网络之前都要先进行图像预处理,预处理的一个重要功能是对输入图像进行裁剪。眼底图像的分辨率很高,例如宽2600高1900像素,而深度神经网络的输入很小,例如最常用的模型alexnet、vgg、googlenet输入像素是224,googleinception-v3、inception-v4、resnet-v2输入像素是299,即使是针对医疗影像定制的神经网络模型其输入一般也小于512,原因是输入数据大的话计算量太大,并且输入数据大导致参数增多更容易产生过拟合。一些视网膜病变在眼底图像上的表现特征非常细微,例如软性渗出物、出血点等,特别是一些细小出血点即使在原始图像上也只有几个像素,因此在图像像素大小一定的条件下尽可能提高图像有价值区域的分辨率非常重要。

视网膜区域的边缘和图像背景对于诊断眼科疾病没有贡献,反而会干扰深度神经网络的自动特征提取,许多眼底图像的视网膜边界有明显的光晕,边界区域包含非常丰富的图像特征,理论上图像的背景区域应该是完全的黑色rgb(0,0,0),但是实际上背景会有噪声,这些无关特征都会对深度神经网络的自动特征提取产生干扰,因此最好能够屏蔽视网膜的边缘区域和图像背景。

现有的图像裁剪方法是使用一次霍夫变换提取出一个视网膜边界的圆,然后裁剪出包含这个圆的最小外接矩形。这种做法的缺点是如果眼底图像的质量比较差,则无法正确检测出的视网膜区域的边界,其次没有屏蔽和裁剪掉视网膜的边缘区域以及图像背景,此外该方法不能评价输入图像的质量。



技术实现要素:

本发明实施例所要解决的技术问题在于,提供一种自动裁剪眼底图像的方法。能够处理质量很差的眼底图像,能够屏蔽视网膜的边缘区域和图像背景,并且能够给对眼底图像的质量给出一个评价数值。

为了解决上述技术问题,本发明实施例提供了一种自动裁剪眼底图像的方法,包括以下步骤:

使用霍夫变换检测视网膜边界的圆,如果因为图像质量太差霍夫变换无法正确检测到视网膜的边界,则将图像中心点设置为圆心,通过统计图像水平中线像素值分布的方式确定圆的半径,然后在原图像中以该圆心为圆心,小于该半径值画一个内圆,内圆内的像素值保持不变,内圆外的像素值用一个常量替代,然后切割出包含该内圆的最小矩形。

进一步地,还包括以下步骤:

将原始图像转换为灰度图像,从难到易依次使用不同的霍夫变换参数检测灰度图像中是否存在直径约等于原图像最小边长的唯一的圆,如果某次检测到则停止检测,记录下圆心和半径,返回当前的霍夫变换参数所对应的图像质量的评判指标;如果某次霍夫变换检测到多个圆或者霍夫变换参数已经降低到预先设置的最低值仍然检测不到则退出。

更进一步地,还包括以下步骤:

霍夫变换的参数设置为最小半径是原图像最小边长的0.35倍,最大半径是原图像最小边的0.65倍,最初设置参数canny中的高阈值为150,累加器的阀值设置为80,对应图像质量分值为1,霍夫变换的最低条件是canny中的高阈值降低到50,累加器的阀值降低到40,对应图像质量分值是0.7;如果霍夫变换检测不到视网膜边界,则将图像质量分值设置为0.4。

更进一步地,还包括以下步骤:

如果霍夫变换检测不到视网膜的边界,则将图像的中心作为圆心,计算灰度图像水平中线的像素平均值,然后统计灰度图像的水平中线中像素值大于该均值1/10的像素数,将这个数目除以2得到圆的半径。

更进一步地,所述内圆的半径为检测到圆的半径值的0.88-0.96倍。

实施本发明实施例,具有如下有益效果:本发明能够处理质量很差的眼底图像,能够屏蔽视网膜的边缘区域和图像背景,并且能够给对眼底图像的质量给出一个评价数值。本方法不需要经过学习过程,也不需要手工调整参数,能够直接运行,运行速度极快。

附图说明

图1是本发明方法的算法流程图;

图2是眼底图像;

图3是顶部和底部被切割掉一部分的眼底图像;

图4是质量比较差的眼底图像;

图5是自动裁剪后的眼底图像。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述。

本发明实施例的一种自动裁剪眼底图像的方法,如图1所示。

由于眼底图像的分辨率高,例如宽2600高1900像素,眼底图像的特征是图像中央是圆形的视网膜区域,该圆有可能被切割,圆形边缘向外凸起有一个很小的矩形标识相机拍摄的角度,背景是黑色,视网膜区域内有高亮的视盘,视盘内有视杯,此外还有黄斑,血管等结构,如图2所示。一些眼底图像的视网膜区域会被切割掉一部分,例如图3所示。

本发明首先从难到易使用霍夫变换检测视网膜边界的圆,并根据所用霍夫变换参数生成图像质量参数,如果图像质量很差使用霍夫变换检测不到,则根据水平中线的像素值分布推断视网膜的圆,并且返回图像质量的评价参数,然后屏蔽圆的边缘和外部区域,最后裁剪出包含视网膜区域的最小矩形。

首先将原始图像转换为灰度图像,从难到易依次使用不同的霍夫变换参数检测灰度图像中是否存在直径约等于原图像最小边长的唯一的圆,如果某次检测到则停止检测,记录下圆心和半径,返回当前的霍夫变换参数所对应的图像质量的评判指标。如果某次霍夫变换检测到多个圆或者霍夫变换参数已经降低到预先设置的最低值仍然检测不到圆则退出。

使用python+numpy+opencv进行图像处理编程,将输入图像转换为灰度图像的代码如下:

img_gray=cv2.cvtcolor(img_original,cv2.color_bgr2gray)。

霍夫变换的参数设置最小半径是原始图像最小边长的0.35倍,最大半径是原始图像最小边的0.65倍,霍夫变换初始参数设置如下:canny中的高阈值设置为150,累加器的阀值设置为80,对应图像质量分值1,霍夫变换最低条件设置如下:canny中的高阈值是50,累加器的阀值是到40,对应图像质量分值0.7。如果霍夫变换检测不到视网膜边界,则图像质量分值设置为0.4。

在opencv中图像用numpy多维数组表示,图像的高是img.shape[0],图像的宽是img.shape[1],图像的最短边长是min_width_height=min(img.shape[0],img.shape[1]),设置检测圆的最小半径minradius=int(min_width_height*0.35),最大半径maxradius=int(min_width_height*0.65),使用霍夫变换检测圆的代码是:circles=cv2.houghcircles(gray,cv2.hough_gradient,1.2,450,param1=150,param2=80,minradius=minradius,maxradius=maxradius)

如果检测到了唯一圆则circlesisnotnone==ture并且len(circles)==1。

有些眼底图像质量非常差,视网膜的边界非常模糊,如图4所示。对于这类图像会出现霍夫变换检测到多个圆,或者当霍夫变换参数降低到预先设置的最低值仍然检测不到圆,因此必须用其他方法确定视网膜区域的范围。

假设视网膜位于图像的中央(绝大多数偏差极小),假设视网膜区域在水平方向上没有被裁减(该假设基本百分之百成立),根据这些假设,图像的中心就是视网膜的圆心,由于视网膜区域像素值比较高,背景的像素值很低,还假设图像水平中线中像素值大于该中线均值1/10的区域都是视网膜的区域(一般情况下该假设和实际偏差不大),下面依据这些假设确定视网膜区域的圆心和半径。

由于python语言本身和c/c++相比性能比较差,但是python使用numpy、opencv是执行c/c++编译优化的代码,性能很高,所以不使用python语句去循环每一个像素,而是使用opencv的图像变换和numpy的矩阵运算。

图像中心的坐标是:img.shape[0]/2,img.shape[1]/2,图像的水平中线在opencv中用numpy数组表示是img[int(img.shape[0]/2),:,:],水平中线的像素求和是img[int(img.shape[0]/2),:,:].sum(1),由此推算视网膜区域的半径是:int((x>x.mean()/10).sum()/2)。

视网膜区域的边缘和背景对于诊断眼科疾病都没有用处,甚至会对深度神经网络自动特征提取带来干扰,许多眼底图像视网膜的边缘有明显的光晕,边缘区域包含非常丰富的图像特征,此外理论上图像的背景区域应该是完全的黑色rgb(0,0,0),但是实际上背景会有噪声,这些都会对深度神经网络自动提取特征产生干扰,因此需要屏蔽视网膜的边缘区域和图像背景。

检测到视网膜的圆心和半径后,在原始图像中以该圆心为圆心,略小于该半径值画一个内圆,内圆的半径为半径值的0.88-0.96倍(通常选0.92),内圆内的像素值保持不变,内圆外的像素值用一个常量替代,然后切割出包含该内圆的最小矩形。

下面用代码描述具体实现方法:首先创建一个和原图像大小一样,像素值都是0的空图像,代码是img1=np.zeros((original_height,original_width,3)),在空图像上画一个半径为检测到圆的半径值的0.88-0.96倍(通常选0.92)的圆,圈向内用rgb(1,1,1)像素值填充,代码是cv2.circle(img1,(x,y),int(r*0.92),(1,1,1),-(r),1),然后将原图像和处理后的图像相乘,实现原始图像内圆内的像素值不变,内圆外的像素值为0,代码是img_new=img_original*img1

从原始图像中裁剪包含内圆的最小外接矩形,切割出包含该内圆的最小矩形,可以适当保留边界空白,空白像素为原始图像尺寸的0.2-1%。

计算需要保留边界空白的像素值

padding_ratio=0.01

img_padding=min(original_height,original_width)*padding_ratio

由于原始图像本身可能已经裁剪掉了一部分视网膜区域,需要考虑数据越界,所以需要和图像的原始尺寸相比较。

计算剪切图像的位置坐标:

image_left=int(max(0,x-r*0.92-img_padding));

image_right=int(min(x+r*0.92+img_padding,original_width-1))

image_bottom=int(max(0,y-r*0.92-img_padding));

image_top=int(min(y+r*0.92+img_padding,original_height-1))

实现剪切图像:

img_output=img_new[image_bottom:image_top,image_left:image_right

保存文件cv2.imwrite('/tmp/out1.png',img_output)

图5是图2的图像经过自动裁剪后的结果。

本发明具有如下优点:

1:本发明能够给图像一个质量评价指标

首先将原始图像转换为灰度图像,从难到易依次使用不同的霍夫变换参数检测灰度图像中是否存在直径约等于原图像最小边长的唯一的圆,如果某次检测到则停止检测,返回当前的霍夫变换参数所对应的图像质量的评判指标。

2:能够处理质量很差的眼底图像

技术手段:如果霍夫变换检测不到视网膜的边界,则将图像的中心作为圆心,计算灰度图像水平中线的像素平均值,然后统计灰度图像的水平中线中像素值大于该均值1/10的像素数,将这个数目除以2得到圆的半径。

3:屏蔽视网膜边缘区域和图像背景,减少了无关特征对于深度神经网络自动特征提取的干扰

技术手段:然后在原图像中以该圆心为圆心,略小于该半径值画一个内圆,内圆内的像素值保持不变,内圆外的像素值用一个常量替代,然后切割出包含该内圆的最小矩形。

以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1