2009-12-04 6 views
9

Chciałbym pokazać obraz i narysować coś na nim, a następnie zapisać go jako obraz o tym samym rozmiarze co oryginalny. Mój kod MATLAB jest:Jak zapisać wydrukowany obraz i zachować oryginalny rozmiar obrazu w programie MATLAB?

figH = figure('visible','off'); 
imshow(I); 
hold on; 
% plot something 
saveas(figH,'1','jpg'); 
close(figH); 

Ale obraz wynikowy „1.jpg” zbawił obszarów non-obraz na wykresie, jak i obrazu. Jak mogę rozwiązać ten problem?

+0

O ile większy? Rząd wielkości? Niewielki procent? – Doresoom

+0

Przepraszam, powinienem chcieć nie zapisywać obszaru bez obrazu w działce. – Tim

Odpowiedz

14

Powodem twój nowy obraz jest większy niż oryginał jest, ponieważ funkcja SAVEAS oszczędza całe okno postać, a nie tylko zawartość osi (czyli tam, gdzie jest wyświetlany obraz).

Twoje pytanie jest bardzo podobny do innego SO question, więc będę najpierw zwrócić uwagę na dwie podstawowe opcje objęte tymi odpowiedziami:

  • modyfikować dane surowe obrazu: Twoje dane obrazu są przechowywane w Zmienna I, dzięki czemu można bezpośrednio modyfikować wartości pikseli obrazu w I, a następnie zapisać zmodyfikowane dane obrazu za pomocą IMWRITE. Sposoby, w jakie można to zrobić, opisano w artykule my answer i LiorH's answer. Ta opcja będzie działać najlepiej w przypadku prostych modyfikacji obrazu (np. Dodanie prostokąta, o co chodziło w tym pytaniu).

  • Modyfikuje sposób zapisywania rysunku: Można także zmodyfikować sposób zapisywania rysunku, aby lepiej pasował do wymiarów oryginalnego obrazu. Sposób, w jaki można to zrobić (używając funkcji SAVEAS) za pomocą funkcji PRINT i GETFRAME opisano w odpowiedziach z Azim, jacobko i SCFrench. Ta opcja jest właśnie tym, co chcesz zrobić, jeśli nakładasz obraz na etykiety tekstowe, strzałki lub inne obiekty fabuły.

Użycie drugiej opcji zapisania całej figury może być trudne. W szczególności, możesz stracić rozdzielczość obrazu, jeśli tworzysz duży obraz (na przykład 1024 na 1024 piksele) w małym oknie (na przykład 700 na 700 pikseli). Będziesz musiał ustawić właściwości figurki i osi, aby się zmieściły. Oto przykład rozwiązanie:

I = imread('peppers.png');  %# Load a sample image 
imshow(I);      %# Display it 
[r,c,d] = size(I);    %# Get the image size 
set(gca,'Units','normalized','Position',[0 0 1 1]); %# Modify axes size 
set(gcf,'Units','pixels','Position',[200 200 c r]); %# Modify figure size 
hold on; 
plot(100,100,'r*');    %# Plot something over the image 
f = getframe(gcf);    %# Capture the current window 
imwrite(f.cdata,'image2.jpg'); %# Save the frame data 

Wyjście obrazu image2.jpg powinien mieć czerwoną gwiazdką na nim i powinny mieć takie same wymiary jak obrazu wejściowego.

+0

Dzięki, gnovice, wypróbowałem metodę Azima. Obszar nieobjętości obrazu jest nieobecny, ale zapisany obraz ma inną rozdzielczość niż oryginalny obraz. Czy można to rozwiązać? Pozdrowienia! – Tim

+0

@Tim: Zasadniczo połączyłem sugestie Azima i SCFranga i dodałem nowe rozwiązanie do powyższej odpowiedzi. Mam nadzieję, że zaopiekuje się tobą. – gnovice