- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用 MATLAB 分离下图中两个相连的圆?我试过使用 imerode
,但这并没有给出好的结果。腐 eclipse 不起作用,因为为了腐 eclipse 足以分开圆圈,线条会消失或被破坏。在其他起始图片中,圆和线重叠,因此隔离重叠对象也不起作用。
该图像显示了由 bwboundaries
标识的对象,每个物体都涂上了不同的颜色。如您所见,两个浅蓝色圆圈连接在一起,我想将它们分开,生成两个单独的圆圈。谢谢
最佳答案
我建议您通过 imfindcircles
使用圆形霍夫变换.但是,您需要图像处理工具箱的第 8 版,该工具箱从 R2012a 版本开始提供。如果你没有这个,那么不幸的是这将不起作用:(...但让我们假设你确实拥有它。但是,如果你使用比 R2012a 更旧的东西,他/她中的 Dev-iL上面的评论链接到 MATLAB 文件交换上关于此实现的一些代码,很可能是在循环霍夫变换可用之前创建的:http://www.mathworks.com/matlabcentral/fileexchange/9168-detect-circles-with-various-radii-in-grayscale-image-via-hough-transform/
这是 Hough 变换的一个特例,您试图在图像中找到圆圈而不是线条。这样做的好处是,即使圆圈部分完成或重叠,您也可以找到圆圈。
我将拍摄您在上面提供的图像并对其进行一些后期处理。我要将图像转换为二进制,并删除包含标题的白色边框。我还将填充产生的任何孔,以便所有对象都填充为纯白色。执行此步骤后还有一些残留的量化噪声,因此我将使用 3 x 3 方形元素进行小开口。之后,我将使用 3 x 3 方形元素关闭形状,因为我看到形状中有明显的间隙。所以:
因此,直接从您发布的位置读取您的图像:
im = imread('http://s29.postimg.org/spkab8oef/image.jpg'); %// Read in the image
im_gray = im2double(rgb2gray(im)); %// Convert to grayscale, then [0,1]
out = imclearborder(im_gray > 0.6); %// Threshold using 0.6, then clear the border
out = imfill(out, 'holes'); %// Fill in the holes
out = imopen(out, strel('square', 3));
out = imclose(out, strel('square', 3));
[centres, radii, metric] = imfindcircles(img, [start_radius, end_radius]);
img
将是包含您的形状的二进制图像,
start_radius
和
end_radius
将是您要查找的圆的最小和最大半径。执行圆形霍夫变换,以便它会找到在此范围内(以像素为单位)的任何圆。输出是:
centres
:返回 (x,y)
检测到的每个圆的中心位置radii
:每个圆的半径metric
:衡量圆的纯度。较高的值意味着形状更有可能是圆形,反之亦然。 [centres, radii, metric] = imfindcircles(out, [30, 60]);
plot
的组合来演示检测到的圆以及半径。和
viscircles
.所以:
imshow(out);
hold on;
plot(centres(:,1), centres(:,2), 'r*'); %// Plot centres
viscircles(centres, radii, 'EdgeColor', 'b'); %// Plot circles - Make edge blue
bwboundaries
.这做起来有点棘手。我能看到你这样做的唯一方法是,如果你甚至不使用
bwboundaries
完全自己做。我假设在所有这些之后你会想要自己分析每个形状的属性,所以我建议你做的是遍历你拥有的每个圆圈,然后将每个圆圈放在一个新的空白图像上,做
regionprops
调用该形状,然后将其附加到一个单独的数组中。您还可以通过一个单独的数组来跟踪所有的圆圈,该数组一次将一个圆圈添加到该数组中。
regionprops
在此图像上获取行的信息并将其附加到您的最终结构数组。
num_circles = numel(radii); %// Get number of circles
struct_reg = []; %// Save the shape analysis per circle / line here
%// For creating our circle in the temporary image
[X,Y] = meshgrid(1:size(out,2), 1:size(out,1));
%// Storing all of our circles in this image
circles_img = false(size(out));
for idx = 1 : num_circles %// For each circle we have...
%// Place our circle inside a temporary image
r = radii(idx);
cx = centres(idx,1); cy = centres(idx,2);
tmp = (X - cx).^2 + (Y - cy).^2 <= r^2;
% // Save in master circle image
circles_img(tmp) = true;
%// Do regionprops on this image and save
struct_reg = [struct_reg; regionprops(tmp)];
end
struct_reg
的单独数组这将附加一个
regionprops
struct
对于我们图像中的每个圆圈和线条。我用
meshgrid
确定
(X,Y)
坐标相对于包含我们形状的图像,以便我可以在每次迭代时在空白图像上绘制一个圆圈。为此,您只需找到相对于每个圆心的欧几里得距离,并将像素设置为
true
。仅当该位置的距离小于
r
时.执行此操作后,您将只创建一个圆圈并过滤掉所有圆圈。然后您将使用
regionprops
在这个圈子里,把它加到我们的
circles_img
数组,它只包含圆圈,然后继续处理其余的圆圈。
circles_img
到目前为止看起来像:
circles_img
删除圆圈,这就是您的图像的样子。通过它自己:
imreconstruct
进行形态学重建。您可以在其中使用此图像作为种子图像,并将原始图像指定为我们正在处理的图像。形态重建的工作本质上是洪水填充。您指定种子像素、要处理的图像以及
imreconstruct
的工作来自这些种子,用白色填充,直到我们到达种子像素所在的对象的边界。因此:
out_circles = imreconstruct(circles_img, out);
regionprops
再次在此最终图像上并附加到您的
struct_reg
多变的。显然,在执行此操作之前保存原始图像的副本:
out_copy = out;
out_copy(out_circles) = false;
struct_reg = [struct_reg; regionprops(out_copy)];
regionprops
打电话是因为我不知道你在分析中到底想要什么......所以我决定给你一切。
关于matlab - 使用 MATLAB 分离图像中的两个重叠圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26906928/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!