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. WebApp NativeApp HybirdApp
  2. 洛谷 P4245 【模板】任意模数NTT
  3. 毛坦厂中学2021年高考成绩查询,六安市毛坦厂中学召开2021年高考誓师大会
  4. C++11 新特性简介
  5. 解密昇腾AI处理器--Ascend310简介
  6. 【赛时总结】 ◇赛时·II◇ AtCoder ABC-100
  7. 烽烟通讯2100万限售股将于3月7日疏通流畅上市
  8. jeecg框架解决跨域问题
  9. JavaScript笔记-前端AES加密
  10. 11_超级鹰学习及应用
  11. 任务,行动,目标、绩效管理,计划
  12. 用java爬取斗鱼弹幕
  13. 百度推广系列之优化之笔
  14. 用JS做一个简易的时间显示动态效果
  15. 头脑王者类似源码研究
  16. 清华姚班学生ICML一人署名论文:协作学习的鲁棒性方法
  17. 机器学习之数据归一化(Feature Scaling)
  18. Protel常用元器件封装总结
  19. java版扫雷游戏源代码
  20. SSM框架专题-MyBatis框架老杜版从零入门笔记(下)

热门文章

  1. 2022氯化工艺考试练习题模拟考试平台操作
  2. 二叉树的顺序存储结构C语言代码实现
  3. 电子制造业供应配套难度大?企业该如何应对?
  4. Linux下Firefox不能播放视频问题
  5. 智能科学与技术 毕业设计 - 选题建议 题目推荐 毕设指导 开题报告
  6. EasyExcel---转换器
  7. window无法对计算机进行,windows无法对计算机进行启动到下一个安装阶段怎么办...
  8. java178-终篇?静态代理?动态代理?
  9. 段地址和偏移地址是什么
  10. matlab 音调_音调策略的问题