蚁群算法图像边缘提取(MATLAB)

蚁群算法用于图像边缘提取的主要思想和步骤如下:

  1. 初始化蚁群:在图像上随机产生一群蚂蚁,定义蚂蚁移动规则和信息素更新公式。

  2. 蚂蚁爬行建图:让蚂蚁按照一定概率移动规则在图像上爬行,当蚂蚁爬到边缘时,在该位置留下信息素。重复多次迭代。

  3. 信息素更新:根据蚂蚁移动路径和信息素挥发规则更新各个位置的信息素浓度。信息素主要在边缘位置聚集。

  4. 图像边缘提取:根据迭代终止条件,当蚂蚁爬行次数达到设定最大值时,提取出信息素浓度大于设定阈值的像素点,连接这些点得到图像边缘。

  5. 后处理:对提取出的边缘进行后处理,如细化、平滑等消除噪声点,使边缘连贯。

相比传统边缘检测,蚁群算法提取的边缘更连续平滑,适用于图像存在噪声或边缘不清晰的情况。但计算量较大。整体来说,蚁群算法为图像边缘提取提供了一种新的思路。

MATLAB主代码如下:

clc;clear all;close all;%清空环境变量和关闭无关窗口

%% 蚁群算法优化图像边缘检测算法 主程序

filename = 'rice';%图片名称

img=imread(filename '.png');%读取图片

%% 判断是否彩色图片或者灰度图

if size(img,3)==3%彩图的话要转换为灰度

img=rgb2gray(img);

img=double(img)./255;

else%

img=double(img)./255;

end

nrow, ncol = size(img);

a=0.5;

R=3;

deltaI=PixelGradient(img);%根据文献的公式(1)进行计算

deltaE=PixelStatisticalMean(img,R);%根据文献的公式(2)(3)(4)(5)进行计算

Eta=CalculateEta(deltaI,deltaE,a);%根据文献的公式(6进行计算

%% ---蚁群算法参数设置开始---

alpha = 1; %

beta = 0.1; %

rho = 0.1; %

phi = 0.05; %

tau0=0.0001;

% alpha = 0.5; %

% beta = 3; %

% rho = 0.2; %

% phi = 0.3; %

% tau0=0.00001;

Tau = tau0.* ones(size(img)); %信息素初始化

%% ---蚁群算法参数设置结束---

AntNumber = round(sqrt(nrow*ncol));%蚂蚁个数

AntPosition = zeros(AntNumber, 2); % 初始化记录蚂蚁的位置的矩阵

% 初始化蚂蚁位置

rand('state', sum(clock));%随机种子,防止每次运行都一样

H1 = rand(AntNumber, 2);

AntPosition(:,1) = round(1 + (nrow-1) * H1(:,1)); %行标

AntPosition(:,2) = round(1 + (ncol-1) * H1(:,2)); %列标

%% ----根据图像的大小进行定义内存长度start----

if nrow*ncol == 128*128

MyA = 40;

memoryLong = round(rand(1).*(1.15*MyA-0.85*MyA)+0.85*MyA); % memory length

elseif nrow*ncol == 256*256

MyA = 30;

memoryLong = round(rand(1).*(1.15*MyA-0.85*MyA)+0.85*MyA); % memory length

elseif nrow*ncol == 512*512

MyA = 20;

memoryLong = round(rand(1).*(1.15*MyA-0.85*MyA)+0.85*MyA); % memory length

end

%% ----根据图像的大小进行定义内存长度end-----

AntMemory = zeros(AntNumber, memoryLong);

if nrow*ncol == 128*128

Maxiternum = 300; % 迭代次数

% Maxiternum = 10;

elseif nrow*ncol == 256*256

Maxiternum = 900;

% Maxiternum = 100;

elseif nrow*ncol == 512*512

Maxiternum = 1500;

end

runNumber = 3;

%进度条

myhand01 = waitbar(0,'正在蚁群算法优化图像边缘检测算法运算......', 'tag', 'TMWWaitbar');

gen03=1;

allgen03=runNumber*Maxiternum*AntNumber;

for gen01 = 1: runNumber%循环3次

deltaTau = zeros(nrow, ncol);

for gen02 = 1: Maxiternum

deltaTauCurrent = zeros(nrow, ncol);

for k001 = 1:AntNumber

waitbar(gen03/allgen03,myhand01);%每循环一次更新一次进步条

gen03=gen03+1;

RowIndexCurrent = AntPosition(k001,1);

ColIndexCurrent = AntPosition(k001,2);

% 找出当前节点的领域

i01 = RowIndexCurrent;%行标

j01 = ColIndexCurrent;%列标

NeighborhoodIndex = [i01-1 j01-1;

i01-1 j01;

i01-1 j01+1;

i01 j01-1;

i01 j01+1;

i01+1 j01-1;

i01+1 j01;

i01+1 j01+1];%当前节点的领域集(8领域): 文献中的"其中, (k,l)∈Ω 表示像素(i, j) 8 邻域的点;"

%% 领域节点下标的合法性判断

H1 = NeighborhoodIndex(:,1)>=1 & NeighborhoodIndex(:,1)<=nrow & NeighborhoodIndex(:,2)>=1 & NeighborhoodIndex(:,2)<=ncol;%逻辑判断式,防止超出

LegalRange = NeighborhoodIndex(H1, :);

tempTau = zeros(size(LegalRange,1),1);%邻域信息素矩阵初始化

tempTranProbabilities = zeros(size(LegalRange,1),1);%转移概率矩阵初始化

for kk = 1:size(LegalRange,1)

H1 = (LegalRange(kk,1)-1)*ncol + LegalRange(kk,2);

if length(find(AntMemory(k001,:)==H1))==0 %不再蚂蚁的禁忌表内

tempTau(kk) = Eta(LegalRange(kk,1), LegalRange(kk,2));

tempTranProbabilities(kk) = Tau(LegalRange(kk,1), LegalRange(kk,2));

else %在蚂蚁的禁忌表内

tempTau(kk) = 0;

tempTranProbabilities(kk) = 0;

end

end

% 如果所有邻域都在禁忌表内,从新计算

if (sum(sum(tempTau))==0) || (sum(sum(tempTranProbabilities))==0)

for kk = 1:size(LegalRange,1)

H1 = (LegalRange(kk,1)-1)*ncol + LegalRange(kk,2);

tempTau(kk) = Eta(LegalRange(kk,1), LegalRange(kk,2));

tempTranProbabilities(kk) = Tau(LegalRange(kk,1), LegalRange(kk,2));

end

end

%转移概率:文献公式(7),未考虑w,因为w无意义,分子分母相除没有了

TransitProb = (tempTau.^alpha) .* (tempTranProbabilities.^beta) ./ (sum(sum((tempTau.^alpha) .* (tempTranProbabilities.^beta))));

rand('state', sum(100*clock));

H1 = find(cumsum(TransitProb)>=rand(1), 1);

NextRowindex = LegalRange(H1,1);

NextColIndex = LegalRange(H1,2);

if length(NextRowindex) == 0

disp('error');

end

AntPosition(k001,1) = NextRowindex;

AntPosition(k001,2) = NextColIndex;

deltaTauCurrent(AntPosition(k001,1), AntPosition(k001,2)) = 1;

%% 更新禁忌表开始

if gen02 <= memoryLong

AntMemory(k001,gen02) = (AntPosition(k001,1)-1)*ncol + AntPosition(k001,2);

elseif gen02 > memoryLong

AntMemory(k001,:) = circshift(AntMemory(k001,:),0 -1);

AntMemory(k001,end) = (AntPosition(k001,1)-1)*ncol + AntPosition(k001,2);

end

%% 更新禁忌表结束

Tau(NextRowindex,NextColIndex) = (1-rho).*Tau(NextRowindex,NextColIndex) + rho*Eta(NextRowindex,NextColIndex);%信息素局部更新,文献公式(11),(12)

end %结束蚂蚁循环

deltaTau = (deltaTau + (deltaTauCurrent>0))>0;

Tau = (1-phi).*Tau+phi*tau0; %信息素全局更新,文献公式(13)

end

end

delete(myhand01);%执行完后删除该进度条

Threshold = seperateIED(Tau); %根据信息素浓度来提取边缘的阀值

disp('蚁群算法优化提取图像边缘算法程序运行结束');

imwrite(uint8(abs((Tau>=Threshold).*255-255)), gray(256), filename 'ACO.bmp', 'bmp');

相关推荐
AI的探索之旅16 小时前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
美狐美颜SDK开放平台16 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
拉你进_教堂19 小时前
小龙虾技能之【Parkinson‘s & Epileptic Behavior Recognition Skill | 帕金森癫痫行为识别技能】简介
人工智能·计算机视觉·多模态大模型·openclaw小龙虾技能
PascalXie20 小时前
人形机器人的“眼睛“:多目视觉方案怎么选?
计算机视觉·机器人
普密斯科技20 小时前
替代传统影像仪,摄像头磨切片测量新方案实测
计算机视觉·集成测试·测量
YOLO数据集集合1 天前
天空红外小目标检测数据集 | 红外小目标 天空目标检测 无人机检测 鸟类识别 低空安防9099期
人工智能·目标检测·计算机视觉·目标跟踪·无人机·无人机视角·直升机检测
江屿风1 天前
【认识深度学习】【深度学习分类与计算机视觉任务要点解析】流食般投喂
大数据·人工智能·深度学习·计算机视觉·目标跟踪·自然语言处理·语音识别
kaixin_啊啊1 天前
Micam 多容器太吃资源?用 Go2RTC + EasyNVR 给小米摄像头换一套轻量本地录像方案
图像处理·人工智能·摄像头
浔溺1 天前
al+大数据每日学习笔记41
opencv·计算机视觉
美狐美颜SDK开放平台1 天前
直播APP源码与视频美颜sdk如何配合?一套完整开发思路
android·人工智能·计算机视觉·音视频·直播美颜sdk