No MATLAB, como faço para plotar uma imagem e salvar o resultado sem exibi-lo?

Esta questão começa quando esta questão termina. O MATLAB possui um sistema de exibição de imagens poderoso e flexível que permite usar os comandos imshow e plot para exibir imagens complexas e salvar o resultado. Por exemplo:

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

Isso funciona muito bem.

O problema é que, se você está fazendo muito image processing, ele começa a ser real arrastar para mostrar cada imagem que você cria – você principalmente quer apenas salvá-los. Eu sei que eu poderia começar a escrever diretamente para uma imagem e salvar o resultado. Mas usando plot / rectangle / imshow é tão fácil, então eu estou esperando que haja um comando que pode me deixar chamar plot, imshow etc, não exibir os resultados e, em seguida, salve o que teria sido exibido. Alguém conhece alguma solução rápida para isso?

Como alternativa, uma maneira rápida de colocar uma spline em um bitmap pode funcionar …

Quando você cria a figura, define a propriedade Visibile como Off .

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

Que no seu caso seria

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

E se você quiser ver de novo, você pode fazer

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

A resposta simples à sua pergunta é dada por Bessi e Mr Fooz : defina a configuração ‘Visível’ para a figura como ‘desativada’. Embora seja muito fácil usar comandos como IMSHOW e PRINT para gerar figuras, vou resumir porque eu acho que não é necessariamente a melhor opção:

  • Como ilustrado pela resposta do Sr. Fooz, há muitos outros fatores que entram em jogo quando se tenta salvar figuras como imagens. O tipo de saída que você obtém dependerá de muitas configurações de figura e eixos, aumentando assim a probabilidade de que você não obterá a saída desejada. Isso pode ser especialmente problemático se você tiver seus números definidos como invisíveis, já que você não perceberá alguma discrepância que possa ser causada por uma alteração na configuração padrão da figura ou dos eixos. Em suma, a sua saída torna-se altamente sensível a uma série de configurações que você teria que adicionar ao seu código para controlar sua saída, como mostra o exemplo do Sr. Fooz.

  • Mesmo se você não estiver visualizando as figuras à medida que elas são feitas, você provavelmente ainda fará com que o MATLAB faça mais trabalho do que o necessário. Objetos charts ainda são criados, mesmo que não sejam renderizados. Se a velocidade é uma preocupação, gerar imagens a partir de figuras não parece ser a solução ideal.

Minha sugestão é modificar os dados da imagem diretamente e salvá-la usando o IMWRITE . Pode não ser tão fácil quanto usar o IMSHOW e outras soluções de plotagem, mas acho que é mais eficiente e oferece resultados mais robustos e consistentes que não são tão sensíveis a várias configurações de plotagem. Para o exemplo que você dá, acredito que o código alternativo para criar um retângulo preto seria algo como isto:

 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([rc],y,x); im(index) = 0; im(index+r*c) = 0; im(index+2*r*c) = 0; imwrite(im,'image2.tif'); 

Estou expandindo um pouco a solução de Bessi. Descobri que é muito útil saber como fazer com que a imagem ocupe toda a figura e seja capaz de controlar rigidamente o tamanho da imagem de saída.

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

Se você deseja renderizar a figura em uma matriz, digite “help @ avifile / addframe” e, em seguida, extraia a subfunction chamada “getFrameForFigure”. É uma function fornecida pelo Mathworks que usa algumas formas (atualmente) não documentadas de extrair dados da figura.

Aqui está uma resposta completamente diferente:

Se você quiser um arquivo de imagem, por que não apenas salvar a imagem em vez da figura inteira?

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

Então prove que funcionou.

 imshow('magic.jpg') 

Isso pode ser feito para indexados e RGB também para diferentes formatos de saída.

Você pode usar o -noFigureWindows para desativar todos os valores.