如果您有图像处理工具箱,我还可以建议圆形霍夫变换通过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
默认情况下,在轮廓上绘制白色背景的圆圈。我想禁用此功能,因为您的图像有白色圆圈,并且我不想显示错误的轮廓。这是我通过上面的代码得到的结果:
因此,你可以从中得到的是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, []);
因此,每个不同灰色阴影的阴影圆圈表示用以下方法检测到的唯一圆圈imfindcircles
.
然而,对于某些硬币来说,灰色阴影可能有点模糊,因为它们融入了背景。另一种可视化的方法是对 ID 数组应用不同的颜色图。我们可以尝试使用cool
颜色图,颜色总数为唯一圆圈的数量 + 1(背景)。因此,我们可以这样做:
cmap = cool(numel(radii) + 1);
RGB = ind2rgb(IDs, cmap);
imshow(RGB);
上面的代码将创建一个颜色图,以便每个圆圈都映射到颜色中的唯一颜色cool
彩色地图。下一行应用一个映射,其中每个 ID 与一种颜色相关联ind2rgb最后我们展示了图像。
这就是我们得到的: