2012-05-02 18 views
16

Quiero leer en una imagen, una imagen de un círculo, y calcular el campo de vector de gradiente de esa imagen (es decir, vectores que apuntan uniformemente y en forma normal al círculo). Mi lógica me está fallando un poco, pero tengo:Calcular el campo de vector de degradado de una imagen

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) 

si tuviera que simplemente hacer lo anterior, aparece un campo vectorial, pero es simplemente la pendiente de una malla vacía (es decir, sólo un campo vectorial del gradiente y = x). Lo que realmente quiero es utilizar

[dx,dy] = gradient(im); 

para detectar los bordes del círculo en la imagen, y luego calcular el campo vectorial gradiente por el círculo en la imagen. Obviamente, asignar u = x y v = y solo me dará el campo vectorial de una línea recta, así que bascialmente, quiero incrustar el gradiente de la imagen en los vectores uy v. ¿Cómo hago esto?

my result

image that i am getting error with

+0

Se puede publicar littlecircle.png? –

Respuesta

13

Usted ha cometido un error en el código (aparte de eso, funciona muy bien). Debe reemplazar la siguiente:

u = dx; 
v = dy; 

no

u = x; 
v = y; 

Funciona con this imagen como un encanto!

EDIT: Si desea superponer los vectores en la imagen, a continuación, hacer lo siguiente:

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) 

en cuenta que no me convierto la im para doblar, ya que no aparezcan correctamente con imshow (necesita uint8). Dependiendo de las dimensiones de su imagen, es posible que desee ampliar para ver los vectores de graduación.

Se puede ver una zona ampliada de los vectores superpuestos sobre la imagen, a continuación:

Gradient vectors of a circle in an image

mejor calidad de imagen está en http://i.stack.imgur.com/fQbwI.jpg

+0

Gracias por la respuesta. Sin embargo, creo que no he explicado el problema lo suficiente. los vectores de gradiente que se producen en mi código, y también su código no son los vectores de gradiente causados ​​por el círculo en la imagen. El campo de gradiente producido debe apuntar hacia afuera y en forma normal al círculo. para que veas, no quiero simplemente tener u = x, sino u = el gradiente del dominio de la imagen en la dirección x. – brucezepplin

+0

si ejecuta este código borrar todo; im = imread ('littlecircle.png'); im = im (:,:, 1); im = doble (im); [nr, nc] = tamaño (im); [dx, dy] = gradiente (im); carcaj (dx, dy); en cualquier imagen que te guste, verás lo que busco (mira cómo es la trama de la aljaba). aunque aquí simplemente estoy devolviendo una parcela de campo escalar. Sin embargo, me gustaría devolver el campo vector real y usar el campo vectorial más adelante en mi programa. – brucezepplin

+0

No estoy seguro de lo que quiere hacer. En el código publiqué los vectores * do * apuntando hacia afuera desde el círculo (adjunté una captura de pantalla ampliada).Por supuesto, dado que tienes una rutina computacional que calcula el grad en un espacio discreto (imagen), los vectores no pueden ser absolutamente normales para el círculo debido a la cuantificación, es decir, no esperes ver vectores grad "perfectos" como si se hubieran calculado analíticamente para un dado círculo matemático. – Jorge

Cuestiones relacionadas