使用MATLAB找到裁剪圆的中心,没有图像处理工具箱

时间:2018-03-26 14:44:53

标签: matlab image-processing center geometry

我有一大组图像(~2000),显示了裁剪圆圈的灰度图像。每个图像都是一个背景清晰的圆圈。图像是同质的,背景也是如此。图像几乎没有嘈杂。图像大小约为700x700像素。

一些图像被裁剪,因为它们中的一部分位于图像边界之外。圆圈大约是图像的1/2尺寸。

enter image description here

我有Matlab,但没有图像处理工具箱。

我有关于图像半径的先验信息。我希望从算法中接收它以进行验证,但我可以先验地使用它。

如何获得圆圈的中心和半径?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是Hough变换的典型应用,但由于你只有一个圆,我们可以做得更好。

下面的代码计算图像的渐变。你有很多噪音,但你的圈子也很大。我正在使用一个大的sigma进行梯度算子使用的高斯正则化(我喜欢使用带有高斯导数的卷积来计算导数)。接下来,我找到具有最大梯度幅度的像素,并为这些点建立方程组。我们注意到,对于每个点 i

原点 _x + radius * gradient_x i )= coordinate_x I 的)

原点 _y + radius * gradient_y i )= coordinate_y I 的)

(对不起,我们没有在SO上做正确的方程式)。 坐标是该点的坐标, gradient 是该点的标准化渐变, _x _y 表示矢量的相应分量。 radius 可以是负数,具体取决于渐变的方向。我们可以用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

result of plot

如您所见,噪音会导致估算渐变的麻烦。但是因为每个像素的估计没有偏差,所以最小二乘估计应该得到准确的值。

上面的代码使用DIPimage 3,这是一个用于MATLAB(Apache License)的开源图像分析工具箱。你必须自己编译,因为我们还没有预编译的发布包。你可以改为下载具有相同功能的DIPimage 2.9,虽然我可能在上面的代码中使用了一些新语法,但我不确定。 DIPimage 2.9不是开源的,只能在非商业应用程序中免费使用。