基于粒子群算法(PSO)的灰度圖像閾值分割及多適應度函數實現
1. 算法框架設計
%% 核心流程
1. 圖像預處理 → 2. PSO參數初始化 → 3. 適應度函數計算 → 4. 粒子群迭代 → 5. 閾值輸出
2. PSO參數設置
% 粒子群參數
n_particles = 30; % 粒子數量
max_iter = 100; % 最大迭代次數
w = 0.7; % 慣性權重
c1 = 1.5; c2 = 1.5; % 學習因子
dim = 2; % 搜索維度(二閾值時為2)
lb = [0, 0]; % 下界
ub = [255, 255]; % 上界
3. 多適應度函數實現
3.1 類間方差(Otsu準則)
function fitness = otsu_fitness(thresholds, hist)
T1 = thresholds(1); T2 = thresholds(2);
w0 = sum(hist(1:T1)); w1 = sum(hist(T1+1:T2)); w2 = sum(hist(T2+1:end));
mu0 = sum((1:T1)' .* hist(1:T1)) / w0;
mu1 = sum((T1+1:T2)' .* hist(T1+1:T2)) / w1;
mu2 = sum((T2+1:end)' .* hist(T2+1:end)) / w2;
fitness = w0*w1*(mu0-mu1)^2 + w1*w2*(mu1-mu2)^2;
end
3.2 最大熵準則
function fitness = entropy_fitness(thresholds, hist)
T1 = thresholds(1); T2 = thresholds(2);
H0 = -sum((hist(1:T1)./sum(hist(1:T1))).*log2(hist(1:T1)./sum(hist(1:T1))));
H1 = -sum((hist(T1+1:T2)./sum(hist(T1+1:T2))).*log2(hist(T1+1:T2)./sum(hist(T1+1:T2))));
H2 = -sum((hist(T2+1:end)./sum(hist(T2+1:end))).*log2(hist(T2+1:end)./sum(hist(T2+1:end))));
fitness = H0 + H1 + H2;
end
3.3 區域均勻性
function fitness = region_uniformity(img, thresholds)
T1 = thresholds(1); T2 = thresholds(2);
mask1 = img < T1; mask2 = img >= T1 & img < T2; mask3 = img >= T2;
uni1 = std2(img(mask1)); uni2 = std2(img(mask2)); uni3 = std2(img(mask3));
fitness = 1 / (uni1 + uni2 + uni3 + eps);
end
3.4 梯度信息融合
function fitness = gradient_fitness(img, thresholds)
[Gx, Gy] = imgradientxy(img);
grad_mag = sqrt(Gx.^2 + Gy.^2);
T1 = thresholds(1); T2 = thresholds(2);
mask1 = grad_mag < T1; mask2 = grad_mag >= T1 & grad_mag < T2;
mask3 = grad_mag >= T2;
fitness = sum(mask1(:)) + 0.5*sum(mask2(:)) + 2*sum(mask3(:));
end
4. PSO主循環實現
%% 初始化粒子群
particles = lb + (ub-lb) .* rand(n_particles, dim);
velocities = 0.1*(ub-lb) .* (2*rand(n_particles, dim) - 1);
pbest = particles; % 個體最優
gbest = particles(1,:); % 全局最優
%% 適應度計算
fitness = arrayfun(@(i) otsu_fitness(particles(i,:), imhist(img)), 1:n_particles);
%% 迭代優化
for iter = 1:max_iter
% 更新速度
r1 = rand(n_particles, dim); r2 = rand(n_particles, dim);
velocities = w*velocities + c1*r1.*(pbest - particles) + c2*r2.*(gbest - particles);
velocities = min(max(velocities, -abs(ub-lb)), abs(ub-lb)); % 速度限制
% 更新位置
particles = particles + velocities;
particles = min(max(particles, lb), ub); % 邊界處理
% 計算新適應度
new_fitness = arrayfun(@(i) otsu_fitness(particles(i,:), imhist(img)), 1:n_particles);
% 更新個體最優
update_idx = new_fitness < fitness;
pbest(update_idx,:) = particles(update_idx,:);
fitness(update_idx) = new_fitness(update_idx);
% 更新全局最優
[min_fit, min_idx] = min(fitness);
if min_fit < otsu_fitness(gbest, imhist(img))
gbest = particles(min_idx,:);
end
% 混沌擾動(防止早熟)
if mod(iter,10) == 0
particles = tent_map(particles);
end
end
5. 多閾值擴展方法
5.1 多維PSO優化(三閾值示例)
dim = 3; % 三閾值
lb = [0, 0, 0]; ub = [255, 255, 255];
% 適應度函數改為多類間方差計算
5.2 協作學習策略
% 將高維問題分解為多個子問題
sub_swarm1 = particles(:,1:2); % 前兩個閾值
sub_swarm2 = particles(:,3:end); % 第三個閾值
% 各子群獨立優化后合并結果
參考代碼 將基本粒子群用于閾值灰度圖像分割,同時給出多種適應度函數 www.youwenfan.com/contentcnk/66080.html
6. 優化策略
-
混沌初始化:使用Logistic映射生成初始粒子群,提升全局搜索能力
function x = logistic_map(n, r=4) x = zeros(n,1); x(1) = rand(); for i=2:n x(i) = r*x(i-1)*(1-x(i-1)); end end -
動態參數調整:根據迭代次數自適應調整慣性權重
w = 0.9 - 0.5*(iter/max_iter); % 線性遞減 -
GPU加速:利用CUDA并行計算適應度
gpu_img = gpuArray(img); fitness = arrayfun(@(i) otsu_fitness(particles(i,:), imhist(gpu_img)), 1:n_particles);
浙公網安備 33010602011771號