改写以下代码:%% 双阈值算法检测和连接边缘
function output=edge_correct(grad,ep_min,ep_max)
grad=double(grad);
[h,w]=size(grad);
EdgeLarge = zeros(h,w);%记录真边缘
EdgeBetween = zeros(h,w);%记录可能的边缘点
for i = 1:h
for j = 1:w
if grad(i,j) >= ep_max%小于小阈值,不可能为边缘点
EdgeLarge(i,j) = grad(i,j)+80;
elseif grad(i,j) >= ep_min
EdgeBetween(i,j) = grad(i,j);
end
end
end
%把EdgeLarge的边缘连成连续的轮廓
MAXSIZE = 999999;
Queue = zeros(MAXSIZE,2);%用数组模拟队列
front = 1;%队头
rear = 1;%队尾
edge = zeros(h,w);
for i = 1:h
for j = 1:w
if EdgeLarge(i,j) > 0
%强点入队
Queue(rear,1) = i;
Queue(rear,2) = j;
rear = rear + 1;
edge(i,j) = EdgeLarge(i,j);
EdgeLarge(i,j) = 0;%避免重复计算
end
while front ~= rear%队不空
%队头出队
temp_i = Queue(front,1);
temp_j = Queue(front,2);
front = front + 1;
%8-连通域寻找可能的边缘点
%左上方
if EdgeBetween(temp_i - 1,temp_j - 1) > 0 %把在强点周围的弱点变为强点
EdgeLarge(temp_i - 1,temp_j - 1) = grad(temp_i - 1,temp_j - 1);
EdgeBetween(temp_i - 1,temp_j - 1) = 0;%避免重复计算
%入队
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
%正上方
if EdgeBetween(temp_i - 1,temp_j) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i - 1,temp_j) = grad(temp_i - 1,temp_j);
EdgeBetween(temp_i - 1,temp_j) = 0;
%入队
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j;
rear = rear + 1;
end
%右上方
if EdgeBetween(temp_i - 1,temp_j + 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i - 1,temp_j + 1) = grad(temp_i - 1,temp_j + 1);
EdgeBetween(temp_i - 1,temp_j + 1) = 0;
%入队
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
%正左方
if EdgeBetween(temp_i,temp_j - 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i,temp_j - 1) = grad(temp_i,temp_j - 1);
EdgeBetween(temp_i,temp_j - 1) = 0;
%入队
Queue(rear,1) = temp_i;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
%正右方
if EdgeBetween(temp_i,temp_j + 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i,temp_j + 1) = grad(temp_i,temp_j + 1);
EdgeBetween(temp_i,temp_j + 1) = 0;
%入队
Queue(rear,1) = temp_i;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
%左下方
if EdgeBetween(temp_i + 1,temp_j - 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i + 1,temp_j - 1) = grad(temp_i + 1,temp_j - 1);
EdgeBetween(temp_i + 1,temp_j - 1) = 0;
%入队
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
%正下方
if EdgeBetween(temp_i + 1,temp_j) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i + 1,temp_j) = grad(temp_i + 1,temp_j);
EdgeBetween(temp_i + 1,temp_j) = 0;
%入队
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j;
rear = rear + 1;
end
%右下方
if EdgeBetween(temp_i + 1,temp_j + 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i + 1,temp_j + 1) = grad(temp_i + 1,temp_j + 1);
EdgeBetween(temp_i + 1,temp_j + 1) = 0;
%入队
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
end
end
end
output=uint8(edge);
end