Python 视网膜血管分割

Python 视网膜血管分割,python,opencv,image-processing,Python,Opencv,Image Processing,我有下面的视网膜图像,我正试图追踪血管(圆圈中的深色线条)。以下是原始图像: 我已经尝试过使用分割标准化对图像进行阈值化,然后对轮廓区域进行过滤(根据不同的stackoverflow解决方案): 以下是我得到的最终输出: 它最终追踪到了船只,但也有一些背景噪音 理想情况下,我正在寻找以下输出: 要达到这个效果,有什么建议吗?我会先花时间来获得更好的图像。这是什么样的成像系统?我看不到解决这个问题的算法。我在这里第二个@Piege,图像质量很差。除非我看到你的预期输出,否则我自己无法看到所有

我有下面的视网膜图像,我正试图追踪血管(圆圈中的深色线条)。以下是原始图像:

我已经尝试过使用分割标准化对图像进行阈值化,然后对轮廓区域进行过滤(根据不同的stackoverflow解决方案):

以下是我得到的最终输出:

它最终追踪到了船只,但也有一些背景噪音

理想情况下,我正在寻找以下输出:


要达到这个效果,有什么建议吗?

我会先花时间来获得更好的图像。这是什么样的成像系统?我看不到解决这个问题的算法。我在这里第二个@Piege,图像质量很差。除非我看到你的预期输出,否则我自己无法看到所有的船只。@Pieget好的一点,我已经用更高质量的图像更新了帖子。这些船只现在更为显眼。我很想听听你的建议!这是一个研究得很好的问题,有数百篇关于它的论文。我建议您从文献搜索开始:
import cv2
import numpy as np

# read the image
img = cv2.imread('retina_eye.jpg')

# convert to gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# apply morphology
kernel = cv2.getStructuringElement(cv2.MORPH_RECT , (5,5))
morph = cv2.morphologyEx(gray, cv2.MORPH_DILATE, kernel)

# divide gray by morphology image
division = cv2.divide(gray, morph, scale=255)

# threshold
thresh = cv2.threshold(division, 0, 255, cv2.THRESH_OTSU )[1] 

# invert
thresh = 255 - thresh

# find contours and discard contours with small areas
mask = np.zeros_like(thresh)
contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]

area_thresh = 10000
for cntr in contours:
    area = cv2.contourArea(cntr)
    if area > area_thresh:
        cv2.drawContours(mask, [cntr], -1, 255, 2)

# apply mask to thresh
result1 = cv2.bitwise_and(thresh, mask)
mask = cv2.merge([mask,mask,mask])
result2 = cv2.bitwise_and(img, mask)

# save results
cv2.imwrite('retina_eye_division.jpg',division)
cv2.imwrite('retina_eye_thresh.jpg',thresh)
cv2.imwrite('retina_eye_mask.jpg',mask)
cv2.imwrite('retina_eye_result1.jpg',result1)
cv2.imwrite('retina_eye_result2.jpg',result2)

# show results
cv2.imshow('morph', morph)  
cv2.imshow('division', division)  
cv2.imshow('thresh', thresh)  
cv2.imshow('mask', mask)  
cv2.imshow('result1', result1)  
cv2.imshow('result2', result2)  
cv2.waitKey(0)
cv2.destroyAllWindows()