summaryrefslogtreecommitdiff
path: root/epostunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'epostunit.pas')
-rw-r--r--epostunit.pas75
1 files changed, 60 insertions, 15 deletions
diff --git a/epostunit.pas b/epostunit.pas
index fdba2da..ab1a0c7 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -4020,23 +4020,25 @@ end;
function tWerte.entferneArtefakte(sT: boolean; f: tMyStringList; threads: longint): boolean;
var
- Zeit: extended;
- hintergrund: tExtendedArray;
- fensters: array[boolean] of tSin2Fenster;
- s: string;
- b,heiszePixel,fertig: boolean;
- hintergrundAbziehen: tHintergrundAbzugsArt;
- fensterThreads: array of tFensterThread;
- i: int64;
- bekannteBefehle: tMyStringList;
- heiszPixelSchwellen: array[0..2] of extended;
+ Zeit,epsilon: extended;
+ hintergrund: tExtendedArray;
+ fensters: array[boolean] of tFenster;
+ s: string;
+ b,heiszePixel,fertig: boolean;
+ hintergrundAbziehen,haDummy: tHintergrundAbzugsArt;
+ fensterThreads: array of tFensterThread;
+ i: int64;
+ bekannteBefehle: tMyStringList;
+ heiszPixelSchwellen: array[0..2] of extended;
begin
result:=false;
Zeit:=now;
if not sT then
gibAus('Artefakte entfernen ...',3);
- for b:=false to true do
+ for b:=false to true do begin
fensters[b]:=tSin2Fenster.create;
+ (fensters[b] as tSin2Fenster).breite:=_tSiz;
+ end;
hintergrundAbziehen.art:=haaKeine;
setLength(hintergrundAbziehen.parameter,0);
setLength(hintergrund,0);
@@ -4044,6 +4046,7 @@ begin
heiszPixelSchwellen[1]:=-infinity;
heiszPixelSchwellen[2]:=infinity;
heiszePixel:=false;
+ epsilon:=1e-9;
bekannteBefehle:=tMyStringList.create;
repeat
if not f.metaReadln(s,true) then begin
@@ -4066,12 +4069,40 @@ begin
delete(s,1,pos(':',s));
s:=trim(s);
if b then
- fensters[b].rand:=round(kont2diskFak('t',exprToFloat(sT,s)))
+ (fensters[b] as tSin2Fenster).rand:=round(kont2diskFak('t',exprToFloat(sT,s)))
else
- fensters[b].rand:=round(kont2diskFak('x',exprToFloat(sT,s)));
+ (fensters[b] as tSin2Fenster).rand:=round(kont2diskFak('x',exprToFloat(sT,s)));
fensters[b].aktiv:=true;
continue;
end;
+ if istDasBefehl('epsilon:',s,bekannteBefehle,true) then begin
+ epsilon:=exprToFloat(sT,s);
+ continue;
+ end;
+ if istDasBefehl('durch horizontalen Verlauf teilen:',s,bekannteBefehle,true) then begin
+ if not stringToTHintergrundAbzugsArt(s,sT,knownValues,@callBackGetValue,haDummy) then begin
+ bekannteBefehle.free;
+ exit;
+ end;
+ if haDummy.art<>haaVertikaleMittel then begin
+ haDummy.art:=haaVertikaleMittel;
+ setLength(haDummy.parameter,2);
+ haDummy.parameter[0]:=3;
+ haDummy.parameter[1]:=3.141;
+ gibAus('Syntaxfehler beim Entfernen von Artefakten - erwartet: "durch horizontalen Verlauf teilen: '+tHintergrundAbzugsArtToStr(haDummy)+'"',3);
+ bekannteBefehle.free;
+ exit;
+ end;
+ if fensters[false].aktiv then begin
+ gibAus('Beim Entfernen von Artefakten kann ich nicht gleichzeitig in x Fenstern und durch einen horizontalen Verlauf teilen!',3);
+ bekannteBefehle.free;
+ exit;
+ end;
+ fensters[false].free;
+ fensters[false]:=tVerlaufTeilFenster.create(haDummy,epsilon);
+ fensters[false].aktiv:=true;
+ continue;
+ end;
if istDasBefehl('Hintergrund abziehen:',s,bekannteBefehle,true) then begin
if not stringToTHintergrundAbzugsArt(s,sT,knownValues,@callBackGetValue,hintergrundAbziehen) then begin
bekannteBefehle.free;
@@ -4098,12 +4129,26 @@ begin
exit;
until false;
bekannteBefehle.free;
- fensters[true].breite:=_tSiz-fensters[true].breite;
- fensters[false].breite:=_xSteps-fensters[false].breite;
if not ermittleHintergrund(sT,threads,hintergrundAbziehen,hintergrund) then
exit;
+ if fensters[false] is tVerlaufTeilFenster then begin
+ haDummy.art:=haaVertikaleMittel;
+ setLength(haDummy.parameter,2);
+ haDummy.parameter[0]:=kont2disk('t',(fensters[false] as tVerlaufTeilFenster).tMin);
+ haDummy.parameter[1]:=kont2disk('t',(fensters[false] as tVerlaufTeilFenster).tMax);
+ if not ermittleHintergrund(sT,threads,haDummy,fensters[false].werte) then
+ exit;
+ for i:=0 to length(fensters[false].werte)-1 do
+ if abs(fensters[false].werte[i])>epsilon then
+ fensters[false].werte[i]:=1/fensters[false].werte[i]
+ else if fensters[false].werte[i]<0 then
+ fensters[false].werte[i]:=-1/epsilon
+ else
+ fensters[false].werte[i]:=1/epsilon;
+ end;
+
if sT then begin
for b:=false to true do
fensters[b].free;