如何检测和计算螺旋的圈数

2023-11-25

我需要检测螺旋形弹簧并计算其线圈匝数。

我尝试过如下:

Image<Bgr, Byte> ProcessImage(Image<Bgr, Byte> img)
{ 
    Image<Bgr, Byte> imgClone = new Image<Bgr,byte>( img.Width, img.Height);
    imgClone = img.Clone();
    Bgr bgrRed = new Bgr(System.Drawing.Color.Red);


    #region Algorithm 1


    imgClone.PyrUp();
    imgClone.PyrDown();
    imgClone.PyrUp();
    imgClone.PyrDown();
    imgClone.PyrUp();
    imgClone.PyrDown();

    imgClone._EqualizeHist();
    imgClone._Dilate(20);
    imgClone._EqualizeHist();
    imgClone._Erode(10);

    imgClone.PyrUp();
    imgClone.PyrDown();
    imgClone.PyrUp();
    imgClone.PyrDown();
    imgClone.PyrUp();
    imgClone.PyrDown();

    imgClone._EqualizeHist();
    imgClone._Dilate(20);
    imgClone._EqualizeHist();
    imgClone._Erode(10);


    Image<Gray, Byte> imgCloneGray = new Image<Gray, byte>(imgClone.Width, imgClone.Height);

    CvInvoke.cvCvtColor(imgClone, imgCloneGray, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);

    imgCloneGray = imgCloneGray.Canny(c_thresh, c_threshLink);//, (int)c_threshSize);

    Contour<System.Drawing.Point> pts = imgCloneGray.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL);

    CvInvoke.cvCvtColor(imgCloneGray, imgCloneYcc, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_GRAY2BGR);

    if (null != pts)
    {
        imgClone.Draw(pts, bgrRed, 2);
        imgClone.Draw(pts.BoundingRectangle, bgrRed, 2);
    }

    #endregion 

    return imgClone; 
}

Input Image OutputImage

我知道如何获得弹簧,但如何获得计数。我正在寻找算法。 我目前不寻求速度优化。

这类似于数手指。弹簧螺旋线非常细,便于使用轮廓。还能做什么呢。http://www.luna-arts.de/others/misc/HandsNew.zip


你在那里有一个很好的最终二值化,但它看起来太局限于这个单一的情况。我会进行相对简单但可能更稳健的预处理,以实现相对良好的二值化。从数学形态学来看,有一种称为 h-dome 的变换,用于通过抑制高度 h。此操作可能在您的图像处理库中不容易实现,但实现它并不难。为了对这个预处理图像进行二值化,我选择了 Otsu 的方法,因为它是自动的并且在统计上是最佳的。

这是 h-dome 变换后的输入图像和二值图像:

enter image description here enter image description here

现在,为了计算“螺旋圈”的数量,我做了一些非常简单的事情:我分割了螺旋,这样我就可以将它们算作连接的组件。为了将它们分开,我用一条垂直线做了一个形态学开口,然后用一个基本正方形进行了一次扩张。这会产生以下图像:

enter image description here

对组件进行计数得出 15。由于其中有 13 个不太接近,因此此方法可以正确计算它们。左侧和右侧的组被视为一个组。

用于执行这些步骤的完整 Matlab 代码:

f = rgb2gray(imread('https://i.stack.imgur.com/i7x7L.jpg'));
% For this image, the two next lines are optional as they will to lead
% basically the same binary image.
f1 = imhmax(f, 30);
f2 = imhmin(f1, 30);
bin1 = ~im2bw(f2, graythresh(f2));

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

如何检测和计算螺旋的圈数 的相关文章

随机推荐

  • PDO PHP 获取类

    我正在学习 php 中的 pdo 以便使数据库访问更容易 更高效 我读到的 fetch class 的一个解释是 对象的属性是在调用构造函数之前设置的 这是什么意思 任何方向都将受到高度赞赏 这意味着当使用PDO将结果返回到自定义对象时 需
  • 程序是否以兼容模式运行

    是否有一个我可以调用的 C NET 函数来检测我的程序是否在兼容模式下运行 如果没有 有人可以告诉我一个代码吗 谢谢 例如 程序加载完毕 兼容模式检查 如果为真则退出 否则运行 来自另一个论坛 经过几次谷歌搜索后 徒劳无功 我决定自己尝试一
  • ValueError:期望 x 为非空数组或数据集(Collab 上的 Tensor Flow lite 模型制作者)

    我正在关注this有关在 Collab 上使用 TensorFlow lite Model Maker 创建自定义模型的教程 import pathlib path pathlib Path content employee pics co
  • NetBeans (Java Swing):设置窗口大小

    这真让我抓狂 当我在设计模式下为窗口设置适当的大小时 它只会忽略该大小并在编译和运行时使用其他大小 即使很难 我设置了minimumSize和preferredSize 它只是忽略了这一点 为什么 如何设置自己的尺寸 即使你已经设置了尺寸m
  • 如何将事件绑定到按住的鼠标左键?

    我需要只要按住鼠标左键就执行命令 如果您希望在没有任何干预事件的情况下 发生某些事情 即 无需用户移动鼠标或按任何其他按钮 您唯一的选择就是轮询 按下按钮时设置标志 释放按钮时取消设置 轮询时 检查标志并运行您的代码 如果已设置 这里有一些
  • 适用于大量表的实体框架 4.1 (715)

    我正在为包含 700 多个表的数据库开发数据访问层 我创建了包含所有表格的模型 这生成了一个巨大的模型 然后我将模型更改为使用 4 1 中的 DBContext 这似乎改进了它的编译和工作方式 看来设计师根本就没有工作 然后我创建了一个测试
  • 错误:java:Intellij 中的源版本无效:8。这是什么意思?

    我尝试在使用 Intellij Ultimate 13 1 4 中编译一些代码 但出现以下错误 我不知道这意味着什么 Information Using javac 1 7 0 55 to compile java sources Info
  • ImageView 不会填充父级

    我的一个屏幕上有一个 ScrollView 我希望右边缘有阴影 我决定最简单的方法是使 ScrollView 的子视图成为relativelayout 并有两个relativelayout 的子视图 一个是 LinearLayout 用于容
  • Bash if 语句中的正则表达式匹配

    我在这里做错了什么 尝试匹配任何包含空格 小写字母 大写字母或数字的字符串 特殊字符也很好 但我认为这需要转义某些字符 TEST THIS is a TEST title with some numbers 12345 and specia
  • Tomcat 控制台日志到文件

    我在用着阿帕奇汤姆猫7 当我使用安全管理器运行 Tomcat Djava security debug范围我在控制台中收到了很多文本 我无法阅读控制台中的文本 所以我需要控制台登录到某个文件 我怎样才能实现这个目标 Remove Conso
  • 替换 R 数据框中因子列的内容

    我需要替换数据框中因子列的级别 使用iris以数据集为例 我将如何替换包含的任何单元格virginica with setosa in the Species column 我预计以下内容可以工作 但它会生成一条警告消息并简单地插入 NA
  • Python 函数中的默认值[重复]

    这个问题在这里已经有答案了 我注意到以下几点 class c def init self data self data data a c b c a data append 1 print b data 1 这是正确的行为吗 是的 这是正确
  • 如何循环播放媒体播放器文件?

    基本上我有 3 首歌曲 我希望用户能够在 3 首歌曲的循环完成后循环回到第一首歌曲 为什么这不起作用 它将播放所有 3 首歌曲 然后在第四次单击时 不会播放任何歌曲 MediaPlayer song0 song1 song2 Button
  • 访问公共 Facebook 页面时,Graph API 返回“false”或“不支持的获取请求”

    我在使用一些粉丝页面并使用 Facebook Graph API 获取其详细信息时遇到了一些问题 当我尝试获取粉丝页面的详细信息时 Graph API 仅返回false 但现在正在返回 error message Unsupported g
  • 平滑滚动在 ViewPager 中不起作用(支持库)

    我正在编写使用的应用程序ViewPager举办Fragments 当我以编程方式更改片段时 平滑滚动功能不起作用 我使用 ViewPager setCurrentItem int item boolean smoothScroll 方法 也
  • 拆箱不会创建该值的副本。这是正确的吗?

    我正在阅读微软的课堂培训材料 我读了以下内容 拆箱 拆箱与装箱相反 它是引用类型到引用类型的显式转换 值类型 拆箱检索对对象中包含的值类型的引用 拆箱操作涉及检查对象实例以确保该对象 实例是给定值类型的装箱值 那么 实例的值是 复制到值类型
  • 将项目添加到故事板中的滚动视图(尺寸检查器似乎已锁定)

    我使用情节提要在视图控制器中添加了一个内容大小大于屏幕大小的滚动视图 当然 滚动视图的目的是让内容大于包含它的视图 我想在故事板中以图形方式将按钮和标签添加到滚动视图的底部 但我无法查看滚动视图的该部分 我如何到达那里 我尝试调整尺寸检查器
  • 从函数执行存储过程

    我知道这已经被要求死了 我也知道为什么 SQL Server 不让你这样做 但是 除了使用扩展存储过程之外 还有其他解决方法吗 并且请不要告诉我将我的函数转换为过程 所以我真正要问的是 有什么方法可以从函数内运行存储过程吗 EDIT 事实证
  • 单元测试如何使用 Mockito 模拟存储库

    我在存根我的存储库时遇到问题 有人建议我创建另一个 application properties 我没有这样做 并使用像 H2 这样的内存数据库 我想知道是否可以对调用进行存根 以便在调用 myDataService findById id
  • 如何检测和计算螺旋的圈数

    我需要检测螺旋形弹簧并计算其线圈匝数 我尝试过如下 Image