You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无图像处理工具箱时用MATLAB定位裁剪后圆形中心

Solution for Cropped Circle Center Localization in MATLAB (No Image Processing Toolbox)

Great question—since you have uniform, low-noise images with a known circle radius, we can build a robust solution using only core MATLAB functions, no toolboxes required. Let's break this down into actionable steps:

Step 1: Leverage Your Image's Unique Traits

Your images have two distinct uniform regions: the cropped circle and the background. This means we can easily separate them with simple thresholding, no fancy edge detection needed. The known radius is our secret weapon—it lets us use a constrained least-squares fit that’s far more accurate than fitting a full circle from scratch.

Step 2: Load and Prep the Image

First, read your grayscale image and convert it to a double-precision matrix for smooth calculations:

% Load the image (replace with your file path)
img = imread('sample_circle_image.png');
img = double(img); % Convert to double for arithmetic operations

Step 3: Threshold to Isolate the Circle

Since both the circle and background are uniform, their grayscale histogram will have two sharp peaks. We’ll use this to find a threshold that cleanly separates the two regions:

% Compute histogram to identify peaks
[counts, bin_edges] = histcounts(img, 256);
bin_centers = (bin_edges(1:end-1) + bin_edges(2:end))/2;

% Find the two highest peaks (background and circle)
[sorted_counts, sorted_indices] = sort(counts, 'descend');
peak1 = bin_centers(sorted_indices(1));
peak2 = bin_centers(sorted_indices(2));

% Set threshold as the midpoint between the two peaks
threshold = mean([peak1, peak2]);

% Create a binary mask: 1 = circle region, 0 = background
% Flip the operator (<= vs >=) if your circle is darker than the background
mask = img > threshold;

Step 4: Extract Circle Pixel Coordinates

Use MATLAB’s built-in find function to grab the (x,y) coordinates of all pixels in the circle region:

% Note: In MATLAB, matrix rows = y-coordinates, columns = x-coordinates
[y_coords, x_coords] = find(mask);

Step 5: Constrained Least-Squares Fit for the Center

We know the radius r (e.g., ~350 pixels for 700x700 images). For each circle pixel (x,y), the circle equation is:
$$(x - a)^2 + (y - b)^2 = r^2$$
where (a,b) is the center we want to find. Rearranging this into a linear form lets us solve for a and b even with cropped edges:

% Replace with your known radius
r = 350;

% Build the linear system: 2*a*x + 2*b*y = x² + y² - r²
n = length(x_coords);
A = [2*x_coords, 2*y_coords];
b_vector = x_coords.^2 + y_coords.^2 - r^2;

% Solve the overdetermined system using least squares (no toolboxes needed)
center_params = (A' * A) \ (A' * b_vector);

% Extract center coordinates
center_x = center_params(1);
center_y = center_params(2);

% Optional: Print the result
fprintf('Circle center: (%.2f, %.2f)\n', center_x, center_y);

Step 6: Batch Process All 2000 Images

To automate processing for your entire dataset, wrap the above steps in a loop:

% Define your image folder and radius
image_folder = 'path/to/your/images/';
r = 350;
image_files = dir(fullfile(image_folder, '*.png')); % Adjust extension as needed

% Initialize array to store centers
centers = zeros(length(image_files), 2);

for i = 1:length(image_files)
    % Load image
    img_path = fullfile(image_folder, image_files(i).name);
    img = double(imread(img_path));
    
    % Thresholding (same as Step 3)
    [counts, bin_edges] = histcounts(img, 256);
    bin_centers = (bin_edges(1:end-1) + bin_edges(2:end))/2;
    [sorted_counts, sorted_indices] = sort(counts, 'descend');
    peak1 = bin_centers(sorted_indices(1));
    peak2 = bin_centers(sorted_indices(2));
    threshold = mean([peak1, peak2]);
    mask = img > threshold;
    
    % Extract coordinates
    [y_coords, x_coords] = find(mask);
    
    % Fit center
    n = length(x_coords);
    A = [2*x_coords, 2*y_coords];
    b_vector = x_coords.^2 + y_coords.^2 - r^2;
    center_params = (A' * A) \ (A' * b_vector);
    
    % Store results
    centers(i, :) = [center_params(1), center_params(2)];
end

% Save centers to a CSV file (optional)
writematrix(centers, 'circle_centers.csv');

Quick Tips for Success

  • Threshold Tweak: If your circle is darker than the background, swap img > threshold to img < threshold.
  • Robustness: Even if the circle is heavily cropped, this method will work as long as you have at least 3 valid pixels (you’ll have way more with your 700x700 images).
  • Speed: Core MATLAB functions are optimized, so processing 2000 images should take just a few minutes.

内容的提问来源于stack exchange,提问作者Gabe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:49:41