Dienstag, 11. November 2008

Wie lege ich zwei Bilder in Matlab transparent übereinander?

Da vor kurzem Bedarf bestand sowas zu bewerkstelligen, halte ich hier mal den Lösungweg dafür fest.
Zunächst einmal: Es gibt einen Befehl alpha(), damit kann man grundsätzlich alle Bilder/Patches oder sonstige flächigen Grafikteile einer Axis transparent machen. Das gilt aber wirklich für alle. Plote ich also zwei Bilder mit imagesc() oder image() übereinander:
bild = imread('test.png','png');
bild2 = imread('test2.png','png');
figure(1)
imagesc(bild)
hold on
imagesc(bild2)
hold off
alpha(0.5)
Das Ergebnis ist, dass man zwar beide Bilder übereinander liegen hat, aber halt beide zu 50 % durchsichtigt sind. Man möchte ja meistens lieber haben, dass das hintere Bild nicht durchsichtig ist. Dafür muss man nun Alphamaps verwenden.
Dabei handelt es sich um Matrizen, die genau so groß sind wie die zugehörigen Bilder. Sie enthalten werte zwischen 0 und 1, wobei 1 undurchsichtig ist (0 kann man sich denken).
Möchte ich jetzt beispielsweise, dass ein Bild 50 % durchsichtig ist, so erzeuge ich eine Matrix die nur 0.5 als Werte enthält. Ich schreibe jetzt einfach mal den Code und kommentiere Schlüsselstellen.
bild = imread('test.png','png');
bild2 = imread('test2.png','png');

figure(1)
imagesc(bild);

alpha_matrix = 0.5*ones(size(bild2,1),size(bild2,2)); %hier wird einfach nur eine %Matrix erzeigt die 0.5 als Werte hat
hold on
h = imagesc(bild2);
set(h,'AlphaData',alpha_matrix); % das ist der wichtigste Punkt, hier wird über den
%Set-Befehl die alpha_matrix mit dem Bild2 verbunden. h stellt den Handler (eine %Art Verweis) auf das geplottete Bild dar.
Mit diesem Code erhält man die gewünschte Darstellung. Der set-Befehl ist übrigens sehr, sehr mächtig. Viele Objekte in Matlab (z.B. Plots, Figures, Images, Optimierungsfunktionen(hier aber mit optimset)) lassen sich über einen Handler ansprechen und geben einem die Möglichkeit viele Dinge einzustellen. Mit set(h) als Eingabe in die Konsole erhält man alle verfügbaren Optionen, hier hilft natürlich die Hilfe.

Grundsätzlich sollte man noch beachten, dass jeder Plot (aber auch Line etc.) ein eigenes Objekt darstellt. Und das man diese auch in einer Figure gleichzeigt verwenden kann, so dass man beispielsweise Punkte in ein Bild ploten kann. Dabei aber immer an hold on denken ;)

Keine Kommentare: