Compilerbauhome Compilerbau: Beispiele für einfache Bildtransformationen Prof. Dr. Uwe Schmidt FH Wedel

Beispiele für einfache Bildtransformationen


weiter

Beispiel-Anwendungen

einfache Bildoperationen
weiter
Herberts Lieblingsbild:
 
weiter
erzeugte Bilder
und das, was man mit einfachen ppl-operationen daraus machen kann
 
Es wird eine Variable für das Original-Bild:
 
var p : picture
 
verwendet, auf diese Variable werden die verschiedenen Operationen angewendet.
weiter
Transformationen
p.flipHorizontal
weiter
p.flipVertical
weiter
p.flipDiagonal
weiter
p.rotate
weiter
p.shift
 (p.width div 4
 ,p.height div 4)
weiter
pixelweise
Transformation
p.gamma(0.5)
weiter
p.gamma(2.0)
weiter
p.invert
weiter
p.bitmap
weiter
p.blackAndWhite
weiter
p.reduceColor(3)
weiter
p.reduceColor(7)
weiter
ausschneiden und zusammensetzen
p.cut(p.width  div 4
     ,p.height div 4
     ,p.width  div 2
     ,p.height div 2
     )
weiter
p.paste
  (p.resize
     (p.width div 2
     ,p.height div 2
     )
    .invert
  ,p.width div 4
  ,p.height div 4
  )
weiter
skalieren
p.scale(2,2)
weiter
p.scale(2,1)
weiter
p.scale(1,2)
weiter
p.replicate(2,2)
weiter
p.replicate(2,1)
weiter
p.replicate(1,2)
weiter
p.resize
  (2 * p.width
  ,2 * p.height
  )
weiter
p.resize
  (p.width  div 2
  ,p.height div 2
  )
weiter
Erzeugen von Bildern
black(256, 256)
white(256, 256)
grey(0.5, 256, 256)
Kombinieren von Bildern
p.sideBySide
  (p.flipVertical)
weiter
p.above
  (p.flipHorizontal)
weiter
begin
 var
   p2 : picture
      := p.sideBySide
           (p.flipVertical)
 ; return
   p2.above
      (p2.flipHorizontal)
end
weiter
p.shrink(8,8)
 .scale(8,8)
weiter
p.resize( (p.width  + 7) div 8
        , (p.height + 7) div 8
        )
 .scale(8,8)
weiter
p.shrink(p.width,p.height)
 .scale(p.width,p.height)
weiter
Pixelweise Kombination
p + p.flipVertical
weiter
p - p.flipVertical
weiter
p * p.flipVertical
weiter
p min p.flipVertical
weiter
p max p.flipVertical
weiter

weiter

Das Programm, mit dem die Bilder erzeugt wurden: ppl/examples/example.ppl

   1------------------------------------------------------------
   2--
   3-- demo program for all builtin picture manipulation functions
   4--
   5------------------------------------------------------------
   6
   7begin
   8 var p : picture
   9 ; var args : list of string
  10       := getArgs()
  11
  12 ; var f : string
  13       := if args.empty
  14          then "lena"           -- default: THE test picture
  15          else args.head
  16 ; var f1 : string
  17       := f + "-"
  18
  19 ; writeln("hello world")
  20
  21 ; writeln("reading " + f)
  22 ; p := load(f)
  23
  24 ; writeln("width  = " + p.width.toString)
  25 ; writeln("height = " + p.height.toString)
  26
  27 ; dump()
  28
  29 ; writeln("storing picture")
  30 ; p.store(f1 + "original")
  31
  32 ; writeln("mirror: side by side and above")
  33 ; begin
  34     var p2 : picture
  35         := p.sideBySide(p.flipVertical)
  36
  37     ; p2.above(p2.flipHorizontal)
  38         .store(f1 + "mirror")
  39   end
  40
  41 ; writeln("split vertical and concat horizontal")
  42 ; begin
  43    var l : list of picture
  44        := p.splitVertical(4)
  45
  46    ; var rl : list of picture
  47          := [l[3], l[2], l[1], l[0]]
  48
  49    ; rl.concatHorizontal
  50         .store(f1 + "splitV")
  51   end
  52
  53 ; writeln("split horizontal and concat vertical")
  54 ; begin
  55    var l : list of picture
  56        := p.splitHorizontal(4)
  57
  58    ; var rl : list of picture
  59          := [l[3], l[2], l[1], l[0]]
  60
  61    ; rl.concatVertical
  62         .store(f1 + "splitH")
  63   end
  64
  65 ; writeln("flip horizontal")
  66 ; p.flipHorizontal.store(f1 + "flipHorizontal")
  67
  68 ; writeln("flip vertical")
  69 ; p.flipVertical.store(f1 + "flipVertical")
  70
  71 ; writeln("flip diagonal")
  72 ; p.flipDiagonal.store(f1 + "flipDiagonal")
  73
  74 ; writeln("rotate")
  75 ; p.rotate.store(f1 + "rotate")
  76
  77 ; writeln("shift")
  78 ; p.shiftp.width  div 4,
  79            p.height div 4)
  80    .store(f1 + "shift")
  81
  82 ; writeln("gamma 0.5")
  83 ; p.gamma(0.5)
  84    .store(f1 + "gamma0.5")
  85
  86 ; writeln("gamma 2.0")
  87 ; p.gamma(2.0)
  88    .store(f1 + "gamma2.0")
  89
  90 ; writeln("invert")
  91 ; p.invert.store(f1 + "invert")
  92
  93 -- map picture to black and white by summing up grey values
  94 ; writeln("bitmap")
  95 ; p.bitmap.store(f1 + "bitmap")
  96
  97 ; writeln("black and white")
  98 ; p.blackAndWhite.store(f1 + "blackAndWhite")
  99
 100 ; begin
 101     var i : int
 102         := 2
 103
 104     ; while i < 8 do
 105         writeln("reduce # of colors to " + i.toString)
 106         ; p.reduceColor(i)
 107            .store(f1 + "reduce" + i.toString + "")
 108         ; i := i + 1
 109       endwhile
 110   end
 111
 112 ; writeln("cut")
 113 ; p.cutp.width  div 4
 114        , p.height div 4
 115        , p.width  div 2
 116        , p.height div 2
 117        )
 118    .store(f1 + "cut")
 119
 120 ; writeln("paste")
 121 ; p.pastep.resizep.width  div 2
 122                    , p.height div 2
 123                    )
 124             .invert
 125          , p.width  div 4
 126          , p.height div 4
 127          )
 128    .store(f1 + "paste")
 129
 130 ; writeln("scale 2x2")
 131 ; p.scale(2,2)
 132    .store(f1 + "scale2x2")
 133
 134 ; writeln("scale 2x1")
 135 ; p.scale(2,1)
 136    .store(f1 + "scale2x1")
 137
 138 ; writeln("scale 1x2")
 139 ; p.scale(1,2)
 140    .store(f1 + "scale1x2")
 141
 142 ; writeln("replicate 2x2")
 143 ; p.replicate(2,2)
 144    .store(f1 + "replicate2x2")
 145
 146 ; writeln("replicate 2x1")
 147 ; p.replicate(2,1)
 148    .store(f1 + "replicate2x1")
 149
 150 ; writeln("replicate 1x2")
 151 ; p.replicate(1,2)
 152    .store(f1 + "replicate1x2")
 153
 154 ; writeln("double size")
 155
 156 ; p.resize( 2 * p.width
 157           , 2 * p.height
 158           )
 159    .store(f1 + "doublesize")
 160
 161 ; writeln("half size")
 162 ; p.resizep.width  div 2
 163           , p.height div 2
 164           )
 165    .store(f1 + "halfsize")
 166
 167 ; writeln("blur 8x8 with resize")
 168 ; p.resize( (p.width  + 7) div 8
 169           , (p.height + 7) div 8
 170           )
 171    .scale(8,8)
 172    .store(f1 + "blurResize8x8")
 173
 174 ; writeln("blur 8x8")
 175 ; p.shrink(8,8)
 176    .scale(8,8)
 177    .store(f1 + "blur8x8")
 178
 179 ; writeln("blur whole image")
 180 ; p.shrink(p.width,p.height)
 181    .scale(p.width,p.height)
 182    .store(f1 + "blurAll")
 183
 184 ; writeln("sideBySide")
 185 ; p.sideBySide(p.flipVertical)
 186    .store(f1 + "sideBySide")
 187
 188 ; writeln("sideBySide")
 189 ; p.sideBySide(p.flipVertical)
 190    .store(f1 + "sideBySide")
 191
 192 ; writeln("above")
 193 ; p.above(p.flipVertical)
 194    .store(f1 + "above")
 195
 196 ; writeln("select all even/odd columns")
 197 ; begin
 198    var l : list of picture
 199        := p.partitionVertical(2)
 200    ; var p1p2 : picture
 201          := l[0], l[1]
 202
 203    ; p1.store(f1 + "evencols")
 204    ; p2.store(f1 + "oddrcols")
 205
 206    ; writeln("1 step vertical wavelet transformation")
 207    ; (p1 + p1).sideBySide(p1 - p2)
 208               .store(f1 + "waveV")
 209   end
 210
 211 ; writeln("select all even/odd rows")
 212 ; begin
 213    var l : list of picture
 214        := p.partitionHorizontal(2)
 215    ; var p1p2 : picture
 216          := l[0], l[1]
 217
 218    ; p1.store(f1 + "evenrows")
 219    ; p2.store(f1 + "oddrrows")
 220
 221    ; writeln("1 step horizontal wavelet transformation")
 222    ; (p1 + p1).above(p1 - p2)
 223               .store(f1 + "waveH")
 224   end
 225
 226 ; writeln("add 2 pictures")
 227 ; (p + p.flipVertical).store(f1 + "add")
 228
 229 ; writeln("add mean arithmetic mean: + is equivalent to mean")
 230 ; p.mean(p.flipVertical).store(f1 + "mean")    -- same as add
 231
 232 ; writeln("inverse operation for mean is inverseMean")
 233 ; p.mean(p.flipVertical)
 234    .inverseMean(p.flipVertical)
 235    .store(f1 + "meanInvMean")                  -- same as p
 236
 237 ; writeln("subtract 2 pictures")
 238 ; (p - p.flipVertical).store(f1 + "sub")
 239
 240 ; writeln("- is same as diff")
 241 ; p.diff(p.flipVertical).store(f1 + "diff")
 242
 243 ; writeln("inverseDiff is inverse Function to - or diff")
 244 ; p.diff(p.flipVertical)
 245    .inverseDiff(p.flipVertical)
 246    .store(f1 + "diffInvDiff")                  -- same as p
 247
 248 ; writeln("multiply 2 pictures")
 249 ; (p * p.flipVertical).store(f1 + "mul")
 250
 251 ; writeln("minimum of 2 pictures")
 252 ; (p min p.flipVertical).store(f1 + "min")
 253
 254 ; writeln("maximum of 2 pictures")
 255 ; (p max p.flipVertical).store(f1 + "max")
 256
 257 ; writeln("good bye")
 258
 259end
 260
 261------------------------------------------------------------
weiter

Letzte Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel