我的眼底图像是已经处理过的视网膜的图像,我正在观察并试图通过形态学侵蚀来移除较小的血管。这似乎在我读过的几篇论文中起到了作用,但没有包括确切运算符的细节。
我尝试了各种方法,形态开放,形态侵蚀,然后关闭,我做了一点点命中或失败。我的所有工作都是使用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在形态侵蚀和开放之后:

我希望切除更多的血管,同时仍然保留较粗的血管,有没有人有什么好主意让我试试?或者,也许我处理形态学的方法不正确?
发布于 2019-09-04 05:05:14

我认为你有正确的方法,但只需要应用额外的过滤。腐蚀后,您可以找到轮廓,并使用轮廓区域进行过滤。如果面积小于某个阈值区域,您可以在轮廓中进行着色,以有效地移除较小的血管。核的大小、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-08-31 16:56:08
尝试增加侵蚀迭代次数,以便完全移除较小的血管。然后以相同的迭代次数进行形态学扩张,以便将剩余的大血管调整回(大约)其原始大小。
https://stackoverflow.com/questions/57736152
复制相似问题