WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Bildgröße ändern ohne imresize-Befehl

 

Matlab macht Spaß

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2010, 11:27     Titel: Bildgröße ändern ohne imresize-Befehl
  Antworten mit Zitat      
Hallo,

wie kann ich die Bildgröße von einem eingelesenen Bild (imread) ändern ohne den imresize-Befehl?

Vielen Dank im Voraus!


Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 26.10.2010, 11:41     Titel:
  Antworten mit Zitat      
Moin,
eine Möglichkeit ist:

I2=I(1:2:end,1:2:end);

Viele Grüße

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab macht Spaß

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2010, 11:58     Titel:
  Antworten mit Zitat      
Hallo,

danke für die superschnelle Antwort!

Mit dem Befehl schneide ich ja nur einen Teil heraus.
Wie kann ich das Bild vergrößern bzw. verkleinern - ohne Datenverlust!

Vielen Dank
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 26.10.2010, 12:22     Titel:
  Antworten mit Zitat      
Mit dem Befehl verkleinerst Du das Bild und schneidest keinen Teil aus. Wenn Du so willst, schneidest Du in dem Beispiel jedes 2. Pixel aus - sonst wird aber Dein Bild auch nicht kleiner. Beim Vergrößern mußt Du interpolieren und Dich für eine Interpolationsmethode entscheiden!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.10.2010, 12:48     Titel:
  Antworten mit Zitat      
Hallo "Matlab macht Spaß",

Zitat:
Wie kann ich das Bild vergrößern bzw. verkleinern - ohne Datenverlust!

Verkleinern ohne Datenverlust ist nicht möglich.
INTERP2 sollte Dir weiterhelfen.
IMRESIZE hat noch die sehr schonende LANCZOS3-Methode, die oft die geringesten optischen Artefakte erzeugt. INTERP2 kann aber zumindest CUBIC und SPLINE, die auch ansehnliche Vergrößerungen und Verkleinerungen ergeben.

Leider habe ich beim Stöbern im Netz keine Erklärung gefunden, wie der LANCZOS3-Filter im 2D-Fall aussieht. Erklärungen für 1D gab es zwar viele, aber ob der 2D Fall einfach Zeilen und Spalten unabhängig voneinander behandelt, oder ob auch z.B. die Diagonalen berücksichtigt werden, bleibt dabei unklar. Kennt jemand eine Quelle dazu?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab macht Spaß

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2010, 14:56     Titel:
  Antworten mit Zitat      
Hallo, erstmal vielen Dank für die Hilfe!

Leider kenne ich mich nicht so gut mit Matlab aus. Aus diesem Grund bin ich leider nicht schlauer geworden. Kann mir jemand den vollständigen Befehl geben, wie ich ein Bild verkleinere bzw. vergrößere. Natürlich ohne imread!

Es wäre echt super, wenn mir jemand helfen könnte der sich in dieser Thematik auskennt!
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 27.10.2010, 15:56     Titel:
  Antworten mit Zitat      
"Es wäre echt super, wenn mir jemand helfen könnte der sich in dieser Thematik auskennt! "

Ich kann mich nur wiederholen und Jan S hat Dir auch eine Hilfe genannt!!
Wie Du ein Bild verkleinern kannst, ist bereits genannt. Das ist die kleinste Hürde, da nur Daten entfernt werden. Ohne Verlust---?? = bekannt. Zum Vergrößern brauchst Du eine Interpolationsmethode, wie z.B.:

Code:
I=imread('Test.tif');  %256*256*3
size(I)
[x,y]=meshgrid(1:256);  %Bildgröße quadr. von "I"
[xi,yi]=meshgrid(1:0.25:256);
for k = 1:3
I2(:,:,k)=interp2(x,y,double(I(:,:,k)),xi,yi,'spline');
end


Oder für einfach 2-dimensional:

I=double(imread('Test.tif'));
I2=interp2(I,2,'spline');


Das ist eine Lösung ohne imresize. Wenn Du jetzt auch noch eine Lösung ohne "imread" (wie letzter Beitrag von Dir) suchst, mußt Du du ein *.mat File laden über: load x.mat

Ich hoffe, dass Du damit etwas anfangen kannst.

Viele Grüße

Hubertus[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab macht Spaß

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2010, 15:42     Titel:
  Antworten mit Zitat      
Hallo Hubertus,

es funktioniert - war sehr hilfreich!!!

vielen Dank die Hilfe!!!

Nur noch eine ganz kurze Frage.

Ist es auch möglich die Breite und Höhe unabhängig voneinander zu ändern?
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 04.11.2010, 21:58     Titel:
  Antworten mit Zitat      
Wenn die Summe aller Elemente gleich bleibt, kannst du mit reshape auch die Seitenverhältnisse ändern.

Viele Grüße

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab Neuling

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2010, 15:00     Titel:
  Antworten mit Zitat      
Hallo Hubertus,

Wie meinst du das mit der Summe aller Elemente und dem Einsatz von reshape?

Habs ausprobiert, hat aber leider nicht hingehauen.

Hast du vielleicht ein kleines Beispiel parat....gerade zum Ändern der Größe mittels Variablen.

Danke!!!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.11.2010, 16:23     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Habs ausprobiert, hat aber leider nicht hingehauen.

Wenn Du Hilfe suchst, ist es sehr praktisch nicht einfach nur "hat nicht hingehauen" schreibst, sondern exakt postest, was Du gemacht hast und welche Fehlermeldung aufgetreten ist, oder wie die Ergebnisse genau von Deinen Erwartungen abweichen.

Du könntest z.B. auch den Hilfe-Text von INTERP2 lesen. Dort wird genau beschrieben, wie man ein eine Matrix über ein feineres Gitter approximiert - also vergrößert. Zwar wird auch hier der MESHGRID-Befehl für zwei identische Faktoren in X- und Y-Richtung angegeben:
Code:
[xi, yi] = meshgrid(-3:0.1:3, -3:0.1:3);

Aber es ist nicht schwer, einfach zwei verschiedene Grid-Schritte zu definieren. Siehe z.B. auch LINSPACE.

Um das Lesen der Hilfe-Texte und der Getting-Started-Kapitel in der Dokumentation kommt niemand vorbei, der in Matlab programmieren möchte. Auch ich musste per "help interp2" nachschauen, ob da vielleicht ein passendes Beispiel vorhanden ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 06.11.2010, 21:27     Titel:
  Antworten mit Zitat      
Ja, Matlab macht durch seine Fehlermeldungen manchmal "keinen Spaß".
Beim Umsortieren muß man darauf achten, dass alle Reihen und Spalten besetzt sind, ohne Leerstellen und Ohne "übrig gebliebene Pixel. Die Summe aller Elemente muß in Zeilen und Spalten aufgehen. Es wäre eine interessante Aufgabe, Fehlstellen durch Interpolation zu besetzen. Die treten natürlich nur in der letzten Reihe auf.

Ich benötige diese Funktion zwar nicht, will sie aber in den nächsten Tagen aus reiner Neugierde mal an einem Bild ausprobieren. Das das Ganze funktioniert kannst Du an dem Beisüiel sehen, wenn Du das Ganze auf 2 Reihen umsortierst. Das geht auf jeden Fall und dann natürlich auch auf andere Seitenverhältnisse

Viele Grüße

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 08.11.2010, 08:30     Titel:
  Antworten mit Zitat      
Moin,

das Umsortieren mit reshape an folgendem Beispiel. Wenn Du eine Matrix von 300*300 hast und 100 Reihen entfernst, kann Du 150 Spalten anhängen.
Der Befehl lautet dann:

Code:
%300*300 == 200*450

Alle Reihen und Spalten sind besetzt, ohne dass Werte übrig bleiben. So erhälst Du auch keine Fehlermeldung.

Einen schönen Tag

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
noob123
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2011, 10:57     Titel:
  Antworten mit Zitat      
Servus,

habe auch noch eine Frage zu diesem Thema meine Situation ist ziemlich dieselbe ich möchte ein .jpg Bild vergrößern und verkleiner.
Die Größe zu ändern funktioniert auch mit den oben genannten Programmzeilen, jedoch werden meine Farbwerte ebenfalls geändert und ich weiss gerade nicht wieso, kann auch sein das ist ein total triviales Problem, aber ich komme gerade einfach nicht darauf.

Die 2te Frage ist, wenn ich die Werte im Meshgrid Befehl (hier 0.25) auf Werte >1 ändere wird das Bild ja verkleinert hat das jetzt Nachteile im Gegensatz zu der oben genannten Methode?

Und zu letzt: Bekomme das vergrößern bis jetzt nur mit quadratischen Bildern hin könnt ihr mir vielleicht noch einen Tipp geben (oder ein BSP), wie ich vorgehen könnte bei rechteckigen Bildern?

Hier ist mein bisheriger Programmcode:


Code:

I1=imread('quadratisch.jpg');
 
[xi1,yi1,ci1]=size(I1) % höhe x und breite y auslesen
 
[x,y]=meshgrid(1:xi1,1:yi1);  %Bildgröße quadr. von "I1"

[xi,yi]=meshgrid(1:0.25:xi1,1:0.25:yi1); %Netz vergrößern

for k = 1:3
    I2(:,:,k)=interp2(x,y,double(I1(:,:,k)),xi,yi,'Spline');
end

figure(1)
imshow(I2);
figure(2)
imshow(I1);
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 05.05.2011, 10:23     Titel:
  Antworten mit Zitat      
Moin,

Zitat:
jedoch werden meine Farbwerte ebenfalls geändert und ich weiss gerade nicht wieso


Deine Werte liegen sehr wahrscheinlich nicht zwischen 0 und 255. Darum:

Code:


Zitat:
Bekomme das vergrößern bis jetzt nur mit quadratischen Bildern hin


Wenn es Dir nicht auf die Funktion meshgrid ankommt, dann mache doch folgendes

Code:
I=double(imread('Test.tif');
for color=1:3;
I2=I(:,:,color);
I3=interp2(I2,2,'spline');
I4(:,:,color)=I3;
end


Zitat:
das jetzt Nachteile im Gegensatz zu der oben genannten Methode?


Ein Vergleich der beiden Ergebnisse ist gleich 1. D.h. nicht 1 Pixel weicht ab.

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.