眼底图分类(一)预处理 - 去除多余背景


这其实是一篇还米有很大技术含量的文章~~ 仅供自己参考用。


在我们的眼底图数据中,图片的格式并不统一很多都是长方形,眼睛的ct也不一定在图像中央或大小不对,不便于我们后续的分类,所以做预处理达到如下目的:

  • 格式统一为[512,512] 或 [216,216]的正方形
  • 根据每张图背景的色度+中心色度,自动定位眼球位置,去除多余背景

具体的实现用到了PIL库, 在这个代码编写中我参考了以下链接:
  • stackflow之如何裁剪图片 https://stackoverflow.com/questions/1905421/crop-a-png-image-to-its-minimum-size
  • PIL的imageFilter功能 http://blog.csdn.net/guduruyu/article/details/71404941
当然,看PIL的官方文档是更好的,我就是懒了emmmm
然后最后的代码如下:

from __future__ import division,print_function
import os
import numpy as np
from PIL import Image, ImageFilter

def convert(fname, crop_size):
    img = Image.open(fname)
    debug = 1
    #blurred = img.filter(ImageFilter.BLUR) 这里学长用了blur后的,可能可以更均匀的识别背景? 我没有很明白
    #ba = np.array(blurred)
    ba = np.array(img)
    h, w, _ = ba.shape
    if debug>0:
        print("h=%d, w=%d"%(h,w))
    #这里的1.2, 32, 5, 0.8都是后续可以调整的参数。 只是暂时觉得用这个来提取背景不错。
    if w > 1.2 * h:
        left_max = ba[:, : w // 32, :].max(axis=(0, 1)).astype(int)
        right_max = ba[:, - w // 32:, :].max(axis=(0, 1)).astype(int)
        max_bg = np.maximum(left_max, right_max)
        foreground = (ba > max_bg + 5).astype(np.uint8)
        bbox = Image.fromarray(foreground).getbbox()

        if debug>0:
            print(foreground, left_max, right_max, bbox)
        if bbox is None:
            print('bbox none for {} (???)'.format(fname))
        else:
            left, upper, right, lower = bbox
            #如果弄到的框小于原图的80%,很可能出bug了,就舍弃这个框。
            if right - left < 0.8 * h or lower - upper < 0.8 * h:
                print('bbox too small for {}'.format(fname))
                bbox = None
    else:
        bbox = None

    if bbox is None:
        if debug>0:
            print 
        bbox = square_bbox(img)

    cropped = img.crop(bbox)
    resized = cropped.resize([crop_size, crop_size])
    return resized

def square_bbox(img):
    w, h = img.size
    left = max((w - h) // 2, 0)
    upper = 0
    right = min(w - (w - h) // 2, w)
    lower = h
    return (left, upper, right, lower)

def main():
    img = convert('meta.jpg',512)
    img.show()

if __name__=='__main__':
    main()

 运行后的结果还是OK的,原图是这样的
眼底图分类(一)预处理 - 去除多余背景_第1张图片
剪裁之后变成了 眼底图分类(一)预处理 - 去除多余背景_第2张图片

嗯。就酱紫。naive的结束,但是还是很开心开了个头kkk

你可能感兴趣的:(AI,in,healthcare眼底图识别)