视网膜图像中的血管分割

2024-02-22

我正在尝试在视网膜图像中追踪血管。目前我正在使用 cv2 的阈值函数来使血管与周围视网膜的对比度更高:

from matplotlib import pyplot as plt
import cv2

img = cv2.imread('misc images/eye.jpeg',0)
img = cv2.medianBlur(img,5)

ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
            cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv2.THRESH_BINARY,11,2)

titles = ['Original Image', 'Global Thresholding (v = 127)',
            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]

for i in range(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

And this is the result: enter image description here

所有 3 种方法仍然存在来自视网膜其余部分的大量背景噪声。如何提高船舶追踪的准确性?


这是使用除法归一化然后对轮廓区域进行过滤来对图像进行阈值处理的另一种方法。

  • 读取输入
  • 转换为灰色
  • 应用形态扩张(或应用高斯模糊)
  • 将输入除以扩展结果
  • 临界点
  • 翻转,使血管在黑色背景上呈白色
  • 查找所有轮廓
  • 过滤轮廓以丢弃太小的轮廓
  • 在黑色图像上以白色绘制剩余轮廓作为蒙版
  • 将蒙版应用于阈值图像作为第一个结果
  • 将掩码应用于输入作为第二个结果
  • 保存结果


Input

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()


部门形象:

阈值图像:

蒙版图像:

结果1:

结果2:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视网膜图像中的血管分割 的相关文章

随机推荐

  • 在开始/结束日期将记录拆分为多个记录

    我正在寻找一种解决方案 必须使用另一个表中的数据从一个记录创建一组记录 表定义 DECLARE A AS TABLE AID BIGINT NOT NULL StartDate DATETIME NOT NULL EndDate DATET
  • 如何用SASS将数字转换为百分比? [复制]

    这个问题在这里已经有答案了 我有一张 930 像素 x 530 像素的地图 我想使用 mixin 将纬度 经度坐标转换为框内的顶部 左侧百分比值 这就是我到目前为止所拥有的 mixin latLong lat long left long
  • 使用 PHP 检测日历事件重叠冲突

    我正在开发一项功能 用于检查外部事件是否与内部事件 在日历应用程序中 发生冲突 该过程如下所示 我的应用程序创建了一系列可能的事件 称为 internalEvents 我从 Google Calendar iCloud 等日历 称为 ext
  • 如何捕获或收听浏览器通知?

    我想在 chrome 浏览器上收听 google facebook whatsapp 等网站的传入通知 我看到黑客提到here https stackoverflow com questions 15949606 how can i lis
  • Jquery Tablesorter,按链接url而不是链接内容排序

    我在一个表上使用 Tablesorter 该表使用第一列 共 4 列 中的链接 问题是 在 FF 和 Chrome 中 当通过 url 单击时 它会排序第一列 而不是链接的内容 例如 tr td a href http abc com zz
  • 在proguard中,保存包/默认访问变量和方法的关键字是什么?

    你可以说 keepclassmembers class sun public protected 但我并不排除包 默认访问方法 void myMethod 您可以添加另一个 keepclassmembers像那样 keepclassmemb
  • 如何在Vega JS中实现树节点切换?

    我在用着Vega JS https vega github io vega用于构建树形图 总的来说 我的问题如下 Vega 文档有很棒的树形布局示例 https vega github io vega examples tree layou
  • 如何使用 python opencv 测量同一图像中两条线之间的角度?

    我使用霍夫变换检测到一条不直的车道边界线 然后单独提取该线 然后与另一个具有直线的图像混合 现在我需要计算这两条线之间的角度 但我不知道这些线的坐标 所以我尝试使用给出垂直线坐标的代码 但它无法具体识别这些坐标 有没有办法测量这些线之间的角
  • 我应该如何查询 MySQL 以及如何缓存 MySQL 的结果?

    在你们所有人的帮助下 我终于成功地让 Solr 工作了 所以谢谢你们 而且我不得不说 我现在明白你为什么推荐它了 它真的很强大 现在 说到问题 我已将所有 可搜索 信息编入索引Solr 我的计划是查询 Solr 然后得到ID s查询结果 所
  • 如何仅在构建时排除打字稿中的特定文件?

    是否可以排除仅用于构建的所有测试文件 但将它们与 nodemon 一起使用以在本地运行测试 当我排除测试文件时tsconfig json在我的例子中 我收到一个打字稿错误 它找不到像 jest 这样的测试库的类型 Cannot find n
  • 自定义类型作为参数传递给函数

    当我定义自定义类型时 基础类型的类型似乎对我是否可以将其按原样传递给函数或是否需要转换它产生影响 问题是 为什么RuneFunc and StringMap工作 但不Integer https play golang org p buKNk
  • DateTime->format(epoch) 返回错误的日期

    我正在开发一个项目 但在将纪元时间格式化为人类可读时间时遇到问题 我有以下纪元时间1428512160当我把它通过 epochconverter com 时 我得到了人类时间08 04 2015 17 56 00 GMT 1 00 DST正
  • 页码和偏移量

    我正在学习不同类型的内存管理 我不明白在虚拟地址中具有偏移位的意义 以及为什么页面大小是由2 我的主要困惑是 给我一个在指令中使用偏移量来访问某个虚拟地址的示例 我的第二个困惑是 通常的说法是 如果逻辑地址的大小是2 m页面大小是2 n 则
  • 如何使用h5py将数据写入复合数据?

    我知道在c我们可以使用轻松构建复合数据集struct逐块键入并分配数据 我目前正在实施类似的结构Python with h5py import h5py import numpy as np we create a h5 file f h5
  • Intellij Git 命令不起作用

    我的 Intellij Java 项目中的 git 集成存在问题 当我尝试执行提交时 无论我是否更改了任何内容 总是会出现相同的消息 未检测到任何更改 此外 当我试图拉东西时 没有任何动作 在 Intellij 的版本控制选项卡中 只有一条
  • 从startup.cs asp.net core重定向用户

    我有一个要求 我想检查数据库是否已连接 我有相应的类 如果此类的方法返回 false 那么我想重定向到将进行设置的数据库页面 视图 我有Asp Net核心身份 我想在 EF core 尝试连接到数据库之前检查此情况 我尝试使用以下命令 但返
  • setText 时不能使用 Frame.origin

    我正在使用下一个代码来淡出并向上滚动我的文本字段 但我刚刚注意到当我使用类似的东西时 textField setText something or textField resignFirstResponder 我失去了向上滚动的能力 任何人
  • JFreechart X和Y轴缩放

    可以在jfreechart中设置轴刻度值吗 例如 我想要 X 轴刻度为 10 Y 轴刻度为 1 您设置了TickUnit 如果您使用的是XYPlot尝试这个 XYPlot plot chart getXYPlot NumberAxis xA
  • 为什么我的一些 HTML 内部链接有效,而另一些则无效?

    救命 我对这个世界完全陌生 我正在首页上制作一个菜单栏 并链接到网站上的其他页面 以下是代码示例 ul li a href About a li li a href The Therapist a li li a href Pay what
  • 视网膜图像中的血管分割

    我正在尝试在视网膜图像中追踪血管 目前我正在使用 cv2 的阈值函数来使血管与周围视网膜的对比度更高 from matplotlib import pyplot as plt import cv2 img cv2 imread misc i