Ich mache mich gerade an intensive Bildbearbeitung heran, und zwar habe ich ein GUI kreeiert, wo ein Bild angezeigt wird.
Danach soll der User gewisse Teile des Bildes (z.B Regionen mit Spikes) markieren mit einer Ellipse oder Recheck (verschiedener Grössen) glätten können, sehr ähnlich wie Photoshop.
Dieses Segment soll nun gespeichert werden. Darauf kann man einen Smoothness-Filter anwenden und das Segment mit dem Resultat ersetzen.
Dieses neue Bild soll dann gespeichert werden.
Weiss jemand wie das zu implementieren ist (speziell der Smoothing-Teil)?
es gibt die Funktion: >>roifilt. Da wird ein Rahmen gezogen und eine Funktion bearbeitet den eingerahmten Bildausschnitt. Zum smoothen geht fspecial + 'gaussian', oder: >>roifill. Es gibt viele Funktionen, die letztlich das gleiche machen. Oder hast du ein bestimmtes Ziel?
Wenn du aber den Ausschnitt als separates Bild bearbeiten und diesen bearbeiteten Bereich wieder auf das Originalbild übertragen willst (so habe ich deine Anfrage verstanden) wird es eher nicht einfach - da transparent überlagern keine optimalen Ergebnisse liefert. Es müsste eine Funktion sein, die den Bildbereich tauscht - also nicht überlagert.
fspecial mit gaussian ergibt ein Gauss-Filter. Was ist aber mit dem Linear/Median und Adaptive Filtern, die hier beschrieben sind?
Ich habe mal ein Sample herausgeladen, wo man unten die richtigen Bilder und in der oberen Reihe die deformierten Bilder sieht.
Die 2 oberen Bildern haben eine falsche Einbuchtung, die durch User-Input eliminiert werden soll.
Ich dachte mir, ich könnte die vom User markierte Stelle speichern, glätten und danach die entsprechenden Matrixwerte mit den neuen ersetzen (anstatt Bildüberlagerung zu machen).
roifilt2 filters the input image and returns an image that consists of filtered values for pixels where the binary mask contains 1s and unfiltered values for pixels where the binary mask contains 0s. This type of operation is called masked filtering
Also kann ich dem roifilt2 einen Mask übergeben, der 1 enthält für Regionen, die vom User markiert wurden und geglättet werden müssen und 0 sonst.
Ich habe die Vermutung, dass du unter Glätten so etwas wie Verflüssigen (Photoshop) verstehst. Keines der Filter wird die Aufgabe erledigen. So ist z.B. der Median-Filter nur gegen Impulsrauschen. Alle anderen Glättungsfunktionen unterscheiden sich kaum von der Funktion 'gaussian'. Wenn ich dein Problem richtig verstanden habe, müsste man die Bildbereiche vektorisieren (als Vektorgrafik - wie CorelDraw) und dann verformen oder
man löscht bestimmte Bereiche weg und erzielt dadurch eine andere Form. Das Löschen ist noch am einfachsten.
Es kommt darauf an, was wir beide unter Glätten verstehen! Ich verstehe darunter das Angleichen der Pixelwerte bis zu einem Grad der Verschmierung, ähnlich der Gauss-Funktion. Das Glätten bewirkt weniger Rauschen, eliminiert Impulsrauschen und geht auf Kosten der Bildschärfe. Eine falsche Kurve bleibt in jedem Fall eine falsche Kurve. Um, diese in eine richtige Form zu bringen müssen zusammenhängende Pixel (also Vektoren) an eine andere Position gebracht werden. Es gibt in Matlab so etwas wie Warping.
Habe ich das richtig verstanden oder meinst du etwas anderes?
Ich habe jetzt mit der roifill Funktion die eine Ausbuchtung (im Rot-Bereich) was glätten können (siehe Attachment).
Das Resultat ist besser, aber nicht hervorragend.
Warping ist, soweit ich es verstanden habe, so was wie Rotation des Bildes. Du meinst jetzt also wahrscheinlich, dass man danach noch die richtigen Winkel für die Rotation bestimmen muss.
Was würdest generell empfehlen (die Bildschärfe möchte ich nicht umbedingt aufopfern)?
Jetzt hat es geklingelt. Ich weiß was du meinst. Vergesse Warping!
Auf jeden Fall würde ich nicht auf dem gesamten Bild arbeiten, sondern auf dem jeweiligen Farbkanal. Damit du möglichst viele Varianten probieren kannst, empfehle ich die Funktion "DetectLines.m" (Quelle: stackoverflow.com) Da sind sehr viele Funktionen eingebettet, mit denen man ein optimalöes Ergebnis erzielen müsste. Ich kann sie dir von diesem Rechner nicht zusenden. Wenn du sie nicht findest, werde ich sie später hier posten.
Code:
I=imread('Farbbild.tif');
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
BW=roipoly(R); % für den Fehler im Rotbereich
BW1=not(~BW);
N=roifill(I,BW1);
Segout=DetectLines(N); % Funktionen im M-Files festlegen
X=cat(3,Segout,G,B);
figure; imshow(X)
Ich konnte dein Bild erst jetzt auf dem Matlab-Rechner testen und komme auf eine einfachere Lösung. Dazu brauchst du die Funktionen: RGB2Lab.m und Lab2RGB.m .Die kannst du im File Exchange laden und arbeitest dann auf dem Luminanzkanal.
Der Weg:
Code:
I=imread('Sample Image.png');
figure; imshow(I)
I2=RGB2Lab(I);
I3=I2(:,:,1);
mask=roipoly;
I4=fspecial('gaussian',30,10); % die Werte sind bei einem Einzelbild dann höher
I5=roifilt2(I4,I3,mask);
I2(:,:,1)=I5;
I6=Lab2RGB(I2);
figure; imshow(I6)
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.