41 votes

Dans MATLAB, comment puis-je tracer une image et enregistrer le résultat sans l'afficher?

Ce genre de question commence où cette question se termine. MATLAB est un outil puissant et flexible d'affichage de l'image système qui vous permet d'utiliser la imshow et le tracé des commandes pour afficher des images plus complexes, puis enregistrer le résultat. Par exemple:

im = imread('image.tif');
f = figure, imshow(im, 'Border', 'tight');
rectangle('Position', [100, 100, 10, 10]);
print(f, '-r80', '-dtiff', 'image2.tif');

Cela fonctionne très bien.

Le problème est que si vous faites beaucoup de traitement d'image, il commence à être réel, faites-le glisser pour afficher chaque image que vous créez - vous, la plupart veulent juste sauver. Je sais que je pourrais commencer directement par écrit à l'image, puis enregistrer le résultat. Mais l'utilisation de la parcelle/rectangle/imshow est si facile, alors j'espère que il y a une commande qui peut me le faire appel de la parcelle, imshow etc, de ne pas afficher les résultats, puis les enregistrer ce qui aurait été affiché. Quelqu'un sait tout des solutions rapides pour cela?

Sinon, un moyen rapide de mettre une spline sur une image bitmap peut fonctionner...

44voto

Bessi Points 567

Lorsque vous créez la figure, vous définissez la propriété Visibile sur Off .

 f = figure('visible','off')
 

Ce qui dans votre cas serait

 im = imread('image.tif');
f = figure('visible','off'), imshow(im, 'Border', 'tight');
rectangle('Position', [100, 100, 10, 10]);
print(f, '-r80', '-dtiff', 'image2.tif');
 

Et si vous voulez le revoir, vous pouvez le faire

 set(f,'visible','on')
 

20voto

gnovice Points 70970

La réponse simple à votre question est donnée par Bessi et M. Fooz: définir le "Visible" paramètre de la figure de "off". Même s'il est très facile à utiliser des commandes comme IMSHOW et d'IMPRESSION pour générer des chiffres, je vais résumer pourquoi je pense qu'il n'est pas forcément la meilleure option:

  • Comme illustré par M. Fooz réponse, il y a beaucoup d'autres facteurs qui entrent en jeu lorsque vous essayez d'enregistrer des chiffres que des images. Le type de sortie que vous obtenez est va être dépend de beaucoup de figure et de paramètres des axes, augmentant ainsi la probabilité que vous n'obtiendrez pas le résultat que vous souhaitez. Cela pourrait être particulièrement problématique si vous avez vos chiffres pour être invisible, car vous n'aurez pas remarquer de différence qui pourrait être causé par un changement dans un paramètre par défaut pour la figure ou des haches. En bref, votre sortie est très sensible à un certain nombre de paramètres que vous devrez ajouter à votre code pour contrôler votre sortie, comme M. Fooz le montre l'exemple de.

  • Même si vous ne regardez pas les chiffres tels qu'ils sont fait, vous êtes probablement encore faire MATLAB faire plus de travail que ce qui est vraiment nécessaire. Les objets graphiques sont toujours créé, même si elles ne sont pas rendus. Si la vitesse est un sujet de préoccupation, générer des images à partir des chiffres ne semble pas être la solution idéale.

Ma suggestion est de modifier les données d'image directement et enregistrer à l'aide des IMWRITE. Il peut ne pas être aussi facile que l'utilisation de IMSHOW et d'autres traçage des solutions, mais je pense que c'est plus efficace et offre plus robuste et cohérente des résultats qui ne sont pas aussi sensibles à différents paramètres de tracé. Pour l'exemple que vous donnez, je crois que l'alternative de code pour créer un rectangle noir ressemblerait à quelque chose comme ceci:

im = imread('image.tif');
[r,c,d] = size(im);
x0 = 100;
y0 = 100;
w = 10;
h = 10;
x = [x0:x0+w x0*ones(1,h+1) x0:x0+w (x0+w)*ones(1,h+1)];
y = [y0*ones(1,w+1) y0:y0+h (y0+h)*ones(1,w+1) y0:y0+h];
index = sub2ind([r c],y,x);
im(index) = 0;
im(index+r*c) = 0;
im(index+2*r*c) = 0;
imwrite(im,'image2.tif');

4voto

Mr Fooz Points 21092

Je développe un peu la solution de Bessi ici. J'ai trouvé qu'il était très utile de savoir comment faire en sorte que l'image occupe toute la figure et de pouvoir contrôler étroitement la taille de l'image de sortie.

 % prevent the figure window from appearing at all
f = figure('visible','off'); 
% alternative way of hiding an existing figure
set(f, 'visible','off'); % can use the GCF function instead

% If you start getting odd error messages or blank images,
% add in a DRAWNOW call.  Sometimes it helps fix rendering
% bugs, especially in long-running scripts on Linux.
%drawnow; 

% optional: have the axes take up the whole figure
subplot('position', [0 0 1 1]); 

% show the image and rectangle
im = imread('peppers.png');
imshow(im, 'border','tight');
rectangle('Position', [100, 100, 10, 10]);

% Save the image, controlling exactly the output
% image size (in this case, making it equal to 
% the input's). 
[H,W,D] = size(im);
dpi = 100;
set(f, 'paperposition', [0 0 W/dpi H/dpi]);
set(f, 'papersize', [W/dpi H/dpi]);
print(f, sprintf('-r%d',dpi), '-dtiff', 'image2.tif');
 

Si vous souhaitez convertir la figure en matrice, tapez "help @ avifile / addframe", puis extrayez la sous-fonction appelée "getFrameForFigure". C'est une fonction fournie par Mathworks qui utilise des méthodes (actuellement) non documentées d'extraction de données de figure.

4voto

MatlabDoug Points 4587

Voici une réponse complètement différente:

Si vous voulez un fichier image, pourquoi ne pas simplement sauvegarder l'image au lieu de la figure entière?

 im = magic(10)
imwrite(im/max(im(:)),'magic.jpg')
 

Prouvez ensuite que cela a fonctionné.

 imshow('magic.jpg')
 

Cela peut être fait pour l'indexé et le RVB également pour différents formats de sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X