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

16

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

<code>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)
</code>

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

<code>[dx,dy] = gradient(im);
</code>

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

my result

image that i am getting error with

Можете ли вы опубликовать littlecircle.png? Andrey Rubshtein

Ваш Ответ

1   ответ
14

он работает нормально). Вам следует заменить следующее:

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). В зависимости от размеров изображения вы можете увеличить изображение, чтобы увидеть векторы градаций.

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

Лучшее качество изображения наhttp: //i.stack.imgur.com/fQbwI.jp

Хорошо, я вижу проблему. Вы разместили изображение rgb, тогда как код работает только с изображениями в градациях серого. Таким образом, вы должны конвертировать его, используя: im = rgb2gray (imread ('littlecircle.png')), и он отлично работает. Jorge
Спасибо за ответ. Однако я думаю, что я не объяснил проблему достаточно подробно. векторы градиента, которые создаются в моем коде, а также ваш код не являются векторами градиента, вызванными окружностью на изображении. Полученное поле градиента должно быть направлено наружу и перпендикулярно окружности. так что вы видите, я не просто хочу, чтобы u = x, а скорее u = градиент области изображения в направлении x. brucezepplin
Еще одно замечание относительно векторного поля. Градиент (Im) действительно возвращает вектор поле. Например, в [dx, dy] = градиент (im) dx и dy являются матрицами с такими же размерами, что и im. Например, если im 200x300, то и dx, dy. Они представляют компоненты x и y векторов града в каждой точке. Таким образом, для точки (123,245) на изображении вектор градиента имеет вид v = [dx (123,245), dy (123,245)]; Конечно, так как вы хотите использовать вектор Поле вам также понадобятся координаты базового пространства, то есть матрицы x, y. Jorge
если вы запускаете этот код, очистите все; im = imread ('littlecircle.png'); im = im (:,:, 1); im = double (im); [NR, NC] = размер (им); [dx, dy] = градиент (im); Колчан (Dx, Dy); на любом понравившемся изображении вы увидите, что я ищу (посмотрите, как выглядит колчан). хотя здесь я просто возвращаю квиверплот скалярного поля. Однако я хотел бы вернуть фактическое векторное поле и использовать векторное поле позже в моей программе. brucezepplin
Я не уверен, что ты хочешь делать. В коде я разместил векторыделат Направьте наружу из круга (я добавил увеличенный скриншот). Конечно, поскольку у вас есть вычислительная процедура, которая вычисляет град в дискретном пространстве (изображение), векторы не могут быть абсолютно нормальными к кругу из-за квантования, т.е. не ожидайте увидеть «идеальные» векторы града, как если бы они были вычислены аналитически для заданный математический круг. Jorge

Похожие вопросы