假设我有这个图像,我想在(X,Y)中得到每个圆圈的中心。
在MatLab中是否有算法?
答案 0 :(得分:5)
只需拨打一次regionprops即可:
img = imread('KxJEJ.jpg'); % read the image
imgbw = ~im2bw(img,graythresh(img)); % convert to grayscale
stats = regionprops(bwlabel(imgbw), 'centroid','area'); % call regionprops to find centroid and area of all connected objects
area = [stats.Area]; % extract area
centre = cat(1,stats.Centroid); % extract centroids
centre = centre(area>10,:); % filter out dust specks in the image
现在centre
包含Nx2
数组:第一列是x位置,第二列是中心的y位置:
centre =
289.82 451.73
661.41 461.21
1000.8 478.01
1346.7 482.98
答案 1 :(得分:2)
这是使用与人造圆作为滤波器的互相关的结果。 结果是左上角的[row,column]:
>> disp(centers)
483 1347
460 662
478 1001
451 290
没有详细的评论,请提出要求。
im = rgb2gray(im2double(imread('D:/temp/circles.jpg')));
r = 117; % define radius of circles
thres_factor = 0.9; % see usage
%%
[x, y] = meshgrid(-r : r);
f = sqrt(x .^ 2 + y .^ 2) >= r;
%%
im = im - mean(im(:));
im = im / std(im(:));
f = f - mean(f(:));
f = f / std(f(:)) / numel(f);
imf_orig = imfilter(im, f, 'replicate');
%% search local maximas
imf = imf_orig;
[n_idx, m_idx] = meshgrid(1 : size(imf, 2), 1 : size(imf, 1));
threshold = thres_factor * max(imf(:));
centers = []; % this is the result
while true
if max(imf(:)) < threshold
break;
end
[m, n] = find(imf == max(imf(:)), 1, 'first');
centers = cat(1, centers, [m, n]);
% now set this area to NaN to skip it in the next iteration
idx_nan = sqrt((n_idx - n) .^ 2 + (m_idx - m) .^ 2) <= r;
imf(idx_nan) = nan;
end
答案 2 :(得分:1)
我记得在大学做过这件事,很多年前!
我们所做的是应用一个阈值并使所有东西变成黑色和白色。然后,我们将白色区域(非圆形)淹没,然后将其扩散到圆圈上。
当他们开始消失时,我们有坐标。
您还可以在圆周上选取两个点,找到它们之间的确切中间线,然后在该点绘制一条垂直线。如果新行的中间 是圆的中心。