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

Bild verzeichnen (Distortion)

 

Nowak89
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2015, 07:52     Titel: Bild verzeichnen (Distortion)
  Antworten mit Zitat      
Hallo,

ich würde gerne ein Bild einlesen (RGB) und dieses verzeichnen.
Ich bin absoluter Matlab-Neuling und komme deshalb nicht weiter. Folgendes habe ich bisher hinbekommen.
Code:
image=imread('schachbrett.jpg');
%image=image(:,:,1);
figure, imshow(image)



f=104.119;
cx=81.9494;
cy=59.4392;
k1=-0.222609;
k2=0.063022;
k3=0;
p1=0.002865;
p2=-0.001446;

[rows,columns,~] = size(image);      
[j,i] = meshgrid(1:columns, 1:rows);

x=(j-cx)/f;          
y=(i-cy)/f;

r=x.^2+y.^2;

x = x.*(1+k1*r + k2*r.^2 + k3*r.^3) + 2*p1.*x.*y + p2*(r + 2*x.^2);
y = y.*(1+k1*r + k2*r.^2 + k3*r.^3) + 2*p2.*x.*y + p1*(r + 2*y.^2);



u=reshape(f*x + cx, rows, columns);        
v=reshape(f*y + cy, rows, columns);



figure
imagesc(image);
 


Das Bild wird zwar wiedergegeben, aber größer und es ist keine Verzeichnung zu erkennen.

Jemand eine Idee?

Vielen Dank im Voraus,

Marc

Edit: Mir stehen die Computer Vision System, Image Processing und Image Acquisition Toolboxes zur Verfügung.
Private Nachricht senden Benutzer-Profile anzeigen


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2015, 08:46     Titel:
  Antworten mit Zitat      
Wie Dir durch das syntax highlighting vielleicht aufgefallen ist, benutzt Du einen Funktionsnamen als Variablen-Namen ( image ). Das sollte man nicht tun.

Ansonsten fällt auf, dass Du image überhaupt nicht veränderst. Du lässt das Bild ausgeben, rechnest dann irgendwas und danach lässt Du Dir das gleiche Bild wieder ausgeben...
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2015, 10:23     Titel:
  Antworten mit Zitat      
Ok, das klingt logisch. Kann ich dies über folgende Anweisung erreichen? (Habe "image"durch "altesBild" ersetzt)

Code:
neuesBild = interp2(altesBild, u, v);


Da kommt ebenfalls eine Fehlermeldung. Wie gesagt, bin Neuling und komme derzeit nicht weiter.

Vielen Dank!
Grüße
Marc

Edit: Problem gelöst. Habe das Bild zuerst in ein double image umwandeln müssen. Jetzt funktioniert es auch mit inter2...
Dennoch vielen Dank für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2015, 13:12     Titel:
  Antworten mit Zitat      
Am besten kann man sich doch immer noch selbst helfen ;-)

Beim nächsten Mal bitte gleich die Fehlermeldung mit posten, in der Regel sagt das Matlab da sehr genau, was man an welcher Stelle falsch gemacht hat...
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2015, 07:19     Titel:
  Antworten mit Zitat      
Das nächste Problem ist schon wieder vorhanden.

Mein erzeugtes Bild (1028x749) ich kleiner, als mein Ausgangsbild (1280x980). An was liegt das? Und wie kann ich es erzwingen, dass die Größe beibehalten wird?

Danke,
Grüße
Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2015, 07:41     Titel:
  Antworten mit Zitat      
Hallo,

auch das Problem hat sich nun erledigt. Es scheint zu funktionieren.

Ich würde das ganze nun gerne in Simulink umsetzen. Letztendlich soll es dann bei einem Video funktionieren. Und zwar will ich ein Video einlesen, die Berechnung auf Pixelbasis (Matrix) durchführen und das veränderte Video speichern und anzeigen lassen.

Einfügen des Bildes (vorerst noch Bild) über einen "Image From File" Block und anzeigen über einen "Video Viewer" funktioniert schon mal.
Ich dachte, dass ich über eine Matlab function einfach den Code verwenden kann, aber so einfach scheint es nicht zu sein. Hat jemand eine Idee, wie ich dies verwirklichen kann?

Vielen lieben Dank!
Grüße
Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2015, 09:53     Titel:
  Antworten mit Zitat      
Nowak89 hat Folgendes geschrieben:
aber so einfach scheint es nicht zu sein


Warum?
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2015, 10:03     Titel:
  Antworten mit Zitat      
Weil ich ja nicht einfach den kompletten m-file Code kopieren und in ein Matlab function Block einfügen kann. Da kommen dann lauter Fehlermeldungen weil viele Variablen nicht bekannt sind.
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2015, 15:36     Titel:
  Antworten mit Zitat      
Ne, das geht natürlich nicht. Ist nämlich ein Matlab-Function-Block und kein Matlab-Script-Block. Der Block macht einen Funktionsaufruf mit einer Reihe von Eingabewerten und einer Reihe von Rückgabewerten. Da musst Du Dein Skript entsprechend auch als Funktion formulieren...
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2015, 15:49     Titel:
  Antworten mit Zitat      
Hmm, ok. Und wie kann ich so eine Funktion umformulieren? Also ein Zugriff auf eine Bildmatrix und Neuberechnung der Pixel und die Neuausgabe? Komme da nicht so klar. Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2015, 18:29     Titel:
  Antworten mit Zitat      
http://etools.fernuni.ch/matlab/mat.....mfiles_progfunctions.html

Da gibt es einen kleinen Einstieg in das Programmieren von Funktionen in Matlab
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 15:26     Titel:
  Antworten mit Zitat      
Nachdem ich die Verzeichnung meinen Wünschen entsprechend hinbekommen habe, würde ich gerne nur einen Bereich aus dem Bild auswählen. Grund hierfür ist, dass durch die Verzeichnung der Rand schwarz (bzw. NaN) ist und ich diesen nicht verwenden will. Das Bild soll quasi zugeschnitten werden, und zwar an allen Seiten gleich, so dass ich eine neue Bildgröße von l x b bekomme (z.B. 1280 x 960).
Wie sieht das vorgehen im Allgemeinen aus?

Vielen herzlichen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2015, 16:05     Titel:
  Antworten mit Zitat      
So etwa?

Code:

randbeschnitt = 2; %So viele Werte sollen am Rand entfernt werden
A = magic(10); %irgendeine 10x10 Matrix erzeugen
A_klein = A((randbeschnitt+1):(end-randbeschnitt), (randbeschnitt+1):(end-randbeschnitt));
 


A_klein ist dann rundherum um randbeschnitt Pixel kleiner, als A .
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2015, 09:48     Titel:
  Antworten mit Zitat      
Ich sage schon mal herzlichen Dank.

Nachdem ich dies nun auf ein Bild angewendet habe, möchte ich es auch auf ein Video anwenden. Das scheint mir jedoch etwas komplizierter zu sein. Als Ziel sollen die Videodaten als Matrix in Simulink eingelesen werden und das Video durch den obigen Effekt verzeichnet werden.

Wie gehe ich für dieses Vorhaben am besten vor?

Vielen Dank für die super Unterstützung, ihr seid echt super!

Grüße Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2015, 13:26     Titel:
  Antworten mit Zitat      
Hallo,

so weit bin ich bisher gekommen.

Code:
clear all;
close all;
obj = VideoReader('movie.avi');
vidWidth = obj.Width;
vidHeight = obj.Height;
writerObj = VideoWriter('result.avi', 'Uncompressed AVI');
get(writerObj);
[rows, columns, channels] = size(obj);
[j,i] = meshgrid(1:vidWidth, 1:vidHeight);
f=...;
cx=vidHeight/2;                           % to start at the image center
cy=vidWidth/2;
k1=...;
k2=...;
p1=...;
p2=...;
mov = struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),...
     'colormap',[]);
k=1;
while hasFrame(obj)
    mov(k).cdata = readFrame(obj);
x=(j-cx)/f;                            
y=(i-cy)/f;
r=x.^2+y.^2;
x = x.*(1+k1*r.^2 + k2*r.^4 ) + 2*p1.*x.*y + p2*(r + 2*x.^2);
y = y.*(1+k1*r.^2 + k2*r.^4) + 2*p2.*x.*y + p1*(r + 2*y.^2);
u=f*x+cx;
v=f*y+cy;
[X0, Y0] = meshgrid(1:vidWidth, 1:vidHeight);
newObj=zeros(vidHeight, vidWidth);

for w=1:3
 mov(k).cdata(:,:,w) = interp2(mov(k).cdata(:,:,w), u, v);
end

    k = k+1;
end
fig = figure;
set(fig, 'position', [30 30 vidWidth vidHeight]);
movie(fig, mov, 1);
close;


Problem ist die Interpolation. Dort gibt es eine Fehlermeldung (Sample values must be a single or double array).
Weiteres Problem ist, dass das Bild auf dem Kopf und gespiegelt dargestellt wird. Ich habe allerdings die Ursache nicht ausfindig gemacht. Das seltsame dabei ist, dass das 'traffic.avi' das bei Matlab dabei ist, funktioniert. Mein Originalvideo ist aber definitiv nicht gespiegelt, das habe ich bereits mit einem Windowsplayer überprüft.

Ist es überhaupt so möglich, die Pixel jedes Frames so zu bearbeiten?

Vielen Dank für die Hilfe!
Gruß Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 2025 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.