【Python】图像预处理:图像分割

最近要参照论文   基于深度学习的眼底图像血管分割方法研究_谢林培   复现一个小实验,用深度学习的方法分割识别眼底图像中的血管,数据下载了DRIVE眼底图像数据库中的数据。

DRIVE数据说明:

DRIVE 数据库是由 N iemeijer 等人收集而成,里面有 40 张彩色眼底图像,训练集和测试集各包含 20 张,图像尺寸均为 565×584(单位为像素)。此外,每一张彩色眼底图像都配有显示有效区域的二值图像 mask,另外训练集中还有对应的第一专家标注的眼底血管二值图(即第一专家结果),测试集中还有对应第一和第二两位专家标注的眼底血管二值图(即第一专家结果和第二专家结果)。

DRIVE眼底血管图像如下图所示:

        

为了便于网络处理,首先要对565*584的图像进行裁剪,并且选择图片的绿色通道来进行识别(绿色通道相对来说血管更清晰),选择以横向4个像素为一个步长,纵向5个像素为一个步长将图片裁剪为29*29的图像块,最终一个眼底图像可以得到15120个图像块,以下是操作流程:

#使用opencvhe numpy pillow
import cv2
import numpy as np
#读取眼底图像 
image = cv2.imread('data/21_training.tif')
#得到图像的绿色通道
b, g, r = cv2.split(image)
cv2.imwrite('data/masked_g.tif',g)
from PIL import Image
im = Image.open('data/masked_g.tif')
# 进行图像裁剪,传入一个元组参数,元组里的元素分别是:(距离图片左边界距离x,
# 距离图片上边界距离y,距离图片左边界距离+裁剪框宽度x+w,距离图片上边界距离+裁剪框高度y+h)
x = 0
y = 0
w = 29
h = 29
#记录行数和列数
row = 0
col = 0
#纵向步长为5
for i in range(0,555+1,5):
    row = row + 1
    #横向步长为4
    for j in range(0,536+1,4):
        col = col + 1
#使用crop方法进行裁剪
        region = im.crop((j, i, j + w, i + h))
        region.save('result/1/%d_%d.tif'%(row,col))
        print('图片%d_%d.tif裁剪成功'%(row,col))
    col = 0

裁剪结果如下:

接下来再用逆向过程合成一下这些图像块,验证一下分割是否正确:

from PIL import Image
#新建一个图像,元组传入图像的宽和高
target = Image.new('L', (565, 584))
#读取图片
xi = 0
yi = 29
for i in range(1,113):
    imagefile = []
    if i == 1:
        #读取第一行图片,第一个图片29*29,其余图片4*29
        for j in range(1, 136):
            if j == 1:
                imagefile.append(Image.open('results/21/%d_1.tif' % i))
            else:
                imagefile.append(Image.open('results/21/%d_%d.tif' % (i,j)).crop((25, 0, 29, 29)))
        #拼凑原图的第一行
        x = 0
        for n in range(len(imagefile)):
            if n == 0:
                target.paste(imagefile[0], (x, 0))
                x = x + 29
            else:
                target.paste(imagefile[n], (x, 0))
                x = x + 4
        imagefile.clear()
    else:
        #读取2-112行图片,第一个图片29*5,其余图片4*5
        for j in range(1, 136):
            if j == 1:
                imagefile.append(Image.open('results/21/%d_1.tif'%i).crop((0,24,29,29)))
            else:
                imagefile.append(Image.open('results/21/%d_%d.tif' % (i,j)).crop((25, 24, 29, 29)))
        #拼凑
        for n in range(len(imagefile)):
            if n == 0:
                target.paste(imagefile[0], (xi,yi))
                xi = xi+29
            else:
                target.paste(imagefile[n], (xi,yi))
                xi = xi+4
        imagefile.clear()
        xi = 0
        yi = yi+5
target.save('results/21.tif', quality = 100)

完美合成原图,分割成功!


猜你喜欢

转载自blog.csdn.net/weixin_39837402/article/details/80055196