在MATLAB中检测图像内的圆形

时间:2013-12-05 13:08:18

标签: matlab image-processing shape

什么是在图像中检测这些圆形形状的最快方法?

Red Circle to be detected

半径始终在(80-100mm)之间。背景总是白色的。圆圈将永远在中心。

我试过Hough Transform,但我无法真正开始工作。我是新手,我感觉像 Hough Transform 这样做有点过头了。请建议我采取正确的方法来做到这一点。 enter image description here


更新

这是我应用hough变换后得到的结果。

我使用了here提到的算法。

以下是较大算法的相关代码

% applying Hough Below
[accum, circen, cirrad] = ...
    CircularHough_Grd(gR, [89 93],...
    17.4, 13, 1);   % this executes in 0.72 sec

% Lets see what we got
imshow(gR);
hold on;
plot(circen(:,1), circen(:,2), 'r+');
for ii = 1 : size(circen, 1)
    rectangle('Position',[circen(ii,1) - cirrad(ii), circen(ii,2) - cirrad(ii), 2*cirrad(ii), 2*cirrad(ii)],...
        'Curvature', [1,1], 'edgecolor', 'b', 'linewidth', 1.5);
end
hold off;

enter image description here

有意义的圆圈是中间的圆圈。

2 个答案:

答案 0 :(得分:5)

这是我的建议:
 1.转换为灰色图像,增强“与白色的区别”

gimg = min( img, [], 3 );

enter image description here
 2.删除白色区域的阈值

BW = im2bw( gimg, .4 ); 

enter image description here
 3.获取图像区域的区域和质心属性

st = regionprops( ~BW, 'Area', 'Centroid', 'PixelIdxList' );

4。只选择足够大的区域

sel = [st.Area] > numel(BW)*0.025; % at least 2.5% of image size
st = st(sel);

5。计算区域到图像中心的距离

cntr = .5 * [size(BW,2) size(BW,1)]; % X-Y coordinates and NOT Row/Col
d = sqrt( sum( bsxfun(@minus,vertcat( st.Centroid ), cntr ).^2, 2 ) );

6。选择离中心最近的地区

[mn idx] = min(d);

7。创建一个掩码

res = false(size(BW)); 
res( st(idx).PixelIdxList ) = true;

enter image description here

您也可以考虑使用其他区域属性(例如'Eccentricity')来更好地拒绝非圆形区域。

答案 1 :(得分:4)

如果您的matlab版本是R2012a或更高版本,则图像处理工具框包含用于检测图像中圆圈的函数imfindcircles

filen='http://i.stack.imgur.com/pmBp1.jpg';  % your original image
I=imread(filen);

I=im2bw(I(:,:,3));  % convert to gray scale
Rmin=50;Rmax=100;  % circle radius range
[centersDark, radiiDark] = imfindcircles(I, [Rmin Rmax], ...
                                        'ObjectPolarity','dark','sensitivity',0.93)
imagesc(I),hold on
viscircles(centersDark, radiiDark,'LineStyle','--');hold off

结果: enter image description here

实际上这个函数也适用于Hough变换,我认为它与你的相似。您可能需要注意的一点是,与霍夫灵敏度相对应的阈值对检测结果有很大影响。太高的灵敏度导致检测到更多的圆圈,包括弱的或部分遮挡的圆圈,存在更高的错误检测率的风险,这正是您获得的。