首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenCV去除视网膜图像中具有形态学侵蚀的小血管

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

Stack Overflow用户
提问于 2019-08-31 15:46:08
回答 2查看 920关注 0票数 4

我的眼底图像是已经处理过的视网膜的图像,我正在观察并试图通过形态学侵蚀来移除较小的血管。这似乎在我读过的几篇论文中起到了作用,但没有包括确切运算符的细节。

我尝试了各种方法,形态开放,形态侵蚀,然后关闭,我做了一点点命中或失败。我的所有工作都是使用openCV2 python库完成的。

这是原始图像。

代码语言:javascript
复制
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

在形态侵蚀和开放之后:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-04 05:05:14

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

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2019-08-31 16:56:08

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57736152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档