💥1 概述
本文为Storn和Price制定的著名差分进化计算智能算法的实现。该算法使用Otsu准则作为适应度函数,可用于使用多个阈值对灰度图像进行阈值设置。
该程序旨在生成任何灰度图像的0到255级直方图,然后尝试找到阈值,在该阈值下,图像可以最佳地分离为属于图像前景的像素和属于图像背景的像素。最佳阈值的评估使用Otsu标准进行,阈值的Otsu适应度作为“类间方差”返回。值越高,适合度越好。差分进化保持生成1到256范围内的阈值,并评估图像的阈值的适合性。使用突变和交叉,一代又一代地选择更为理想的阈值。用户可以选择运行多个试验,并选择这些试验中的最佳阈值,并显示分割图像以及直方图和阈值的位置。
📚2 运行结果
🎉3 参考文献
[1]刘波,王凌,金以慧.差分进化算法研究进展[J].控制与决策,2007(07):721-729.DOI:10.13195/j.cd.2007.07.3.liub.001.
👨💻4 Matlab代码
主函数部分代码:
% This is the main file for running Differential Evolution clc;clear all;close all; images = {'lena_gray.png', 'barbara_gray.bmp'}; imgName = char(images(1)); infor = imfinfo(imgName); disp(infor); [I, colormap] = imread(imgName); if isempty(colormap), I = rgb2gray(I); else I = ind2gray(I, colormap);end I = im2uint8(I); searchSpace = imhist(I); %-----Control panel thresh = 8;%the number of thresholds population = 30;%the number of vectors masterBeta = 2.0;%beta is real number belongs to [0 -> 2] cr = 0.3;%crossover probability range [0 -> 1] generations = 200; numTrials = 1; if population < 4, disp('Population should be more than 3');return;end minThresh = 1; maxThresh = numel(searchSpace); figNum = 1; figure(figNum);clf;figNum=figNum+1;imshow(I);title('Original image'); %figure(figNum);clf;figNum=figNum+1;imhist(I);title(strcat('histogram of : ',imgName)); %OtsuThreshold = graythresh(I);II = im2bw(I);imshow(II);title('Otsu thresholded image'); runtime = []; fitStore = []; bestThresholdAmongTrials = []; bestFitnessAmongTrials = 0; tempBestFitnessAmongTrials = 0; fastestGenerationForBestFitness = 0; for aTrial = 1:numTrials tic; tempFitStore = []; vBeta = masterBeta;%variable beta fprintf('Trial: %d\n', aTrial); X = floor(minThresh + (maxThresh - minThresh) * rand(thresh, population)); U = X; generationAtBestFit = [0 0];%stores generation and best fitness spaceSize = size(searchSpace, 1); totalPixels = sum(searchSpace); normProba = searchSpace ./ totalPixels;%normalized probabilities if thresh < 1 || thresh > spaceSize, disp('Thresholds should be in a range of 1 to 256');return;end %-----Get an initial Fitness [fitnessX, X] = OtsuFitness(X, spaceSize, totalPixels, normProba); [val, fittest] = max(fitnessX);