2009-12-21 17 views
9

Quiero trazar una línea desde un punto bien definido a otro y luego convertirla en una matriz de imagen para usar un filtro Gaussiano para suavizar. Para esto utilizo las funciones line y getframe para trazar una línea y capturar la ventana de figura en una imagen, pero getframe es muy lento y poco confiable. Me di cuenta de que no captura nada cuando la computadora está bloqueada y recibí un error out of memory después de 170 ejecuciones.¿Cómo creo una matriz de imágenes con una línea dibujada en MATLAB?

Mis preguntas son:

  • ¿Hay un sustituto para getframe que puedo usar?
  • ¿Hay alguna manera de crear la matriz de imágenes y dibujar la línea directamente en ella?

Aquí es un ejemplo de código mínima:

figure1=line([30 35] ,[200 60]); 
F= getframe; 
hsize=40; sigma=20; 
h = fspecial('gaussian',hsize,sigma); 
filteredImg = imfilter(double(F.cdata), h,256); 
imshow(uint8(filteredImg)); 

[Actualización]

de alto rendimiento idea de Mark con linspace parece muy prometedor, pero ¿cómo puedo acceder a la matriz de coordenadas calculadas con linspace? Probé el siguiente código, pero no funciona como creo que debería. Asumo que es una muy simple y básica que MATLAB, pero simplemente no puedo envolver mi cabeza alrededor de ella:

matrix=zeros(200,60); 
diagonal=round([linspace(30,200,numSteps); linspace(35,60,numSteps)]); 
matrix(diagonal(1,:), diagonal(2,:))=1; 
imshow(matrix); 
+0

Por lo tanto, lo que está haciendo es rasterización una imagen vectorial de. Muchas buenas referencias sobre este tema, Wikipedia, como siempre, es un buen lugar para comenzar. –

+0

Lo sé, pero siempre trato de usar las propias funciones de Matlab. No aprendo tanto, pero son más rápidos y no tengo que pasar mucho tiempo depurándolos como mi propio código. – Framester

Respuesta

15

Aquí es un ejemplo de trazar una línea directamente en una matriz. En primer lugar, vamos a crear una matriz de ceros para una imagen vacía:

mat = zeros(250, 250, 'uint8'); % A 250-by-250 matrix of type uint8 

Entonces, digamos que queremos dibujar una línea que va desde (30, 35) a (200, 60). primero vamos a calcular el número de píxeles de largo la línea tendrá que ser:

x = [30 200]; % x coordinates (running along matrix columns) 
y = [35 60]; % y coordinates (running along matrix rows) 
nPoints = max(abs(diff(x)), abs(diff(y)))+1; % Number of points in line 

A continuación, calculamos los índices de fila y columna de los píxeles de línea utilizando linspace, convertirlos de índices subindicadas a índices lineales usando sub2ind, a continuación, utilizarlos para modificar mat:

rIndex = round(linspace(y(1), y(2), nPoints)); % Row indices 
cIndex = round(linspace(x(1), x(2), nPoints)); % Column indices 
index = sub2ind(size(mat), rIndex, cIndex);  % Linear indices 
mat(index) = 255; % Set the line pixels to the max value of 255 for uint8 types 

a continuación, puede visualizar la línea y la versión filtrada con lo siguiente:

subplot(1, 2, 1); 
image(mat);  % Show original line image 
colormap(gray); % Change colormap 
title('Line'); 

subplot(1, 2, 2); 
h = fspecial('gaussian', 20, 10); % Create filter 
filteredImg = imfilter(mat, h); % Filter image 
image(filteredImg);    % Show filtered line image 
title('Filtered line'); 

enter image description here

+0

¡Gracias a gnovice por su respuesta integral! – Framester

0

Algo como esto:

[linspace (30.200, numSteps); linspace (35,60, numSteps)]

¿Eso funciona para usted?

Marcos

+0

Linspace parece muy prometedor, pero ¿cómo puedo acceder a las coordenadas de la matriz calculadas con linspace? Intenté los últimos 30 minutos, pero el siguiente código no funciona, como creo que debería ... (scnr) Supongo que es algo muy simple y básico de Matlab, pero no puedo entenderlo. matriz = ceros (200,60); diagonal = redonda ([linspace (30,200, numSteps); linspace (35,60, numSteps)]); matriz (diagonal (1, :), diagonal (2,:)) = 1; imshow (matriz); – Framester

0

Puede consultar mi respuesta here. Es una forma robusta de lograr lo que estás pidiendo. La ventaja de mi enfoque es que no necesita parámetros adicionales para controlar densidad de la línea dibujada.

3

Si tiene la caja de herramientas del Sistema de Visión por Ordenador, hay disponible un objeto ShapeInserter. Esto se puede usar para dibujar líneas, círculos, rectángulos y polígonos en la imagen.

mat = zeros(250,250,'uint8'); 
shapeInserter = vision.ShapeInserter('Shape', 'Lines', 'BorderColor', 'White'); 
y = step(shapeInserter, mat, int32([30 60 180 210])); 
imshow(y); 

http://www.mathworks.com/help/vision/ref/vision.shapeinserterclass.html

Cuestiones relacionadas