4

我有眼底图像,这些图像是已经处理过的视网膜图片,我正在观察并尝试使用形态学侵蚀去除较小的血管。这似乎在我读过的几篇论文中都有效,但不包括确切运算符的详细信息。

我尝试了各种方法,形态打开,形态侵蚀然后关闭,我做了一点点命中或错过。我所有的工作都是使用 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

形态侵蚀和开放后:

处理后

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

4

2 回答 2

2

在此处输入图像描述

我认为你有正确的方法,但只需要应用额外的过滤。侵蚀后,您可以找到轮廓并使用轮廓区域进行过滤。如果该区域小于某个阈值区域,您可以在轮廓中着色以有效去除较小的血管。可以调整内核大小、迭代次数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()
于 2019-09-03T21:05:13.780 回答
1

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

于 2019-08-31T08:56:07.863 回答