如何使用Matlab工具定位图像中每个可见圆形的圆心位置
Matlab自动提取图像中圆形圆心的实现方法

你可以按以下步骤完成「先追踪圆形边界、再计算圆心坐标」的需求,直接复用代码调整参数即可:
1. 图像预处理
首先对原图做去噪、二值化处理,过滤无关干扰,方便后续边界识别:
% 读取本地图像 I = imread('uDDFz.jpg'); % 彩色图转灰度图 I_gray = rgb2gray(I); % 高斯滤波去噪,避免噪点被识别为边界 I_blur = imgaussfilt(I_gray, 1.5); % 自适应二值化,适配明暗不均的图像 I_bw = imbinarize(I_blur, 'adaptive', 'ForegroundPolarity', 'dark', 'Sensitivity', 0.4); % 填充区域孔洞,移除面积小于80的噪点 I_bw = imfill(I_bw, 'holes'); I_bw = bwareaopen(I_bw, 80);
2. 圆形边界识别与圆心计算
提供两种实现方案,你可以按需选择:
方案A:霍夫圆变换(直接识别圆形)
调用Matlab内置函数直接检出所有圆形,同时返回圆心坐标、半径:
% 调整半径搜索范围,单位为像素,可根据实际圆形大小修改 radius_range = [10, 120]; % 灵敏度参数越高,越容易识别边缘模糊的圆形,可在0-1之间调整 [centers, radii] = imfindcircles(I_bw, radius_range, 'Sensitivity', 0.8, 'EdgeThreshold', 0.2);
返回的centers变量即为所有圆形的圆心坐标,每一行对应一个圆形的[x, y]像素坐标。
方案B:先追踪边界再计算形心
完全匹配你要求的「先追边界、再算圆心」逻辑:
% 提取所有连通区域的边界、形心、面积、周长属性 stats = regionprops(I_bw, 'Centroid', 'Perimeter', 'Area', 'Boundary'); % 按圆形度筛选区域:规则圆形的圆形度≈1,阈值可调整 circularity = (stats.Perimeter.^2) ./ (4 * pi * stats.Area); valid_circle_idx = circularity < 1.2; % 提取有效圆形的圆心坐标 centers = [stats(valid_circle_idx).Centroid]; centers = reshape(centers, 2, [])';
3. 结果验证
可以将识别到的圆心、边界绘制在原图上,校验准确性:
figure imshow(I) hold on % 绘制圆心,红色十字标记 plot(centers(:,1), centers(:,2), 'r+', 'MarkerSize', 12, 'LineWidth', 2) % 绘制圆形轮廓,蓝色 viscircles(centers, radii, 'Color','b') % 使用方案A时直接用返回的radii即可,方案B可自行通过区域面积计算半径 hold off
提示:如果存在漏检、误检的情况,调整代码里的二值化灵敏度、圆形度阈值、半径搜索范围即可适配你的图像。
内容的提问来源于stack exchange,提问作者Violet Shie
相关产品推荐
相关产品推荐

