[英]finding center of cropped circle using MATLAB and no image processing toolbox
這是霍夫變換的典型應用程序,但是由於您只有一個圓,因此我們可以做得更好。
下面的代碼計算圖像的漸變。 您的聲音很大,但您的圈子也很大。 我為梯度算子使用的高斯正則化使用了一個大西格瑪(我喜歡將卷積與高斯的導數一起使用以計算導數)。 接下來,我找到梯度幅度最大的像素,並為這些點建立方程組。 我們注意到,對於每個點i ,
原點 _x + 半徑 * 梯度 x ( i )= 坐標 x ( i )
原點 _y + 半徑 * 梯度 y ( i )= 坐標 y ( i )
(很抱歉,我們無法在SO上做適當的方程式)。 坐標是該點的坐標, 漸變是該點的歸一化漸變,並且_x和_y表示向量的相應分量。 半徑可以為負,具體取決於漸變的方向。 我們可以使用MATLAB的\\
運算符求解該線性方程組。
% Load image (take only first channel, they're all the same)
img = imread('https://i.stack.imgur.com/wAwdh.jpg');
img = dip_image(img(:,:,1));
% Compute gradient
grad = gradient(img,10);
% Find N pixels with largest gradient magnitude
N = 5000;
mask = norm(grad);
mask = setborder(mask,0,50); % Don't use data close to the edge of the image
tmp = sort(double(mask(:)));
mask = mask > tmp(end-N);
index = find(mask);
value = grad(index);
value = value / norm(value);
coords = ind2sub(mask,index); % value(i) at coords(i,:)
% Solve set of linear equations
p = [ones(N,1),zeros(N,1),double(value{1})';zeros(N,1),ones(N,1),double(value{2})'] \ coords(:);
origin = p(1:2)'
radius = p(3)
rmse = sqrt(mean((origin + radius * squeeze(double(value))' - coords).^2))
% Plot some of the lines
img
hold on
for ii=1:25:N
plot(coords(ii,1)-[0,radius*double(value{1}(ii-1))],coords(ii,2)-[0,radius*double(value{2}(ii-1))],'r-')
end
輸出:
origin =
-2.5667 177.5305
radius =
322.5899
rmse =
13.8160 13.0136
如您所見,噪聲在估計梯度時會造成很多麻煩。 但是,由於每個像素的估計中沒有偏差,因此最小二乘估計應可得出准確的值。
上面的代碼使用DIPimage 3 ,它是MATLAB的開源圖像分析工具箱(Apache許可)。 您必須自己編譯它,因為我們還沒有預編譯的發行包。 您可以下載具有相同功能的DIPimage 2.9 ,盡管我不確定在上面的代碼中使用了一些新語法。 DIPimage 2.9不是開源的,並且僅可在非商業應用程序中免費使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.