% ImageSegmentation.m
% 读取图像
image = imread(‘input_image.jpg’);
image = double(image) / 255; % 将图像灰度值归一化到 [0, 1] 范围
% 初始化水平集函数
phi = ones(size(image)); % 初始水平集函数为全1矩阵
phi(40:120, 40:120) = -1; % 在感兴趣的区域内设置初始轮廓
% 设置算法参数
maxIterations = 100; % 迭代次数
dt = 0.1; % 时间步长
lambda = 1; % 正则化参数
alpha = 1; % 自适应权重参数
epsilon = 1e-5; % 防止除零错误的小常数
% 迭代优化
for iteration = 1:maxIterations
% 计算水平集函数的梯度
[phi_x, phi_y] = gradient(phi);
% 计算水平集函数的模长和法向量
phi_mag = sqrt(phi_x.^2 + phi_y.^2 + epsilon);
phi_normal_x = phi_x ./ phi_mag;
phi_normal_y = phi_y ./ phi_mag;
% 计算数据项和正则化项
dataTerm = image.*(phi_mag-1).^2 - (1-image).*(phi_mag+1).^2;
regTerm = div(phi_normal_x, phi_normal_y);
% 计算自适应权重
alphaTerm = alpha ./ (epsilon + abs(dataTerm));
% 更新水平集函数
phi = phi + dt * (lambda * regTerm + alphaTerm .* dataTerm);
% 边界处理(使水平集函数在边界处保持不变)
phi(1,:) = phi(2,:);
phi(end,:) = phi(end-1,:);
phi(:,1) = phi(:,2);
phi(:,end) = phi(:,end-1);
% 显示当前迭代结果
if mod(iteration, 10) == 0
imshow(image);
hold on;
contour(phi, [0 0], 'r', 'LineWidth', 2);
hold off;
drawnow;
end
end
% 显示最终分割结果
imshow(image);
hold on;
contour(phi, [0 0], ‘r’, ‘LineWidth’, 2);
hold off;
% 数值梯度的散度计算函数
function divergence = div(dx, dy)
[dxx, ~] = gradient(dx);
[~, dyy] = gradient(dy);
divergence = dxx + dyy;
end