livewire Dijkstra算法的算法适用于2 d图像

18视图(30天)
你好,伙计们。
我做我的assingment用livewire Dijkstra算法找到最短路径的2 d图像
我试图解决但我不能理解somepoint
我不能理解我在粗体和斜体标记
你能帮我吗?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
I = imread (“pout.tif”);
I2d = im2double(我);
% %
%:梯度近似
%由Sobel近似梯度G级过滤器
Sobel_width = fspecial (sobel);
Sobel_vertical = Sobel_width ';
% Sobel滤波器应用到图像
Gx = imfilter (I2d Sobel_width);
Gy = imfilter (I2d Sobel_vertical);
%计算梯度大小
G_magnitude =√Gx。* Gx + Gy。* Gy);
% %
% b: livewire
%将两个像素位置作为输入,一个起点和一个终点
p = [80];% P点
q = [200240];% Q点
%计算邻居像素之间的本地优势体重(p;问)
[MaxG、明,经销,local_weight] = localedgewidth (G_magnitude, p, q);
搜索的路径百分比8-connected每像素邻域
G = imageTograph (8);
Node1 = p (1) * (1);
Node2 = p (2) * (2);
%找到之间的路径选择的两个像素位置的最低金额
边使用Dijkstra算法的算法
[路径,path_cost] = Dijkstra算法(G, Node1, Node2);
[y_path, x_path] = ind2sub ((q (1) q(2)),路径);
% %
% c:显示
图(1)
次要情节(2、2、1)
imshow(我);
次要情节(2 2 2)
imshow (G_magnitude)
次要情节(2,2,3)
imshow (G_magnitude)
抓住
情节(p (1), (2)、“r *”,“线宽”,1,“MarkerSize”, 12)
情节(q q (1), (2)、“r *”,“线宽”,1,“MarkerSize”, 12)
推迟
次要情节(2,2,4)
%的图像显示结果的道路
imshow (G_magnitude (x_path, y_path))
图(2)
在第二个图显示4个次要情节,包括图像显示结果
路径,相应的映射到起始点的距离,与二进制图像
参观了像素为1,图像显示索引之前访问了像素地图
函数[MaxG、明Dist local_weight] = localedgewidth (G_magnitude, p, q)
MaxG = max (G_magnitude (:));
明= min (G_magnitude (:));
Dist =√sum ((p q) ^ 2));
local_weight = (MaxG-G_magnitude (q q (1), (2))) / (MaxG-MinG) * (Dist /√(2));
结束
函数[路径,path_cost] = Dijkstra算法(形象,开始,目标)
%从N个节点之间距离的图像
N =大小(图片1);
%,并且注意所有节点
参观(1:N) = 0;
%初始化所有点的距离无穷
距离(1:N) =正;
%前一节点,通知已知最好的前一个节点到每个网络节点
:1:N) = N + 1;
%初始化distsnce第一点为零
距离(开始)= 0;
而(访问)~ = N
候选人=正(1,N);
候选人(~访问)=距离(~访问);
[candidate_cost u] = min(候选人);
如果(isinf (candidate_cost))
错误(有访问顶点从源代码或零加权边缘”);
结束
访问(u) = 1;
关口=找到(图片(u,:));
cost_i =(图片(u,关口));
new_travel_cost = (u) + cost_i距离;
prev_travel_cost =距离(关口);
betterway = new_travel_cost < prev_travel_cost;
距离(关口(betterway)) = new_travel_cost (betterway);
上一页(关口(betterway)) = u;
结束
路径=目标;
而路径(1)~ =开始
如果上一页(路径(1))< = N
路径=[上一页(路径(1))路径];
其他的
错误;
结束
结束
%最终成本
path_cost =距离(目标);
结束
变长度输入宗量函数图= imageTograph (im)
如果输入参数个数= = 2)
康涅狄格州=变长度输入宗量{1};
elseif(输入参数个数= = 1)
康涅狄格州= 4;
结束
如果(康涅狄格州~ = 4 & &康涅狄格州~ = 8)
错误(“第二参数是类型的社区连接。必须4或8’);
结束
%图像大小
[M, N] =大小(im);
麦根= M * N;
%计算距离矩阵
CostVec =重塑(im (MxN 1); %堆栈列
%创建稀疏矩阵来表示图
如果(康涅狄格州= = 4)
图= spdiags (repmat (CostVec 1 4), [- M 1 1 M],麦根,麦根);
elseif(康涅狄格州= = 8)
图= spdiags (repmat (CostVec 1 8), (m1, - M - M + 1, 1, 1, M - 1, M, M + 1],麦根,麦根);
%设置正disconect顶部与底部行
图(sub2ind([麦根,麦根],(2:n - 1) * M + 1 (2: n - 1) * M - M)) = inf; %上- >下向西(m1)
图(sub2ind([麦根,麦根],(1:N) * M (1: N) * M - M + 1)) = inf; %底部- >顶部向西(M + 1)
图(sub2ind([麦根,麦根],(0:n - 1) * M + 1, (0: n - 1) * M + M)) = inf; %上- >下向东(M - 1)
图(sub2ind([麦根,麦根],(1:n - 2) * M (1: n - 2) * M + M + 1)) = inf; %底部- >顶部向东(M + 1)
结束
%设置正disconect顶部与底部行
图(sub2ind([麦根,麦根],(1:n - 1) * M + 1, (1: n - 1) * M)) = inf; %上- >下
图(sub2ind([麦根,麦根],(1:n - 1) * M (1: n - 1) * M + 1)) = inf; %下- >上
结束
4评论
沃尔特·罗伯森
沃尔特·罗伯森 2021年12月23日
提供的代码运行在R2021b对我来说,我注释掉说明文本行。
然而,我道德肯定行
Node1 = p (1) * (1);
Node2 = p (2) * (2);
是错误的。如何计算区分开始(2、5),(10)(1,1)相比,(50)?

登录置评。

答案(1)

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!