Arbeite gerade an einem Bildüberlagerungsproblem - und zwar habe ich zwei Bilder die ich so überlagern möchte, dass die stärkeren Werte aus dem Weiss heraustrahlen (anders gesagt: Hintergrund + Vordegrund).
Das erste Bild kann man als Farbe, das zweite als Kontour interpretieren.
Ich habe mal versucht beide Bildmatrizen zu multiplizieren.
Ich hab's mal ausprobiert - das Ergebnis ist genau gleich wie das was ich bekommen hatte, nämlich die schwarz-weiss Maske.
Das erstaunt mich eigentlich nicht, denn die Hauptfunktionalität des Image Fusion Skripts sind die zwei Zeilen - genau das, was ich auch gemacht hatte (mit alpha = 0.5).
a=uint32(farbe).*uint32(kontour)% Multiplikation von zwei Wertebereichen [0..2^16] ergibt [0..2^32], daher muss mit uint32 gerechnet werden
b=uint16(a./2^16)% wir wollen aber keine uint32, daher wird auf uint16 zurückskaliert imshow(b)
egal welche Funktion, und das gibt es mehrere, ich auch verwende, ich bekomme nach 2x "imread" (zum Einlesen der Bilder) keine Error-Meldung, wie du anfangs beschrieben hast. Wie kommt es dazu, dass du uint8 und double vorliegen hast?
Leider lässt sich dein Beispiel nicht nachvollziehen, da "ähnliche Bilder" deiner Problemstellung nicht gerecht werden. Zu unterschiedlich sind die Resultate. Unter keinen Umständen bekomme ich aber ein S/W-Bild, wie du ebenfalls eingangs beschrieben hast. Ich gehe natürlich davon aus, dass du nach "double" das Bild wieder mit "uint8" anzeigen lässt.
Nach ähnlichen Versuche habe ich festgestellt und das ist nur natürlich, dass die Ergebnisse in der Helligkeit und Kontrast sehr stark von den Originalvorlagen abweichen. Das könnte also bedeuten, dass deine letzten Ergebnisse zwar noch unbefriedigend sind, aber nur noch Helligkeit und Kontrast angepasst werden müssen - also nicht das Problem der jetzigen Berechnungen sind.
Du kannst noch folgendes testen. In meinem Beispiel scheinen dann nur bestimmte Bildbereiche durch - es hängt also wieder von den Originalen ab!!! Ansonsten würde ich mal die Bereiche Helligkeit und Kontrast bearbeiten.
a=uint32(farbe).*uint32(kontour)% Multiplikation von zwei Wertebereichen [0..2^16] ergibt [0..2^32], daher muss mit uint32 gerechnet werden
b=uint16(a./2^16)% wir wollen aber keine uint32, daher wird auf uint16 zurückskaliert imshow(b)
Das erschließt sich mir auch nicht, weil damit eigentlich nur die Bildhelligkeit verändert wird, die ich bereits angemerkt habe. Ich komme ohne double und uint16 wie folgt zum gleichen Ergebnis. Entscheidend ist, dass das Ergebnis
in der Helligkeit modifiziert wird (.../2^16)
Code:
I=imread('1.tif');
I2=imread('2.tif');
I3=I.*I2; % zum Vergleich
I4=I2*(I/30);
Hmmm...okay. Aber die Bilder mit/ohne Helligkeitsveränderung (ob man sie jetzt als uint8 oder uint32 anschaut) sehen gleich aus, wenn ichs ie mit imshow plotte.
Leider konnte ich deine Bilder erst heute im Original bearbeiten und habe dann festgestellt, dass die Aufgabe doch nicht so einfach ist. Ich habe mir zunächst in Photoshop CS6 einen schnellen Überblick verschafft, was geht und was nicht. Das einfache Überlagern führt zu keine sauberen Farbtrennungen.
Die Schwarzwerte vergrauen die Farbwerte. Die einzig wirksame Methode ist, nur bestimmte Bereiche auf Transparenz zu setzen Das geht natürlich auch mit Matlab. Der Code ist etwas umständlich, vielleicht kannst du ihn noch ein bisschen optimieren.
Voraussetzung ist: bestimmte Bereiche auf Transparenz - also "NaN" zu setzen:
Code:
img1=imread('farbe.png');
img2=imread('kontour.png');
img2=rgb2gray(img2)% einfacher als RGB figure; imshow(img2)
img2(img2>180)=NaN; % % Weiße Flächen werden transp. figure; imshow(img2)
img2=cat(3,img2,img2,img2); % Wieder RGB für weitere Berechn.
ind2=(img2==0); % Schwarzwerte indizieren
Y=img1;
Y(ind2)=NaN% Schwarzwerte auf Transparenz setzen for i=1:size(img1,1);
for j=1:size(img1,2);
for k=1:size(img1,3);
outout(i,j,k)=(img1(i,j,k) - Y(i,j,k))/1; % !!subtrahieren und Wert ggf. anpassen end end end figure; imshow(outout,[])
Dann kann man die Division durch 1 eigentlich auch weglassen, oder verbirgt sich da ein geheimnisvoller Trick dahinter?
Zudem ist "Y=img1, ... Out=img1 - Y" ziemlich redundant, oder? Wie wäre es mit:
vielen Dank für deine Hinweise, die natürlich viel eleganter sind!! Ich habe da Fragmente "aus alten Tagen" verwendet. In der Zeile: ...i,j,k))/1; ist der Wert nicht entbehrlich, da eine Veränderung des Wertes die Darstellung verändert. Er liegt in dem Beispiel nahe 1.
Vielen Dank und viele Grüße
Hubertus
Einstellungen und Berechtigungen
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
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.