Matlab:分离连接的组件

2023-12-02

我正在研究检测硬币的图像处理问题。

I have some images like this one here: Binary components

并想将错误连接的硬币分开。
我们已经尝试了 MATLAB 主页上所述的分水岭方法:

  • the-watershed-transform-strategies-for-image-segmentation.html

特别是因为第一个例子正是我们的问题。

但相反,我们得到了一种非常混乱的分离,正如你在这里看到的:

enter image description here

我们已经使用以下方法提取了硬币的面积regionprops极值参数并仅在所需区域上投射分水岭。

我非常感谢任何有关该问题的帮助,甚至是另一种将其分开的方法。


如果您有图像处理工具箱,我还可以建议圆形霍夫变换通过imfindcircles。但是,这至少需要 R2012a 版本,所以如果没有它,这将无法工作。

为了完整起见,我假设您拥有它。如果您想保持图像不变,这是一个好方法。如果你不知道什么霍夫变换也就是说,它是一种在图像中查找直线的方法。这circular霍夫变换是一种特殊情况,旨在寻找图像中的圆圈。

圆形霍夫变换的另一个优点是它能够检测图像中的部分圆形。这意味着图像中连接的那些区域,我们可以将它们检测为单独的圆圈。你会怎么打电话imfindcircles采用以下方式:

[centers,radii] = imfindcircles(A, radiusRange);

A将是你的物体的二值图像,并且radiusRange是一个二元素数组,指定要在图像中检测的圆的最小和最大半径。输出是:

  • centers: A N x 2数组告诉你(x,y)图像中检测到的每个圆心的坐标 -x是列和y是行。
  • radii:对于检测到的每个相应中心,这也给出了检测到的每个圆的半径。这是一个N x 1 array.

还有附加参数imfindcircles您可能会发现有用的,例如Sensitivity。更高的灵敏度意味着它能够检测更不均匀的圆形形状,例如图像中显示的形状。它们不是完美的圆形,但它们是圆形的。默认灵敏度为 0.85。我将其设置为 0.9 以获得良好的结果。另外,在检查图像时,我发现半径范围从 50 像素到 150 像素。因此,我这样做了:

im = im2bw(imread('http://dennlinger.bplaced.net/t06-4.jpg'));
[centers,radii] = imfindcircles(im, [50 150], 'Sensitivity', 0.9);

第一行代码直接从 StackOverflow 读取图像。我也将其转换为logical或纯黑白,因为您上传的图像类型uint8。该图像存储在im。接下来,我们调用imfindcircles在我们描述的方法中。

现在,如果我们想要可视化检测到的圆圈,只需使用imshow显示您的图像,然后使用viscircles在图像中绘制圆圈。

imshow(im);
viscircles(centers, radii, 'DrawBackgroundCircle', false);

viscircles默认情况下,在轮廓上绘制白色背景的圆圈。我想禁用此功能,因为您的图像有白色圆圈,并且我不想显示错误的轮廓。这是我通过上面的代码得到的结果:

enter image description here

因此,你可以从中得到的是centers and radii变量。centers将为您提供每个检测到的圆的中心,同时radii会告诉您每个圆的半径是多少。


现在,如果你想模拟什么regionprops这样做时,我们可以迭代所有检测到的圆圈,并将它们物理绘制到 2D 地图上,其中每个圆圈都用 ID 号标记。因此,我们可以这样做:

[X,Y] = meshgrid(1:size(im,2), 1:size(im,1));
IDs = zeros(size(im));
for idx = 1 : numel(radii)
    r = radii(idx);
    cen = centers(idx,:);

    loc = (X - cen(1)).^2 + (Y - cen(2)).^2 <= r^2;
    IDs(loc) = idx;
end

我们首先使用以下命令定义一个矩形点网格meshgrid并初始化一个全零的 ID 数组,其大小与图像相同。接下来,对于每个圆的每对半径和圆心,我们定义一个以该点为中心并向外延伸给定半径的圆。然后,我们将它们用作 ID 数组中的位置,并将其设置为该特定圆的唯一 ID。的结果IDs将类似于输出bwlabel。因此,如果您想提取idx圆圈是,你会这样做:

cir = IDs == idx;

出于演示目的,一旦我们缩放 ID 以使其适合于一个 ID 数组,这就是 ID 数组的样子。[0-255]能见度范围:

imshow(IDs, []);

enter image description here

因此,每个不同灰色阴影的阴影圆圈表示用以下方法检测到的唯一圆圈imfindcircles.

然而,对于某些硬币来说,灰色阴影可能有点模糊,因为它们融入了背景。另一种可视化的方法是对 ID 数组应用不同的颜色图。我们可以尝试使用cool颜色图,颜色总数为唯一圆圈的数量 + 1(背景)。因此,我们可以这样做:

cmap = cool(numel(radii) + 1);
RGB = ind2rgb(IDs, cmap);
imshow(RGB);

上面的代码将创建一个颜色图,以便每个圆圈都映射到颜色中的唯一颜色cool彩色地图。下一行应用一个映射,其中每个 ID 与一种颜色相关联ind2rgb最后我们展示了图像。

这就是我们得到的:

enter image description here

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

Matlab:分离连接的组件 的相关文章

  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 非模态 questdlg.m 提示

    我的代码绘制了一个图 然后提示用户是否想使用不同的参数绘制另一个图 问题是 当 questdlg m 打开时 用户无法查看绘图的详细信息 这是代码 while strcmp Cont Yes 1 Some code modifying da
  • 如何将任意颜色的色度键滤镜应用到实时摄像头源ios?

    基本上我想将色度键滤镜应用到 ios 实时摄像头源 但我希望用户选择将被另一种颜色替换的颜色 我找到了一些使用绿屏的示例 但我不知道如何动态替换颜色而不仅仅是绿色 知道如何以最佳性能实现这一目标吗 您之前曾询问过我的情况GPUImage h
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 在discord.py中访问成员的横幅

    我正在制作图像配置文件命令 我想为此访问会员的横幅 我们有什么办法可以在discord py 中做到这一点吗 如果不清楚我所说的横幅是什么意思 那么蓝色背景的图像就是横幅 我想访问它 在discord py v2 0中你可以使用 You m
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • 在 Visual Studio 中调试非托管 C++ 图像

    我确实在 Visual Studio 2010 下的非托管 C 上编写了大量图像处理代码 其中涉及许多不同的图像 我希望能够在逐步调试时像简单标识符一样轻松地观看它们 我当前的解决方案是使用一些在 Matlab 控制台中导出图像的函数 可以
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • numpy:大量线段/点的快速规则间隔平均值

    我沿着一维线有许多 约 100 万个 不规则间隔的点 P 这些标记线段 这样 如果点是 0 x a x b x c x d 则线段从 0 gt x a x a gt x b x b gt x c x c gt x d 等 我还有每个段的 y
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • 最快的高斯模糊实现

    如何以最快的速度实施高斯模糊 http en wikipedia org wiki Gaussian blur算法 我要用Java来实现它 所以GPU http en wikipedia org wiki Graphics processi
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un
  • Matlab的导入函数的范围是什么?

    我正在尝试将一些用 Matlab 编写的代码转换为独立的 编译的 Matlab 应用程序 然而 在出现一些奇怪的错误之后 我意识到代码大量使用了从路径中添加和删除的操作 以避免多次使用多个具有相同名称 但结果 计算不同 的函数这一事实 环顾
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • 低质量相机的模糊内核

    我正在做一些图像增强实验 所以我用我的廉价相机拍照 相机有马赛克伪像 所有图像看起来都像网格 我认为药盒 失焦 内核和高斯内核不是最佳候选 有什么建议么 EDIT Sample 我怀疑这不能通过恒定的内核来完成 因为对像素的影响并不相同 因

随机推荐