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überlagerung

 

clustering_n00b
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 04.11.2012, 14:18     Titel: Bildüberlagerung
  Antworten mit Zitat      
Hallo!


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.

Code:

(a .* b)
 


Das gab einen Error:
Zitat:
Error using .*
Integers can only be combined with integers of the same class, or scalar
doubles.


Danach habe ich es folgendermassen versucht:
Code:


Dies hat funktioniert. Jedoch ist das Ergebnis einfach ein schwarz-weiss Bild und definitiv nicht das, was ich möchte.

Ich habe mal alle Bilder heraufgeladen.

Weiss hier jemand weiter?

richtigesergebnis.png
 Beschreibung:

Download
 Dateiname:  richtigesergebnis.png
 Dateigröße:  349.73 KB
 Heruntergeladen:  554 mal
kontour.png
 Beschreibung:

Download
 Dateiname:  kontour.png
 Dateigröße:  350.12 KB
 Heruntergeladen:  534 mal
farbe.png
 Beschreibung:

Download
 Dateiname:  farbe.png
 Dateigröße:  357.44 KB
 Heruntergeladen:  509 mal
falschesergebnis.png
 Beschreibung:

Download
 Dateiname:  falschesergebnis.png
 Dateigröße:  4.43 KB
 Heruntergeladen:  477 mal
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: 04.11.2012, 18:25     Titel:
  Antworten mit Zitat      
Moin,

eine schöne Lösung findest du hier:

http://www.mathworks.com/matlabcent.....ing-2-images-image-fusion

Eine erfolgreiche Woche!!!

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 04.11.2012, 18:50     Titel:
  Antworten mit Zitat      
Hi Hubertus!


Erstmals, vielen Dank für den Hinweis!


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

Code:

bgImg = double(bgImg);
fgImg = double(fgImg);

fgImgAlpha = alphaFactor .* fgImg;
bgImgAlpha = (1 - alphaFactor) .* bgImg;

fusedImg = fgImgAlpha + bgImgAlpha;
 


Was mache ich hier falsch?
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 04.11.2012, 20:31     Titel:
  Antworten mit Zitat      
Ich habe jetzt nochmals drei weitere Kombinationen ausprobiert - die Resultat sind immer noch falsch, sehen aber ganz interessant aus! Surprised

Code:


farbe = imread('farbe.png');
kontour = imread('kontour.png');
img = kontour + farbe;
figure; imshow(img)
img = kontour - farbe;
figure; imshow(img)
img = farbe - kontour;
figure; imshow(img)
 


kontour-farbe.png
 Beschreibung:

Download
 Dateiname:  kontour-farbe.png
 Dateigröße:  63.29 KB
 Heruntergeladen:  545 mal
farbe+kontour.jpg
 Beschreibung:

Download
 Dateiname:  farbe+kontour.jpg
 Dateigröße:  26.53 KB
 Heruntergeladen:  512 mal
farbe-kontour.png
 Beschreibung:

Download
 Dateiname:  farbe-kontour.png
 Dateigröße:  84.42 KB
 Heruntergeladen:  536 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2012, 21:23     Titel:
  Antworten mit Zitat      
Code:
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)



Falls dir das zu verworren ist, kannst du auch komplett mit Doubles arbeiten:
Code:
kontourd=double(kontour)/2^16
farbed=double(farbe)/2^16
imshow(farbed.*kontourd)
 
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.11.2012, 09:05     Titel:
  Antworten mit Zitat      
Moin,

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.

Code:
v=imread('1.tif');
w=imread('2.tif');
thres=60;
layer=(v(:,:,1) > thres & (v(:,:,2) > thres 6 (v(:,:,3) > thres)));
mask(:,:,1)=layer;
mask(:,:,2)=layer;
mask(:,:,3)=layer;
nv=v;
nv(mask)=w(mask);


Du kannst z.B. "thres" weiter anpassen, wenn du "thres=60; "thres1=20; und thres2=80; einfügst
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 05.11.2012, 10:42     Titel:
  Antworten mit Zitat      
dmjr hat Folgendes geschrieben:
Code:
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)



Falls dir das zu verworren ist, kannst du auch komplett mit Doubles arbeiten:
Code:
kontourd=double(kontour)/2^16
farbed=double(farbe)/2^16
imshow(farbed.*kontourd)
 


Es hat nun endlich funktioniert!
Vielen herzlichen Dank!!!! Smile

Ich verstehe aber nach wie vor nicht, wieso so viele Formate (int16, int8, int32, double) nötig sind.
Das ist doch unnötig kompliziert!
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.11.2012, 14:03     Titel:
  Antworten mit Zitat      
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);


Mit gleichem Ergebnis meine ich den Vergleich zur Lösung von dmjr.
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 06.11.2012, 17:24     Titel:
  Antworten mit Zitat      
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.
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: 07.11.2012, 09:35     Titel:
  Antworten mit Zitat      
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,[])


Der Code ist wie gesagt etwas umständlich, führt aber zum Ergebnis. Die Bilder habe ich vorher von uint16 auf uint8 geändert.
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: 07.11.2012, 13:25     Titel:
  Antworten mit Zitat      
Hallo Hubertus,

Der Code ist in der Tat etwas umständlich.
Code:
...
Y=img1;
Y(ind2) = NaN;
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;
    end
  end
end

Zunächst kann man die Schleifen vektorisieren, das ist ja gerade der Charme von Matlab:
Code:
Y = img1;
Y(ind2) = NaN;
outout = (img1 - Y) / 1;

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:
Code:
Out = zeros(size(img1));
Out(ind2) = NaN;

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: 07.11.2012, 13:35     Titel:
  Antworten mit Zitat      
Hallo Jan,

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