Dans MATLAB, comment tracer une image et sauvegarder le résultat sans l'afficher?

cette question commence là où cette question se termine. MATLAB dispose d'un système d'affichage d'images puissant et flexible qui vous permet d'utiliser les commandes imshow et plot pour afficher des images complexes et ensuite 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');

ça marche 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 voulons surtout juste les sauver. Je sais que je pourrais commencer à écrire directement sur une image et ensuite sauvegarder le résultat. Mais l'utilisation de plot / rectangle / imshow est si facile, donc j'espère qu'il y a une commande qui peut me permettre d'appeler plot, imshow etc, pas afficher les résultats et ensuite enregistrer ce qui aurait été affiché. Quelqu'un connaît des solutions rapides pour ça?

alternativement, un moyen rapide de mettre un spline sur un bitmap pourrait fonctionner...

41
demandé sur Community 2009-06-08 10:42:49

5 réponses

lorsque vous créez la figure, vous mettez la propriété visible à Off .

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

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')
44
répondu Bessi 2009-06-08 12:25:21

la réponse simple à votre question est donnée par Bessi et Mr Fooz : mettez le paramètre "Visible" pour la figure à "off". Bien qu'il soit très facile d'utiliser des commandes comme IMSHOW et PRINT pour générer des chiffres, je vais résumer pourquoi je pense que ce n'est pas nécessairement la meilleure option:

  • comme l'illustre la réponse de M. Fooz, il y a beaucoup d'autres les facteurs qui entrent en jeu lorsque vous tentez de sauvegarder des chiffres sous forme d'images. Le type de sortie que vous obtenez va dépendre de nombreux paramètres de figure et d'axes, augmentant ainsi la probabilité que vous n'obtiendrez pas la sortie que vous voulez. Cela pourrait être particulièrement problématique si vos chiffres sont définis pour être invisibles, puisque vous ne remarquerez pas une différence qui pourrait être causée par un changement dans un paramètre par défaut pour la figure ou les axes. En bref, votre sortie est très sensible à un certain nombre de paramètres que vous devez 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 comme ils sont faits, vous faites probablement MATLAB faire plus de travail que ce qui est vraiment nécessaire. Les objets graphiques sont encore créés, même s'ils ne sont pas rendus. Si la vitesse est un problème, produire des images à partir de figures ne semble pas être la solution idéale.

Ma suggestion est de modifier les données d'image directement et de les enregistrer en utilisant IMWRITE . Ce n'est peut-être pas aussi facile que D'utiliser IMSHOW et d'autres solutions de pointage, mais je pense que c'est plus efficace et donne des résultats plus robustes et cohérents qui ne sont pas aussi sensibles à divers paramètres de pointage. Pour l'exemple que vous donnez, je crois que le code alternatif 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');
20
répondu gnovice 2017-05-23 12:26:23

je développe un peu la solution de Bessi. J'ai trouvé qu'il est très utile de savoir comment faire pour que l'image prenne toute la forme 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 rendre la figure à une matrice, tapez" help @avifile/addframe", puis extraire la sous-fonction appelée"getframe forfigure". C'est une fonction fournie par Mathworks qui utilise certaines façons (actuellement) non documentées d'extraire des données de figure.

4
répondu Mr Fooz 2009-06-08 12:57:28

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

si vous voulez sortir 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')

alors prouvez que ça a marché.

imshow('magic.jpg')

cela peut être fait pour indexé et RGB aussi pour différents formats de sortie.

4
répondu MatlabDoug 2009-06-08 14:39:04

vous pouvez utiliser - noFigureWindows pour désactiver tous les chiffres.

0
répondu Daniel 2015-03-17 21:54:54