kaggle aptos2019 的图像预处理

  • kaggle aptos2019 的图像预处理
    • 图像预处理
      • 1. 基于眼球的resize: scaleRadius()
      • 2. 特征增强
      • 3. 去除眼球周围部分
  • 不做图像预处理
  • 参考

kaggle aptos2019 的图像预处理

APTOS全称Asia Pacific Tele-Ophthalmology Society (APTOS) Symposium。训练和测试样本图片由印度Aravind Eye Hospital为了筛查农村人口的病情所得。

aptos2019 竞赛的目的是分析糖尿病造成的视网膜病变(diabetic retinopathy)的严重程度,正常为0,最差为4,疾病严重的可致盲。所以此项研究旨在利用人工智能方法尽早诊断糖尿视网膜病变,避免病情恶化。
kaggle链接如下:
https://www.kaggle.com/c/aptos2019-blindness-detection/overview

眼底照片如下:

图像预处理

由于图像实际拍摄的时间、地点、设备、操作人员不同,所以尺寸,颜色、亮度也各不相同。正所谓垃圾进,垃圾出。直接对原图进行训练增加训练的难度,不容易找到病变的特征。

一般的计算机视觉处理都会进行图像预处理。在aptos2019竞赛的kaggle社区notekooks中,看到最多的一种图像增强方法是Ben Graham提出的。他是aptos2015年的糖尿病视网膜病变竞赛的冠军,由于2019年的竞赛图像也是相似的,所以很多人都延用他的预处理方法。

方法分为以下3步

  1. rescale the images to have the same radius (300 pixels or 500 pixels),
  2. subtracted the local average color; the local average gets mapped to 50% gray,
  3. clipped the images to 90% size to remove the “boundary effects”.

python 代码如下:

import cv2 , glob , numpy
# 输出图像的眼球半径都为1*scale个像素
def scaleRadius(img,scale):x = img[int(img.shape[0]/2),:,:].sum(1) # 图像中间1行的像素的3个通道求和。输出(width*1)r = (x>x.mean()/10).sum()/2 # x均值/10的像素是为眼球,计算半径s = scale*1.0/rreturn cv2.resize(img,(0,0),fx=s,fy=s)# 输出长宽 为 原长宽*scale/r = (原长宽/r)*scale。# 那么,输出图像的眼球半径都为1*scale个像素。scale = 300
for f in glob.glob ("train/∗. jpeg")+ glob . glob ("test/∗.jpeg"):try :a=cv2.imread(f)#scale img to a given radiusa=scaleRadius(a, scale)#subtract local mean colora=cv2.addWeighted(a,4,cv2.GaussianBlur(a,(0,0),scale/30),−4,128)#remove out er 10%b = numpy.zeros(a.shape)cv2.circle(b,(a.shape[1]/2, a.shape[0]/2 ),int(scale ∗ 0.9),(1, 1, 1), −1, 8, 0)a = a∗b+128∗(1−b)cv2.imwrite(str(scale) +"_" +f, a)except:print(f)

1. 基于眼球的resize: scaleRadius()

因为不同图片长宽比不同,且眼球外围黑边宽度各不相同,所以resize不能以整个图像的尺寸为准。因此,以眼球半径为基准,resize图片。

  • 取高度正中间一行(图片基本上下对称;垂直方向眼球可能会被裁剪,但水平方向的眼球基本都完整。),并计算3个通道的和,得到x
  • 计算x大于(x均值/10)的像素个数,作为直径,除以2得到半径r。
  • 计算的到一个参数s = scale / r。scale是给定的参数,代表你想要的眼球半径。
  • 计算 cv2.resize(img,(0,0),fx=s,fy=s)。这里把输出长宽设为(0,0),函数会通过fx和fy计算输出长宽,公式为img.width * s, img.height.s。而s=scale/r,那么输出长宽=原长宽*scale/r = (原长宽/r)*scale。可见眼球的半径被=1了,在乘以scale。

2. 特征增强

第二步是关键的一步,使得不同图像显示效果更加一致,同时凸显特征。
核心在于这一句,cv2.addWeighted(a,4, cv2.GaussianBlur(a,(0,0),scale/30),−4,128)。

cv2.addWeighted的公式=a4+高斯模糊结果-4+128。过程中函数会做saturate_cast避免数据溢出。cv2.GaussianBlur(a,(0,0),scale/30)中,kernel大小设置为(0, 0),意思是根据x方向上的标准差scale/30来计算。

处理的原理是:(原图-高斯模糊图) 得到差异。高斯模糊图是作者说的local area average color,相当于背景,原图-背景=特征,从而增强了图像。

3. 去除眼球周围部分

不做图像预处理

从15年到19年,深度学习有了进一步的发展。我看了一下19年竞赛的冠亚军的方案,都没有使用图像预处理。他们的提到原因是,发现做不做预处理对结果没有影响。

可以理解为网络设计到位了,预处理的功能直接在网络中学习到了,那么自然就不用单独进行预处理,直接实现end to end。

参考

  • https://github.com/btgraham/SparseConvNet/tree/kaggle_Diabetic_Retinopathy_competition
  • https://www.kaggle.com/ratthachat/aptos-eye-preprocessing-in-diabetic-retinopathy

kaggle aptos2019 的图像预处理相关推荐

  1. 一阶微分算子锐化图像_【动手学计算机视觉】第三讲:图像预处理之图像分割...

    本讲完整代码>> 前言 图像分割是一种把图像分成若干个独立子区域的技术和过程.在图像的研究和应用中,很多时候我们关注的仅是图像中的目标或前景(其他部分称为背景),它们对应图像中特定的.具有 ...

  2. 图像预处理第7步:标准归一化

    图像预处理第7步:标准归一化 将分割出来的各个不同宽.高的数字字符宽.高统一 //图像预处理第7步:标准归一化 //将分割出来的各个不同宽.高的数字字符宽.高统一 void CChildView::O ...

  3. 如何利用图像预处理提高OCR的准确性?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 OCR代表光学字符识别,将文档照片或场景照片转换为机器编码的文本. ...

  4. 图像+预处理+数据增强+总结

    图像+预处理+数据增强+总结 图像与处理的中间和最终结果的不同版本,本身就是图像数据增强的一部分. 染色归一化 数据增强 Image augmentation for machine learning ...

  5. opencv ocr字符识别_OCR深度实践系列:图像预处理

    近一个半月时间没更了,在这段时间里针对OCR业务进行了深入研究,业务也已上线,谨以此篇作为OCR系列的开篇. 目前NLP+OCR的落地应用在市场上愈加火热,如金融领域的研报分析.司法领域的合同审核甚至 ...

  6. matlab指纹图像采集,基于MATLAB实现的指纹图像预处理

    西南民族大学学报·自然科学版第 34 卷第 4 期 Journal of Southwest University for Nationalities⋅Natural Science Edition ...

  7. 图像预处理第8步:紧缩重排数字字符

    //图像预处理第8步:紧缩重排已经分割完毕的数字字符,并形成新的位图句柄 void CChildView::OnImgprcShrinkAlign() {m_hDIB=AutoAlign(m_hDIB ...

  8. 使用ABBYY FineReader进行自动图像预处理

    2019独角兽企业重金招聘Python工程师标准>>> 扫描图像和数码照片中常见的扭曲文本行.歪斜.噪声和其他缺陷可能会降低识别质量,ABBYY FineReader可自动消除这些缺 ...

  9. 计算机视觉——图像预处理及边缘检测

    1.为什么要进行图像预处理? \qquad当对图像进行边缘.轮廓的检测时,图像噪声会对检测产生不利影响,并且为了帮助模型专注于一般细节并获得更高的准确度,我们需要对图像进行预处理. \qquad预处理 ...

最新文章

  1. 低压差降压稳压电路设计
  2. python打开是什么颜色-python实现简单颜色识别程序
  3. 2019.7.29二维数组
  4. java语言精通能干什么_Java学到什么程度才能叫精通?
  5. 感觉养老金越涨差距越大,有人提议高于5000的不再上涨,合理吗?
  6. 没有朋友,一个人旅行是什么感受?
  7. c语言输入年月的流程图_C语言程序流程图
  8. 用Java实现MD5加盐
  9. 计算机硬盘磁道损坏有什么症状,硬盘0磁道(0磁道)损坏的维修方法
  10. word转html制作操作手册,Word文档转换为HTML帮助文档操作手册范本.pdf
  11. S5PV210系列 (裸机十五)之 iNand
  12. 同向放大器、反向放大器的区别
  13. 各个厂商手机不打印log日志的解决方法
  14. 怎么建立一个简单的程序化交易系统?
  15. R语言实战笔记--第十五章 处理缺失数据
  16. 超级3GP转换器 V1.6.3.0 纯免费的
  17. 以下是三套目前Web 2.0网站流行试用的颜色元素
  18. 服务网格和 API 网关之间的差异​
  19. 前端项目更换鼠标样式
  20. 【初探篇】反向代理在系统结构中的应用场景

热门文章

  1. 《互联网思维独孤九剑》:互联网思维,让你日赚斗金不再是梦
  2. 西门子医疗上海诊断试剂基地正式投产!总投资近30亿元,年产能预计达6亿人次测试 | 美通社头条...
  3. 怎么控制LED灯的开关呢?最简单的方法是给它加一个开关
  4. IBM MQ 故障诊断(一)
  5. SDNU 1185.统计数字(水题)
  6. Postgres -- 报错: org.postgresql.util.PSQLException: 语法错误 在 “user“ 或附近
  7. 寻找卓越的(Android)软件工程师,可解你燃眉之急
  8. QTableWidget单元格控件居中对齐
  9. 基于传统ECS和K8S的运维平台设计思路
  10. Vert.x 响应式 Web 框架介绍使用