Вычислить векторное поле градиента изображения

Я хочу прочитать изображение - изображение круга и вычислить векторное поле градиента этого изображения (т.е. векторы, указывающие равномерно и в нормальном окружности). Моя логика немного сбивает меня, но у меня есть:

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)

Если бы я просто делал это, я получаю векторное поле, но это просто градиент пустой сетки (т.е. просто векторное поле градиента y = x). Я действительно хочу использовать

[dx,dy] = gradient(im);

чтобы обнаружить края окружности в изображении, а затем вычислить векторное поле градиента из-за круга на изображении. очевидно, присваивание u = x и v = y даст мне только векторное поле прямой линии - так что в основном, я хочу встроить градиент изображения в векторы u и v. Как это сделать?

my result

image that i am getting error with

Ответы

Ответ 1

Вы ошиблись в коде (кроме этого, он отлично работает). Вы должны заменить следующее:

u = dx;
v = dy;

не

u = x;
v = y;

Он работает с этим как шармом!

EDIT: Если вы хотите супер-навязать векторы на изображении, сделайте следующее:

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)

Обратите внимание, что я не конвертирую im в double, так как он не будет отображаться корректно с imshow (требуется uint8). В зависимости от ваших размеров изображения вы можете увеличить масштаб, чтобы видеть векторы градиента.

Вы можете видеть увеличенную область векторов, наложенных на изображение, ниже:

Gradient vectors of a circle in an image

Изображение лучшего качества находится на http://i.stack.imgur.com/fQbwI.jpg