使用 OpenCV 去除具有形态学侵蚀的视网膜图像中的小血管

Remove small blood vessels in retina image with morphological erosion using OpenCV

我有眼底图像,它是已经处理过的视网膜图片,我正在查看并尝试使用形态学侵蚀去除较小的血管。这似乎在我读过的几篇论文中起作用,但没有包括确切运算符的细节。

我尝试了各种方法,形态学开运算,形态学腐蚀然后闭合,我做了一点命中或未命中。我所有的工作都是使用 openCV2 python 库完成的。

这是原图。

def erode(image):
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,2))
    erosion = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel, iterations=1)
    erosion = cv2.erode(erosion, kernel, iterations=1)
    return erosion

形态侵蚀开后:

我希望在保留较粗的血管的同时去除更多的血管,有没有人有什么好主意让我试试?或者我可能不正确地接近形态学?

尝试增加侵蚀迭代次数,以便完全移除较小的血管。然后通过相同的迭代次数执行形态扩张,以便将剩余的大血管调整回(大约)其原始大小。

我认为您的方法是正确的,但只需要应用额外的过滤。侵蚀后,可以找到轮廓并使用轮廓区域进行过滤。如果该区域小于某个阈值区域,您可以在轮廓中着色以有效去除较小的血管。可以调整内核大小、cv2.morphologyEx() 中的迭代和阈值区域以移除更多或更少的血管。但要注意不要将内核维度增加太多,因为这是一种权衡:内核越大,删除的细节越多

import cv2

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)

cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 100:
        cv2.drawContours(opening, [c], -1, (0,0,0), -1)

cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.waitKey()