检测图像中这些圆形的最快方法是什么?
半径始终在(80-100mm)之间。背景始终为白色。圆圈将始终居中。
我已经尝试过Hough Transform,但无法真正使它工作。我对此很陌生,感觉就像霍夫变换对这是一个过大的杀伤力。请给我建议正确的方法。
更新
这是我应用霍夫变换后得到的。
我已经使用了这里提到的算法。
以下是更大算法的相关代码
% 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;
有意义的圆圈是中间的圆圈。
我的建议如下:
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'
)来更好地拒绝非圆形区域。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句