2009-12-21 6 views
9

Je veux tracer une ligne d'un point bien défini à un autre et ensuite la transformer en une matrice d'image pour utiliser un filtre gaussien pour le lisser. Pour cela, j'utilise les fonctions line et getframe pour tracer une ligne et capturer la fenêtre de la figure dans une image, mais getframe est très lent et pas très fiable. J'ai remarqué qu'il ne capture rien quand l'ordinateur est verrouillé et j'ai eu une erreur out of memory après 170 exécutions.Comment créer une matrice d'image avec une ligne dessinée dans MATLAB?

Mes questions sont les suivantes:

  • Y at-il un substitut à getframe que je peux utiliser?
  • Existe-t-il un moyen de créer la matrice d'image et de tracer la ligne directement dedans?

Voici un exemple de code minimal:

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)); 

[mise à jour]

haute performance idée de Mark avec linspace semble très prometteur, mais comment puis-je accéder à coordonnées calculées la matrice avec linspace? J'ai essayé le code suivant, mais cela ne fonctionne pas comme je le pense. Je suppose que c'est une chose très simple et Matlab de base, mais je ne peux pas envelopper la tête autour de lui:

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

Alors, ce que vous faites est tramage d'une image vectorielle. Beaucoup de bonnes références sur ce sujet, Wikipedia, comme toujours, est un bon point de départ. –

+0

Je sais, mais j'essaie toujours d'utiliser les fonctions propres de Matlab. Je n'apprends pas beaucoup, mais ils sont plus rapides et je n'ai pas besoin de passer du temps à les déboguer comme mon propre code. – Framester

Répondre

15

est ici un exemple de tracer une ligne directement dans une matrice. Tout d'abord, nous allons créer une matrice de zéros pour une image vide:

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

Alors, disons que nous voulons tracer une ligne allant de (30, 35) à (200, 60). Nous allons d'abord calculer combien de pixels de long de la ligne devra être:

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 

Ensuite, on calcule les indices de ligne et de colonne pour les pixels de ligne à l'aide linspace, les convertir des indices indicés à des indices linéaires en utilisant sub2ind, puis les utiliser pour modifier 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 

Vous pouvez alors visualiser la ligne et la version filtrée à ce qui suit:

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

Merci gnovice pour votre réponse complète! – Framester

0

Quelque chose comme ceci:

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

Est-ce que cela fonctionne pour vous?

Mark

+0

Linspace semble très prometteur, mais comment accéder aux coordonnées de la matrice calculées avec linspace? J'ai essayé les 30 dernières minutes, mais le code suivant ne fonctionne pas, comme je pense qu'il devrait .. (scnr) Je suppose, c'est une chose Matlab très simple et basique, mais je ne peux pas m'en passer la tête. matrice = zéros (200,60); Diagonale = round ([linspace (30,200, numSteps); matrice (diagonale (1, :), diagonale (2,:)) = 1; imshow (matrice); – Framester

0

Vous pouvez vérifier ma réponse here. C'est un moyen robuste de réaliser ce que vous demandez. Avantage de mon approche est qu'il n'a pas besoin de paramètres supplémentaires pour contrôler densité de la ligne tracée.

3

Si vous disposez de la boîte à outils Computer Vision System, un objet ShapeInserter est disponible. Cela peut être utilisé pour dessiner des lignes, des cercles, des rectangles et des polygones sur l'image.

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

Questions connexes