bru*_*lin 16 matlab image image-processing
我想读取一个图像 - 一个圆形的图片,并计算该图像的梯度矢量场(即向量均匀指向并垂直于圆圈的向量).我的逻辑让我失望了一点,但我有:
clear all;
im = im2double(imread('littlecircle.png'));
im = double(im);
[nr,nc]=size(im);
[dx,dy] = gradient(im);
[x y] = meshgrid(1:nc,1:nr);
u = x;
v = y;
quiver(x,y,u,v)
Run Code Online (Sandbox Code Playgroud)
如果我只是简单地执行上述操作,我会得到一个矢量场,但它只是空网格的渐变(即只是渐变的矢量场y = x).我真正想要的是使用
[dx,dy] = gradient(im);
Run Code Online (Sandbox Code Playgroud)
检测图像中圆的边缘,然后根据图像中的圆计算梯度矢量场.显然,分配u = x和v = y只会给我一条直线的矢量场 - 所以基本上,我想把图像的渐变嵌入到矢量u和v中.我该怎么做?


Jor*_*rge 14
你在代码中犯了一个错误(除此之外,它工作正常).您应该替换以下内容:
u = dx;
v = dy;
Run Code Online (Sandbox Code Playgroud)
不
u = x;
v = y;
Run Code Online (Sandbox Code Playgroud)
它可以像魅力一样使用这个图像!
编辑:如果您想在图像上超级施加矢量,请执行以下操作:
clear all;
im = imread('littlecircle.png');
[nr,nc]=size(im);
[dx,dy] = gradient(double(im));
[x y] = meshgrid(1:nc,1:nr);
u = dx;
v = dy;
imshow(im);
hold on
quiver(x,y,u,v)
Run Code Online (Sandbox Code Playgroud)
请注意,我没有将im转换为double,因为imshow无法正确显示(需要uint8).根据图像尺寸的不同,您可能需要放大才能看到渐变矢量.
您可以在下面看到叠加在图像上的矢量的放大区域:

更高质量的图像在http://i.stack.imgur.com/fQbwI.jpg