文章目录
前言
视网膜血管分割是一种计算机视觉任务,旨在从眼底图像中分割出视网膜图像的血管。这个任务对于糖尿病视网膜病变等眼部疾病的早期诊断和治疗至关重要。视网膜血管分割的方法主要有两种:基于规则的方法和基于深度学习的方法。基于规则的方法通常需要手工设计特征提取器和分类器,而基于深度学习的方法则利用深度神经网络来自动地学习特征并进行分类。近年来,基于深度学习的方法在视网膜血管分割中取得了许多优秀的成果,成为当前的主流方法。
像素点分割和语义分割
基于像素的分割是指将图像中的每一个像素都进行分类,通常会生成一个与原始图像大小相同的分割结果图,每一个像素点都被标记为属于哪一类别。这种方法适用于需要对图像进行详细分类的任务,例如边缘检测或者物体检测。而语义分割则是将图像中的每一个像素都赋予一个语义标签,即将图像中每一个像素点都标注为属于哪一个物体类别或者场景类别。这种方法适用于需要对图像进行高层次理解的任务,例如自动驾驶中的路面识别、物体分割等。
总体来说,基于像素的分割和语义分割都是图像分割技术的一种,但是它们的目标和应用场景有所不同。
DRIVE数据集
DRIVE(Digital Retinal Images for Vessel Extraction)是一个常用的眼底图像数据集,用于研究视网膜血管分割算法。该数据集包含了40个具有挑战性的视网膜图像,其中20个用于训练,另外20个用于测试。每张图像的大小为565×584像素,并且包含手动标注的视网膜血管。这些标注提供了血管的位置和形状信息,可以用于训练和评估血管分割算法。DRIVE数据集在医学图像处理领域被广泛使用,是许多血管分割算法的基准数据集之一。
一、BP网络分割
代码注释写的很详细,这里就不过多介绍了。
1、数据预处理
这里的工作主要是把DRIVE数据集的训练和测试数据读进来,然后把图片灰度化、对图片进行填充、根像素点切片(9*9)、归一化等。
import os
import cv2
import json
import torch
from PIL import Image
import numpy as np
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
class DriveDataset(Dataset):
def __init__(self, root: str, train: bool, size=9):
super(DriveDataset, self).__init__()
self.size = size
self.flag = "training" if train else "test" # 选择训练还是测试
data_root = os.path.join(root, "DRIVE", self.flag) # 数据集路径拼接
assert os.path.exists(data_root), f"path '{data_root}' does not exists." # 判断路径是否存在
img_names = [i for i in os.listdir(os.path.join(data_root, "images")) if i.endswith(".tif")] # 遍历images路径下的图片名
self.img_list = [os.path.join(data_root, "images", i) for i in img_names] # images图片路径列表
self.manual = [os.path.join(data_root, "1st_manual", i.split("_")[0] + "_manual1.gif") # 1st_manual图片路径列表
for i in img_names]
# check files
for i in self.manual: # 判断1st_manual下的图片是否存在
if os.path.exists(i) is False:
raise FileNotFoundError(f"file {i} does not exists.")
data = [] # 总数据数组
target = [] # 标签图片数组
for image_filename, label_filename in zip(self.img_list, self.manual): # 遍历每一张图片和对应的标签图片
image = Image.open(image_filename).convert('L') # 读取图片、转灰度
label = Image.op