【问题标题】:finding center of cropped circle using MATLAB and no image processing toolbox使用 MATLAB 找到裁剪圆的中心,没有图像处理工具箱
【发布时间】:2018-09-04 18:18:13
【问题描述】:

我有一大组图像(约 2000 张)显示了裁剪圆圈的灰度图片。每张图片都是一个背景清晰的圆圈。图像是均匀的,背景也是如此。图像几乎没有噪音。图片大小约为 700x700 像素。

某些图像被裁剪,因为其中一部分超出了图像边界。圆圈大约是图像的 1/2 大小。

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

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

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

谢谢!

【问题讨论】:

  • 如果你没有图像处理工具,就当你拥有它,自己编写函数代码
  • “几乎不吵”!提醒我不要向您购买相机传感器! ;-)
  • 还有“这些用过的内衣被测量了几次”。
  • 我认为 Cris 的方法要严谨得多,但是通过使用中值滤波器去噪,然后进行双色量化,然后进行边缘检测,我得到了相当合理的结果。这让我在黑色背景上有一堆白点。然后我可以随机取3个白点,找到知道圆周上3个点的中心。如果取 3 个点并求解几次,则可以以 x,y 值的中值为中心。在终端中使用 ImageMagick 大约需要 3 行,它是免费的,在 Linux、macOS 和 Windows 上运行。
  • @MarkSetchell:这实际上可能是一个更好的解决方案。取我在答案中找到的点,但忽略渐变,只需将一个圆拟合到这些点。我应该想到的...... :)

标签: matlab image-processing center geometry


【解决方案1】:

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

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

原点_x + 半径 * 梯度_x(i) = 坐标_x(

原点_y + 半径 * 梯度_y(i) = 坐标_y(

(抱歉,我们无法对 SO 做适当的方程式)。 coordinate是该点的坐标,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

如您所见,噪声会给估计梯度带来很多麻烦。但是因为每个像素的估计没有偏差,所以最小二乘估计应该会得到一个准确的值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多