2009-06-08 7 views
41

To pytanie zaczyna się, gdy kończy się this question. MATLAB ma potężny i elastyczny system wyświetlania obrazu, który pozwala używać poleceń imshow i plot do wyświetlania złożonych obrazów, a następnie zapisać wynik. Na przykład:W programie MATLAB w jaki sposób wykreślić obraz i zapisać wynik bez wyświetlania go?

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

Działa to świetnie.

Problem polega na tym, że jeśli przetwarzasz dużo obrazów, zaczyna się prawdziwe przeciąganie, aby pokazać każdy obraz, który tworzysz - zazwyczaj chcesz je po prostu zapisać. Wiem, że mógłbym zacząć pisać bezpośrednio na obrazie, a następnie zapisać wynik. Ale użycie plot/rectangle/imshow jest takie proste, więc mam nadzieję, że istnieje polecenie, które pozwala mi wywoływać fabułę, wyświetlać itp., Nie wyświetlać wyników, a następnie zapisywać, co by było wyświetlane. Czy ktoś zna jakieś szybkie rozwiązania?

Alternatywnie szybki sposób umieścić splajn na bitmapy mogą działać ...

Odpowiedz

41

Podczas tworzenia rysunku można ustawić visibile właściwość Off.

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

które w danym przypadku byłoby

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

A jeśli chcesz, żeby go zobaczyć znowu można zrobić

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

mam rozszerzenie na rozwiązanie tutaj Bessi trochę. Odkryłem, że bardzo pomocne jest wiedzieć, w jaki sposób uzyskać obraz zajmujący całą figurę i móc ściśle kontrolować rozmiar obrazu wyjściowego.

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

Jeśli chcesz, aby uczynić rysunek do matrycy typu "help @ avifile/ADDFRAME", a następnie wyodrębnić podrzędną o nazwie "getFrameForFigure". Jest to funkcja dostarczana przez Mathworks, która wykorzystuje niektóre (obecnie) nieudokumentowane sposoby wyodrębniania danych z rysunku.

4

Tutaj jest zupełnie inna odpowiedź:

Jeśli chcesz złożyć się obraz, dlaczego nie wystarczy zapisać obraz zamiast całą figurę?

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

Następnie udowodnij, że zadziałało.

imshow('magic.jpg') 

Można to zrobić dla indeksowanych i RGB również dla różnych formatów wyjściowych.

20

Prosta odpowiedź na twoje pytanie jest podana przez Bessi i Mr Fooz: ustaw "Widoczne" dla cyfry "wyłącz". Chociaż jest to bardzo prosty w użyciu komendy jak IMSHOW i PRINT do generowania liczb, będę podsumowywać dlatego myślę, że to nie koniecznie najlepszym rozwiązaniem:

  • Jak ilustruje odpowiedź pana Fooz jest, istnieje wiele innych czynników, które pochodzą do gry, próbując zapisać figurki jako obrazy. Rodzaj uzyskanego wyniku będzie zależał od wielu ustawień liczby i osi, zwiększając tym samym prawdopodobieństwo, że nie uzyskasz pożądanego wyniku.Może to być szczególnie problematyczne, jeśli masz ustawione liczby niewidoczne, ponieważ nie zauważysz pewnej rozbieżności, która może być spowodowana zmianą domyślnego ustawienia liczby lub osi. Krótko mówiąc, twoje dane wyjściowe stają się bardzo wrażliwe na wiele ustawień, które musiałbyś następnie dodać do swojego kodu, aby kontrolować twoje wyniki, jak pokazuje przykład pana Fooza.

  • Nawet jeśli nie oglądasz figur w ich postaci, prawdopodobnie nadal sprawiasz, że MATLAB wykonuje więcej pracy, niż jest to naprawdę konieczne. Obiekty graficzne są nadal tworzone, nawet jeśli nie są renderowane. Jeśli prędkość jest problemem, generowanie obrazów z rycin nie wydaje się idealnym rozwiązaniem.

Moja sugestia to faktyczna modyfikacja danych obrazu bezpośrednio i zapisanie ich za pomocą IMWRITE. Może nie być tak proste, jak użycie IMSHOW i innych rozwiązań do kreślenia, ale myślę, że jest to bardziej wydajne i daje bardziej niezawodne i spójne wyniki, które nie są tak wrażliwe na różne ustawienia fabuły. Na przykład dajesz, wierzę kod alternatywa dla tworzenia czarny prostokąt będzie wyglądać mniej więcej tak:

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'); 
Powiązane problemy