从 X 射线图像中提取手骨

2024-01-10

我有一只手的 X 射线图像。我需要自动提取骨头。我可以使用不同的技术轻松分割手。但我需要得到骨头,而使用这些技术并没有帮助。有些骨头比其他骨头更亮,所以如果我使用阈值,其中一些骨头会消失,而另一些骨头会随着阈值上升而变得更清晰。我想也许我应该只对手的一个区域进行阈值?是否可以对非正方形的 ROI 进行阈值处理? O也许您还有其他解决方案、建议吗?也许有一些像 OpenCV 这样的库或者类似的东西?任何帮助都会非常好!

扩展:

原始图像预期输出


一种方法可能是分割手和手指从图像中:

然后创建另一个图像手剪影:

获得轮廓后,您可以腐蚀图像以使其变小一些。这是用来从手中减去手和手指 image,得到手指:

下面的代码显示了执行此方法:

void detect_hand_and_fingers(cv::Mat& src);
void detect_hand_silhoutte(cv::Mat& src);

int main(int argc, char* argv[])
{
    cv::Mat img = cv::imread(argv[1]);
    if (img.empty())
    {
        std::cout << "!!! imread() failed to open target image" << std::endl;
        return -1;        
    }

    // Convert RGB Mat to GRAY
    cv::Mat gray;
    cv::cvtColor(img, gray, CV_BGR2GRAY);
    cv::Mat gray_silhouette = gray.clone();

    /* Isolate Hand + Fingers */

    detect_hand_and_fingers(gray);
    cv::imshow("Hand+Fingers", gray);
    cv::imwrite("hand_fingers.png", gray);

    /* Isolate Hand Sillhoute and subtract it from the other image (Hand+Fingers) */

    detect_hand_silhoutte(gray_silhouette);
    cv::imshow("Hand", gray_silhouette);
    cv::imwrite("hand_silhoutte.png", gray_silhouette);

    /* Subtract Hand Silhoutte from Hand+Fingers so we get only Fingers */

    cv::Mat fingers =  gray - gray_silhouette;
    cv::imshow("Fingers", fingers);
    cv::imwrite("fingers_only.png", fingers);
    cv::waitKey(0);

    return 0;
}

void detect_hand_and_fingers(cv::Mat& src)
{        
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3,3), cv::Point(1,1));
    cv::morphologyEx(src, src, cv::MORPH_ELLIPSE, kernel);    

    int adaptiveMethod = CV_ADAPTIVE_THRESH_GAUSSIAN_C; // CV_ADAPTIVE_THRESH_MEAN_C, CV_ADAPTIVE_THRESH_GAUSSIAN_C
    cv::adaptiveThreshold(src, src, 255, 
                          adaptiveMethod, CV_THRESH_BINARY, 
                          9, -5);

    int dilate_sz = 1;
    cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE,
                                       cv::Size(2*dilate_sz, 2*dilate_sz),
                                       cv::Point(dilate_sz, dilate_sz) );
    cv::dilate(src, src, element);
}

void detect_hand_silhoutte(cv::Mat& src)
{
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(7, 7), cv::Point(3, 3));
    cv::morphologyEx(src, src, cv::MORPH_ELLIPSE, kernel);        

    int adaptiveMethod = CV_ADAPTIVE_THRESH_MEAN_C; // CV_ADAPTIVE_THRESH_MEAN_C, CV_ADAPTIVE_THRESH_GAUSSIAN_C
    cv::adaptiveThreshold(src, src, 255, 
                          adaptiveMethod, CV_THRESH_BINARY, 
                          251, 5); // 251, 5

    int erode_sz = 5;
    cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE,
                                       cv::Size(2*erode_sz + 1, 2*erode_sz+1),
                                       cv::Point(erode_sz, erode_sz) );
    cv::erode(src, src, element);

    int dilate_sz = 1;
    element = cv::getStructuringElement(cv::MORPH_ELLIPSE,
                                       cv::Size(2*dilate_sz + 1, 2*dilate_sz+1),
                                       cv::Point(dilate_sz, dilate_sz) );
    cv::dilate(src, src, element);

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

从 X 射线图像中提取手骨 的相关文章

  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • pytesseract 无法从图像中识别复杂的数学公式

    我在用pytesseractpython 中的模块 pytesseract从图像中识别文本 但它不适用于包含复杂数学公式 例如根 推导 积分数学问题或方程 的图像 代码2 py Import modules from PIL import
  • 开放简历fisherfaces

    我有这个问题 当我使用 vs2010 调试 opencv 2 4 0 facetec demo c 运行时 程序出现此错误 OpenCV错误 未知函数中图像步长错误 矩阵不连续 因此其行数无法更改 文件 src opencv modul e
  • 如何加速 svm.predict?

    我正在编写一个滑动窗口来提取特征并将其输入到 CvSVM 的预测函数中 然而 我偶然发现 svm predict 函数相对较慢 基本上 窗口以固定的步幅长度在图像比例上滑动穿过图像 遍历图像加上提取每个图像特征的速度 窗口大约需要 1000
  • 找到 4 个特定的角像素并将它们与扭曲透视一起使用

    我正在使用 OpenCV 我想知道如何构建一个简单版本的透视变换程序 我有一张平行四边形的图像 它的每个角都由具有特定颜色的像素组成 该像素在图像中没有其他位置 我想遍历所有像素并找到这 4 个像素 然后我想将它们用作新图像中的角点 以扭曲
  • 如何用 JavaScript 修复图像透视变形和旋转?

    我有一些用手机拍摄的图像 有没有可以拉直纸张照片并将其压平的 JavaScript 库 例如 我想创建一个矩形图像 该图像没有任何失真 换句话说我想知道如何用 JavaScript 修复透视变形和旋转 例如 我发现下面的示例图像来自this
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • 为什么这个 gif 的持续时间似乎是 0 毫秒?如何找到真实的持续时间?

    我正在尝试从动画 gif 文件中获取持续时间和帧数 以便计算 gif 的平均帧速率 然后将其转换为视频 我最近在测试过程中看到了这张图片 它似乎让一切都相信它的持续时间为 0 毫秒 为什么 如何找到真实的持续时间 到目前为止我已经尝试过 e
  • 使用 OpenCV 进行相机校准 - 如何调整棋盘方块大小?

    我正在使用 OpenCV Python 示例开发相机校准程序 来自 OpenCV 教程 http opencv python tutroals readthedocs io en latest py tutorials py calib3d
  • 免费/开放图书馆查找相似图像

    我正在寻找稳定且成熟的免费 开源库 允许比较两个图像 我找到了这个 但我想知道你是否使用更好的 相似图像查找器 C 和 RGB 中的 NET 图像处理 http similarimagesfinder codeplex com 我做的很简单
  • 是否可以将 ppm 文件从 p3 转换为 p6 或使用pillow lib 打开 ppm p3 文件

    是否可以将 ppm 文件从 p3 转换为 p6 或使用pillow lib 打开并读取 ppm p3 文件 我实际上有 ppm p3 文件 并尝试使用pillow lib 将它们转换为 jpg 但不幸的是 它不读取 p3 文件 只读取 p6
  • java.lang.UnsatisfiedLinkError:java.library.path中没有opencv_java2411

    我正在尝试将 opencv 添加到我的 Spring Boot Maven 项目中 为了使用 opencv 库 我必须在 java library path 中提供本机库 我已将以下命令添加到 Eclipse VM 参数中 Djava li
  • 使用 OpenCV 进行图像模糊检测

    我正在研究图像的模糊检测 我已经用过拉普拉斯方法的方差在 OpenCV 中 img cv2 imread imgPath gray cv2 cvtColor img cv2 COLOR BGR2GRAY value cv2 Laplacia
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • 将图像加载到现有 Mat 中

    有没有办法将图像加载到现有的 Mat 中 如果没有 有没有办法控制 OpenCV 在调用 cv imread 时分配内存的位置 我只是为您的类创建一个构造函数 该构造函数接受 imread 的输入参数并将图像直接加载 并分配 到您的类中 所
  • 如何在python 3.8中安装opencv-python

    我在 pycharm 中安装 opencv python 时遇到问题 打开 pycharm 后 我单击 设置 然后单击 项目解释器 单击 并搜索正确的模块 我开始安装 但失败了 Could not find a version that s
  • Pytorch TypeError:eq() 收到无效的参数组合

    num samples 10 def predict x sampled models guide None None for in range num samples yhats model x data for model in sam
  • OpenCV Sobel 滤波器 - 为什么它看起来这么糟糕,尤其是与 Gimp 相比?

    我正在尝试使用 OpenCV 重建一些我之前在 Gimp 中完成的预处理 第一级是用于边缘检测的 Sobel 滤波器 它在 Gimp 中运行得很好 现在这是我对 OpenCV 的尝试 opencv imgproc Sobel src sca
  • OpenCV功能类似于matlab的“查找”

    我正在寻找 openCV 中的一个函数来帮助我制作图像蒙版 例如在 MATLAB 中 B A or B 零 大小 A B A 10 c 有些功能可以让你通过mask向他们提出论据 按照您描述的方式创建面具 我认为您正在追求Cmp 或 Cmp

随机推荐

  • WSO2 API 管理器,无效。无法找到请求目标的有效认证路径

    我已经在本地启动了 WSO2 API Manager 我正在尝试添加 API 端点https联系 它向我展示了这种错误 它向我展示了Invalid unable to find valid certification path to req
  • C# 与 Excel 中的模数有何不同?

    我正在试验负基数系统 并使用 Excel 来处理和检查我的计算 我注意到 C 与 Excel 之间存在差异 为什么 C 返回的结果与 Excel 不同 例如 C 146 3 2 Excel mod 146 3 1 假设我们有四个整数 x y
  • string.replace(fromCharCode() , '') 无法替换字符

    当我解析 XML 时 它包含异常的十六进制字符 所以我尝试用空白来代替它 但这根本不起作用 原人物 hex code 253 255 code xmlData String replace String fromCharCode 253 2
  • 查找矩阵内的最大和子=矩形[重复]

    这个问题在这里已经有答案了 可能的重复 获取总和最大的子矩阵 https stackoverflow com questions 2643908 getting the submatrix with maximum sum 给定一个正整数和
  • 如何根据不同的URL参数和请求值写入不同的数据库?

    我正在尝试创建一个 REST API 它选择要写入的适当的 mongo 数据库以及正确的集合 如何选择与参数同名的数据库以及集合 即将推出的 v0 6 Eve 将原生支持多个 Mongo 实例 新功能 支持多个 MongoDB 数据库和 或
  • 如何在 Mac OS 上使用 homebrew 将 postgresql 从 10.1 降级到 9.6 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的 Mac 上装有 postgresql 10 1 我的工作网站需要 9 6 才能在本地计算机上运行 找不到有关如何卸载或降级到 9 6
  • 如何解决此错误 (GWT)

    运行我的应用程序后出现此错误 编译过程中没有出现错误 另外 没有其他应用程序在运行 在端口 8888 警告 上启动 Jetty 失败 电子邮件受保护 cdn cgi l email protection 8888 java net Bind
  • 如何在java中为游戏实现双缓冲?

    因此 在我正在开发的游戏中 我有一个弹珠跟随鼠标 但当它这样做时 屏幕会闪烁 背景包括两个 jpeg 和 9 个矩形 我该如何进行双缓冲呢 这是主窗口的代码 Write a description of class Window here
  • R:分割数字字符串

    我正在尝试拆分 40 位数字的数字字符串 即拆分123456789123456789123456789 into 1 2 3 4 etc 很遗憾strsplit不起作用 因为它需要字符 并使用转换字符串as character不起作用 因为
  • Zappa/AWS - 电子邮件不会发送并且只是超时

    目前 我已经为我的交易电子邮件提供商 Postmark 尝试了普通的 Django SMTP 和一些不同的基于 api 的 Django 库 当我运行我的开发服务器时 一切都运行良好 通过 Postmark API 发送电子邮件没有任何问题
  • Get-ADPrincipalGroupMembership -Identity 不接受变量

    在几个不同的域中工作 这些域具有不同的命名模式 因此 我正在编写一个进入每个域的脚本 并检查它们的组成员身份 该脚本所做的第一件事是询问用户的姓氏 然后我用Get ADUser选择samaccountname并将其绑定到一个变量 samac
  • .NET 相当于 Java 资源包中的选择吗?

    在Java资源包中 我可能有以下资源包定义 en GB 英式英语 jobs search resultstr There 1 choice 0 are no jobs 1 is one job 1
  • 当有人点击特定链接时如何显示加载对话框?

    我确实有一个 URL 可以打开一个加载速度非常慢的网页 而且我无法控制它 我确实想在有人单击此 URL 时显示加载对话框 或者在发生这种情况时使用覆盖 div 阻止页面 注意 这与 ajax 相关的问题不是同一个问题 这是针对用户的正常 U
  • 如何在artifactory中配置更长的版本号

    我们的 jar 的版本号必须比 x x x 更长 我们宁愿需要 x x x x 来集成一些老式的自制机制 这是因为我们用 x x x 标记我们的软件 一旦我们交付给客户 就必须在此时准确地构建一个特定的 jar 以适应另一个后端 它与我们的
  • 无法将 SCSS 变量设置为 CSS 变量?

    考虑以下 SCSS color black 000000 body color color black 当用node sass编译时版本4 7 2 它会生成以下 CSS body color 000000 当我编译相同版本的SCSS时4 8
  • 如何加密用户数据,以便只有他们才能解密?

    我正在考虑创建一个 Web 应用程序 让人们输入文本 使用 SSL 连接 并且在保存到数据库之前将其加密 目标是只有用户才能解密它 您可以让用户输入密钥及其数据 并在他们想要查看数据时再次输入 而不是存储密钥 但这对用户来说会有点痛苦 但是
  • 32 位程序可以在 64 位操作系统上使用超过 4GB 的内存吗?

    在 64 位操作系统上运行的 32 位程序是否能够使用超过 4GB 的内存 如果可用 简短的回答是 是的 更长的答案取决于 硬件支持页面重新映射 这基本上为您的程序提供了一个将几个页面的窗口放入更大的内存区域的窗口 然而 该窗口应该由程序本
  • Azure 中的 SignalR 横向扩展适用于高频场景

    根据我对 Azure 中 SignalR 横向扩展的阅读 推荐的方法是使用 Azure ServiceBus 作为背板 但同时使用背板进行高频消息传递也存在限制 就限制章节而言SignalR 中的横向扩展 http www asp net
  • 了解 Java 中同步块与易失性变量的原子性、可见性和重新排序

    我试图理解volatile Java 并发实践 一书中的关键字 我比较synchronized关键字与volatile变量在三个方面 原子性 波动性和重新排序 我对此也有一些疑问 我在下面一一讨论过 1 可见性 同步 与 易变 书上说以下关
  • 从 X 射线图像中提取手骨

    我有一只手的 X 射线图像 我需要自动提取骨头 我可以使用不同的技术轻松分割手 但我需要得到骨头 而使用这些技术并没有帮助 有些骨头比其他骨头更亮 所以如果我使用阈值 其中一些骨头会消失 而另一些骨头会随着阈值上升而变得更清晰 我想也许我应