在Octave的边缘上绘制渐变矢量场

时间:2017-02-05 00:58:44

标签: octave

我想计算边缘的渐变并将其绘制为Octave中的矢量,叠加到现有图像上。

我应用了Sobel算子来获得边缘。矢量似乎很好。但我想尽可能减少我的代码。并以较少的步骤实现相同的结果。

我在这里放了一些代码以便更清楚。在此先感谢您的帮助。

###########################################################################
#
# Get Panda picture
#
###########################################################################
C = imread ("C:\\Users\\Elizabeth Judith\\Desktop\\cesar\\panda.png");

###########################################################################
#
# Transform Panda picture from Colors to Gray
#
###########################################################################
G = 0.3*C(:,:,1) + 0.6*C(:,:,2) + 0.1*C(:,:,3);
imwrite(G,"C:\\Users\\Elizabeth Judith\\Desktop\\cesar\\panda_gray.png");

###########################################################################
#
# Gradient of Sobel
#
###########################################################################
Edge = edge(G,"sobel");
[gx,gy] = gradient(double(Edge));

indices = find(abs(gx)==0.5);
indices = indices(1:2:end); # To delete arrows
gx(indices) = NaN; 

indices = find(abs(gx)==0.5);
indices = indices(1:2:end); # To delete arrows
gx(indices) = NaN;

indices = find(abs(gx)==0.5);
indices = indices(1:2:end); # To delete arrows
gx(indices) = NaN;

indices = find(abs(gy)==0.5);
indices = indices(1:2:end); # To delete arrows
gy(indices) = NaN; 

indices = find(abs(gy)==0.5);
indices = indices(1:2:end); # To delete arrows
gy(indices) = NaN; 

indices = find(abs(gy)==0.5);
indices = indices(1:2:end); # To delete arrows
gy(indices) = NaN; 

###########################################################################
#
# plot gradient vectors over image
#
###########################################################################
figure;
imshow(G, []);
hold on;

###########################################################################
#
# Quiver of the gradient
#
###########################################################################
h1 = quiver(abs(gx),abs(gy));

###########################################################################
#
# To scale quiver arrows
#
###########################################################################
set(h1,'AutoScale','on', 'AutoScaleFactor', 15);

Resultant Image

1 个答案:

答案 0 :(得分:0)

还有另一种方法可以减少箭头绘制的箭头数量: https://www.mathworks.com/matlabcentral/newsreader/view_thread/306387

quiver(gx(1:2:end,1:2:end),gy(1:2:end,1:2:end))

问题是它会缩小图像,因为它占用了一半的梯度信息。因此,您可能也可以缩放背景图像,并以较少的步骤实现类似的结果。

最好的问候