对图像进行圆形包装外围检测

时间:2016-12-07 02:21:37

标签: matlab

我有一张图片如下

Circle packing

我创建了一个matlab代码,可以检测圆周上的像素并创建一个整数掩码,这样我就可以用C ++代码导入它。这是一个主要算法的片段。 (我使用imread并将图像存储在N X N数组中

    for i=1:nx
    for j=1:ny
             if (wholeGeom(j,i) == 255)
                B(j,i) = 1;
             elseif ((wholeGeom(j,i) == 0)&& ...
                     ((i==1||i==nx) && j>1 && j<nx)&& ...
                     (wholeGeom(j+1,i)==255 || ...
                      wholeGeom(j-1,i)==255) )
                    B(j,i) = 2;
             elseif ((wholeGeom(j,i) == 0)&& ...
                     ((j==1||j==nx) && i>1 && i<nx)&& ...
                     (wholeGeom(j,i+1)==255 || ...
                      wholeGeom(j,i-1)==255) )
                    B(j,i) = 2;   
             elseif ((wholeGeom(j,i) == 0)&& ...
                     (i>1 && j>1 && i<nx && j<nx)&& ...
                     (wholeGeom(j+1,i)==255 || ...
                     wholeGeom(j-1,i)==255 ||...
                     wholeGeom(j,i+1)==255 ||...
                     wholeGeom(j,i-1)==255) )
             else
                   B(j,i) = 0;

这适合我。我的输出如下

BounceBack Nodes

我只是想知道是否有更有效的方法来做到这一点,尤其是在matlab上......任何建议都会受到赞赏

2 个答案:

答案 0 :(得分:0)

确实,形态学操作是你的朋友。 Morphological operations是处理二进制图像的非常快速的工具。您可以imdilate使用"dilate"图片,即&#34;加厚&#34;图像中的所有对象。

% Load image
wholeGeom = rgb2gray(imread('https://i.stack.imgur.com/Jt4TC.png'));

% Threshold to make image binary
wholeGeom = wholeGeom > 128;

% Dilate image, i.e. add 1 pixel to each side of an object
borders = imdilate(wholeGeom, [0,1,0;1,1,1;0,1,0]);

% Set borders to 2 and everything inside object to 1
result = 2*borders - wholeGeom;

结果(放大以使边框更加明显):

result

答案 1 :(得分:0)

找到任何形式的参数形状的更真实方法是使用Hough Transforms,它使用投票机制在图像中查找任何类型的参数形状。在这种情况下,您可以使用:

%imfindcircles internally uses Hough Transforms
centers = imfindcircles(img,radius)  
[centers,radii] = imfindcircles(img,radiusRange)