什么是在图像中检测这些圆形形状的最快方法?
半径始终在(80-100mm)之间。背景总是白色的。圆圈将永远在中心。
我试过Hough Transform,但我无法真正开始工作。我是新手,我感觉像 Hough Transform 这样做有点过头了。请建议我采取正确的方法来做到这一点。
更新
这是我应用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;
有意义的圆圈是中间的圆圈。
答案 0 :(得分:5)
这是我的建议:
1.转换为灰色图像,增强“与白色的区别”
gimg = min( img, [], 3 );
2.删除白色区域的阈值
BW = im2bw( gimg, .4 );
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;
您也可以考虑使用其他区域属性(例如'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
结果:
实际上这个函数也适用于Hough变换,我认为它与你的相似。您可能需要注意的一点是,与霍夫灵敏度相对应的阈值对检测结果有很大影响。太高的灵敏度导致检测到更多的圆圈,包括弱的或部分遮挡的圆圈,存在更高的错误检测率的风险,这正是您获得的。