procedure ExtractEvenField(NewWindow:boolean); { Replaces odd scan lines with average of neighboring even lines. Can be used to improve the quality of images that have even and odd fields that are out of sync as the result of subject movement during capture. } var i,width,height,row1,row2:integer; begin SaveState; if NewWindow then Duplicate('Even Field'); GetPicSize(width,height); row1:=0; row2:=0; for i:=1 to height/2 do begin GetRow(0,row1,width); PutRow(0,row2,width); row1:=row1+2; row2:=row2+1; end; MakeRoi(0,0,width,height/2); Copy; MakeRoi(0,height/4-1,width,height/2); Paste; RestoreRoi; SetScaling('Bilinear; Same Window'); ScaleAndRotate(1,2,0); RestoreState; end; macro 'Extract Even Field->New Window'; begin ExtractEvenField(true); end; macro 'Extract Even Field->Same Window'; begin ExtractEvenField(false); end; macro 'Extract Odd and Even->New Windows'; var i,width,height,YPos, Original, EvenPid, OddPid, YDest:integer; begin SaveState; GetPicSize(width,height); SetNewSize(width,Height/2); Original := PidNumber; MakeNewWindow('Even Field'); EvenPid := PidNumber; MakeNewWindow('Odd Field'); OddPid := PidNumber; YPos := 0; YDest := 0; for i:=1 to height/2 do begin ChoosePic(Original); GetRow(0,YPos,width); ChoosePic(EvenPid); PutRow(0,YDest,width); ChoosePic(Original); YPos := YPos +1; GetRow(0,YPos,width); ChoosePic(OddPid); PutRow(0,YDest,width); YPos := YPos +1; YDest:=YDest +1; end; RestoreState; end; procedure CheckForStack; begin if nPics=0 then begin PutMessage('This macro requires a stack.'); exit; end; if nSlices=0 then begin PutMessage('This window is not a stack.'); exit end; end; macro 'Stack Extract Lines->New Stacks'; var i,j,width,height,YPos, Original, EvenPid, OddPid, YDest:integer; begin SaveState; CheckForStack; GetPicSize(width,height); SetNewSize(width,Height/2); Original := PidNumber; MakeNewStack('Even Fields'); EvenPid := PidNumber; MakeNewStack('Odd Fields'); OddPid := PidNumber; SelectPic(Original); For j := 1 to nSlices do begin SelectPic(Original); ChooseSlice(j); YPos := 0; YDest := 0; for i:=1 to height/2 do begin ChoosePic(Original); GetRow(0,YPos,width); ChoosePic(EvenPid); PutRow(0,YDest,width); ChoosePic(Original); YPos := YPos +1; GetRow(0,YPos,width); ChoosePic(OddPid); PutRow(0,YDest,width); YPos := YPos +1; YDest:=YDest +1; end; SelectPic(Original); if j = nSlices then exit; ChoosePic(EvenPid); AddSlice; ChoosePic(OddPid); AddSlice; end; RestoreState; end;