bioimage-analysis-fundamentals.md 12.9 KB
Newer Older
Christian Tischer's avatar
Christian Tischer committed
1 2
# Bioimage analysis fundamentals

Christian Tischer's avatar
Christian Tischer committed
3 4
## Pixel values and indices
 
Christian Tischer's avatar
Christian Tischer committed
5 6 7 8 9 10
<img src='https://g.gravizo.com/svg?
 digraph G {
    shift [fontcolor=white,color=white];
    image -> pixel [label="  has many"];
    pixel -> value;
    pixel -> indices;
Christian Tischer's avatar
Christian Tischer committed
11 12 13 14 15 16 17 18 19 20 21
    pixel -> voxel [label="  3D"];   
  }
'/>

### Activity: Explore pixel values and indices

* Open image: xy_8bit__nuclei_noisy_different_intensity.tif
* Explore different ways to inspect pixel values and indices
* Check where the lowest pixel indices are in the displayed image:
	* Most commonly: Upper left corner, which is different to conventional coordinate systems.

22
TODO: add animated-histogram.gif
Christian Tischer's avatar
Christian Tischer committed
23 24 25 26 27 28 29

## Image calibration

<img src='https://g.gravizo.com/svg?
 digraph G {
    shift [fontcolor=white,color=white];
    pixel -> indices;
Christian Tischer's avatar
Christian Tischer committed
30 31 32
    pixel -> coordinates;
    indices -> calibration;
    calibration -> coordinates;
Christian Tischer's avatar
Christian Tischer committed
33
    calibration -> anisotropic [label="  can be"];
Christian Tischer's avatar
Christian Tischer committed
34
    image -> calibration [label="  can have"];
Christian Tischer's avatar
Christian Tischer committed
35 36 37
  }
'/>

Christian Tischer's avatar
Christian Tischer committed
38 39

### Activity: Explore image calibration
Christian Tischer's avatar
Christian Tischer committed
40

Christian Tischer's avatar
Christian Tischer committed
41
* Open image: xy_8bit__nuclei_noisy_different_intensity.tif
Christian Tischer's avatar
Christian Tischer committed
42 43 44 45 46 47 48 49 50
* Add image calibration
* Explore whether and how this affects image display and measurements (e.g. distance between two points)
 
		
### Activity: Explore anisotropic 3D image data

* Open image: xy_8bit_calibrated_anisotropic__mri_stack.tif
	* Appreciate that the pixels are anisotropic

Christian Tischer's avatar
Christian Tischer committed
51
	
Christian Tischer's avatar
Christian Tischer committed
52 53
### Formative assessment

Christian Tischer's avatar
Christian Tischer committed
54
True or false?
Christian Tischer's avatar
Christian Tischer committed
55

Christian Tischer's avatar
Christian Tischer committed
56 57 58
* Changing the image calibration changes the pixel values.
* Pixel coordinates depend on image calibration.
* The lowest pixel index of a 2D image always is `[1,1]`.
Christian Tischer's avatar
Christian Tischer committed
59
* When looking at a 2D image, the lowest pixel indices are always in the lower left corner.
Christian Tischer's avatar
Christian Tischer committed
60

Christian Tischer's avatar
Christian Tischer committed
61 62 63 64 65 66
&nbsp;

&nbsp;

&nbsp;

Christian Tischer's avatar
Christian Tischer committed
67
<div style="page-break-after: always;"></div>
Christian Tischer's avatar
Christian Tischer committed
68

Christian Tischer's avatar
Christian Tischer committed
69 70 71 72 73
## Image display

<img src='https://g.gravizo.com/svg?
 digraph G {
    shift [fontcolor=white,color=white];
Christian Tischer's avatar
Christian Tischer committed
74 75 76 77
    LUT -> color;
    LUT -> brightness;
    min -> LUT;
    max -> LUT;
Christian Tischer's avatar
Christian Tischer committed
78
    value -> LUT;
Christian Tischer's avatar
Christian Tischer committed
79 80 81 82
  }
'/>

```
Christian Tischer's avatar
Christian Tischer committed
83 84
brightness = ( value - min ) / ( max - min )

Christian Tischer's avatar
Christian Tischer committed
85
0 <= brightness <= 1 
Christian Tischer's avatar
Christian Tischer committed
86 87

contrast = max - min 
Christian Tischer's avatar
Christian Tischer committed
88 89
``` 

90 91
TODO: add animated image contrast demo from twitter

Christian Tischer's avatar
Christian Tischer committed
92 93
### Activity

Christian Tischer's avatar
Christian Tischer committed
94
* Open image: xy_8bit__nuclei_noisy_different_intensity.tif
Christian Tischer's avatar
Christian Tischer committed
95
* Explore different LUTs and LUT settings
Christian Tischer's avatar
Christian Tischer committed
96
	* Appreciate that LUT settings do not affect image content.
Christian Tischer's avatar
Christian Tischer committed
97 98


Christian Tischer's avatar
Christian Tischer committed
99 100
### Formative Assessment

Christian Tischer's avatar
Christian Tischer committed
101
Fill in the blanks, using those words: decrease, larger than, increase, smaller than 
Christian Tischer's avatar
Christian Tischer committed
102

Christian Tischer's avatar
Christian Tischer committed
103 104 105 106
1. Pixels with values _____ `max` will appear saturated. 
2. Decreasing `max` while keeping `min` constant will _____ the contrast.
3. Decreasing both `max` and `min` will _____ the overall brightness.
4. Pixels with values _____ the `min` will appear black, when using a grayscale LUT.
Christian Tischer's avatar
Christian Tischer committed
107 108 109 110 111 112 113 114


&nbsp;

&nbsp;

&nbsp;

Christian Tischer's avatar
Christian Tischer committed
115

116

Christian Tischer's avatar
Christian Tischer committed
117 118 119 120 121
## Image math and pixel data types

<img src='https://g.gravizo.com/svg?
 digraph G {
    shift [fontcolor=white,color=white];
122
    "data type" -> "pixel values" [label="  restricts"];
123 124
    "image math" -> "pixel values" [label="  changes"];
    "N-bit unsigned integer" -> "0, 1, ..., 2^N-1";
Christian Tischer's avatar
Christian Tischer committed
125 126
    "data type" -> float -> "..., -1031.0, ..., 10.5, ...";
    "data type" -> "...";
Christian Tischer's avatar
Christian Tischer committed
127
    "data type" -> "N-bit unsigned integer";
Christian Tischer's avatar
Christian Tischer committed
128 129 130 131 132
  }
'/>

### Activity: Pixel based background subtraction

Christian Tischer's avatar
Christian Tischer committed
133
* Open image: xy_8bit__nuclei_noisy_different_intensity.tif
134
* Appreciate the significant background intensity
Christian Tischer's avatar
Christian Tischer committed
135 136
* Measure pixel values at `[ 28, 35 ]` and `[ 28, 39 ]`
* Measure the image background intensity in this region:
137 138 139
    * upper left corner at `[ 20, 35 ]`
    * width = 10
    * height = 10
Christian Tischer's avatar
Christian Tischer committed
140
* Subtract the measured background intensity from each pixel.
Christian Tischer's avatar
Christian Tischer committed
141
* Measure the pixel values again. 
Christian Tischer's avatar
Christian Tischer committed
142
* Observe that the resuls are incorrect.
Christian Tischer's avatar
Christian Tischer committed
143 144 145

Repeat above activity, but:

Christian Tischer's avatar
Christian Tischer committed
146
* After opening the image, convert its data type to floating point.
Christian Tischer's avatar
Christian Tischer committed
147

Christian Tischer's avatar
Christian Tischer committed
148
### Activity: Explore the limitations of `float` data type
Christian Tischer's avatar
Christian Tischer committed
149

Christian Tischer's avatar
Christian Tischer committed
150 151 152 153
* Create an empty image
* Set all pixel values to 1000000000.0
* Add 1.0 to all pixel values
* Be shocked...
Christian Tischer's avatar
Christian Tischer committed
154 155 156 157 158

...it turns out that from 16777216 on you cannot represent all integers anymore within a float. 

### Formative Assessment

Christian Tischer's avatar
Christian Tischer committed
159
True or false?
Christian Tischer's avatar
Christian Tischer committed
160

Christian Tischer's avatar
Christian Tischer committed
161 162 163 164 165
* Subtracting 100 from 50 in a 8-bit image will result in -50.
* Adding 1 to 255 in a 8-bit image will result in 256.
* Subtracting 10.1 from 10.0 in a float image will result in -0.1
* Adding 1.0 to 255.0 in a float image will result in 256.0
* Adding 1000.0 to 1000000000.0 in a float image will result in 1000001000.0
Christian Tischer's avatar
Christian Tischer committed
166 167 168

### Learn more

Christian Tischer's avatar
Christian Tischer committed
169
* [Limitations of float](https://randomascii.wordpress.com/2012/02/13/dont-store-that-in-a-float/)
Christian Tischer's avatar
Christian Tischer committed
170

Christian Tischer's avatar
Christian Tischer committed
171 172 173 174 175 176
&nbsp;

&nbsp;

&nbsp;

177
## Pixel data type conversions
Christian Tischer's avatar
Christian Tischer committed
178 179 180 181

<img src='https://g.gravizo.com/svg?
 digraph G {
    shift [fontcolor=white,color=white];
Christian Tischer's avatar
Christian Tischer committed
182 183
    "data type conversion" -> "values" [label="  can change"];
    "data type conversion" -> "value range" [label="  changes"];
Christian Tischer's avatar
Christian Tischer committed
184 185 186 187 188
  }
'/>

### Activity: 16-bit to 8-bit conversion

Christian Tischer's avatar
Christian Tischer committed
189
* Open image: xy_16bit__two_values.tif
Christian Tischer's avatar
Christian Tischer committed
190
* Convert to 8-bit
Christian Tischer's avatar
Christian Tischer committed
191
* Understand the mathematics underlying the conversion from 16-bit to 8-bit.
Christian Tischer's avatar
Christian Tischer committed
192 193 194

### Activity: 16-bit to float conversion

Christian Tischer's avatar
Christian Tischer committed
195
* Open image: xy_16bit__two_values.tif
Christian Tischer's avatar
Christian Tischer committed
196
* Convert to float
Christian Tischer's avatar
Christian Tischer committed
197 198 199

### Formative Assessment

Christian Tischer's avatar
Christian Tischer committed
200
True or false? Discuss with your neighbor!
Christian Tischer's avatar
Christian Tischer committed
201 202 203 204

1. Changing pixel data type never changes pixel values.
2. Converting from 16-bit unsigned integer to float never changes the pixel values.
3. Changing from float to 16-bit unsigned integer never changes the pixel values.
Christian Tischer's avatar
Christian Tischer committed
205
4. There is only one correct way to convert from 16-bit to 8-bit.
Christian Tischer's avatar
Christian Tischer committed
206

Christian Tischer's avatar
Christian Tischer committed
207 208 209 210 211 212
&nbsp;

&nbsp;

&nbsp;

Christian Tischer's avatar
Christian Tischer committed
213 214
## Thresholding

Christian Tischer's avatar
Christian Tischer committed
215
In order to find objects in a image, the first step often is to determine whether a pixel is part of an object (foreground) or of the image background. In fluorescence microscopy this often can be achieved by thresholding.
Christian Tischer's avatar
Christian Tischer committed
216 217 218

<img src='https://g.gravizo.com/svg?
 digraph G {
Christian Tischer's avatar
Christian Tischer committed
219 220 221 222 223 224 225 226 227 228 229
	shift [fontcolor=white,color=white];
	"intensity image" -> threshold;
	threshold -> "binary image";
	"binary image" -> "mask" [label="  aka"];
	"binary image" -> "background value";
	"binary image" -> "foreground value";
	"background value" -> "0";
	"foreground value" -> "1";
	"foreground value" -> "255";
	"pixel value" -> ">= threshold" -> foreground;
	"pixel value" -> "< threshold" -> background;
Christian Tischer's avatar
Christian Tischer committed
230 231 232
 }
'/>

Christian Tischer's avatar
Christian Tischer committed
233
### Activity: Threshold an image
Christian Tischer's avatar
Christian Tischer committed
234

Christian Tischer's avatar
Christian Tischer committed
235
* Open image: xy_8bit__two_cells.tif
Christian Tischer's avatar
Christian Tischer committed
236
* Convert the image to a binary image by means of thresholding.
Christian Tischer's avatar
Christian Tischer committed
237

Christian Tischer's avatar
Christian Tischer committed
238
### Formative assessment
Christian Tischer's avatar
Christian Tischer committed
239

Christian Tischer's avatar
Christian Tischer committed
240
True or false? Discuss with your neighbour!
Christian Tischer's avatar
Christian Tischer committed
241

Christian Tischer's avatar
Christian Tischer committed
242 243 244 245
* For each image there is only one correct threshold value.
* The result of thresholding is a binary image.
* A binary image can have three values: `-1, 0, +1`
* Values below the threshold are always set to `1`.
Christian Tischer's avatar
Christian Tischer committed
246

Christian Tischer's avatar
Christian Tischer committed
247 248 249 250 251 252 253
&nbsp;

&nbsp;

&nbsp;


Christian Tischer's avatar
Christian Tischer committed
254 255 256 257 258
## Connected components analysis

<img src='https://g.gravizo.com/svg?
 digraph G {
    shift [fontcolor=white,color=white];
Christian Tischer's avatar
Christian Tischer committed
259 260
    "intensity image" -> "connected component analysis" -> "label image";
    connectivity -> "connected component analysis"; 
Christian Tischer's avatar
Christian Tischer committed
261 262 263 264 265 266
  }
'/>


### Activity: 2D connected components analysis

Christian Tischer's avatar
Christian Tischer committed
267
* Open image: xy_8bit_binary__nuclei.tif
Christian Tischer's avatar
Christian Tischer committed
268 269 270
* Perform connected components analysis
* Explore multi-color LUTs for object labelling
* Explore removing and joining labels
Christian Tischer's avatar
Christian Tischer committed
271 272 273 274 275 276


### Activity: 3D connected components analysis

Repeat above activity but use a 3D image:

Christian Tischer's avatar
Christian Tischer committed
277
* Open image: xyz_8bit_binary__spots.tif
Christian Tischer's avatar
Christian Tischer committed
278 279 280

### Formative assessment

Christian Tischer's avatar
Christian Tischer committed
281
Fill in the blanks, using these words: less, more, 8, 255, 4, more.
Christian Tischer's avatar
Christian Tischer committed
282

Christian Tischer's avatar
Christian Tischer committed
283 284 285 286 287 288
1. In 3D, pixels have _____ neighbors than in 2D.
2. 8-connected connectivity results in _____ objects than 4-connected connectivity.
3. In 3D, pixels have ____ non-diagonal neighbors.
4. In 2D, pixels have ____ non-diagonal neighbors.
5. A 8-bit label image can maximally have _____ objects.
6. The maximum value in a label image is equal to or _____ than the number of objects.
Christian Tischer's avatar
Christian Tischer committed
289 290


Christian Tischer's avatar
Christian Tischer committed
291 292 293 294 295 296 297
&nbsp;

&nbsp;

&nbsp;


Christian Tischer's avatar
Christian Tischer committed
298 299 300 301
## Shape measurements

<img src='https://g.gravizo.com/svg?
 digraph G {
Christian Tischer's avatar
Christian Tischer committed
302 303 304 305 306
	shift [fontcolor=white,color=white];
	"label image" -> shape_analysis -> table;
	table -> object_rows;
	table -> feature_columns;
	table -> visualisation;  
Christian Tischer's avatar
Christian Tischer committed
307 308 309 310 311 312
}
'/>


### Activity: Measure object shape parameters

Christian Tischer's avatar
Christian Tischer committed
313
* Open image: xy_8bit_labels__four_objects.tif
Christian Tischer's avatar
Christian Tischer committed
314
* Perform shape measurements and discuss their meanings.
Christian Tischer's avatar
Christian Tischer committed
315 316
* Explore results visualisation
	* Color objects by their measurement values.
Christian Tischer's avatar
Christian Tischer committed
317 318
* Add a calibration to the image and check which shape measurements are affected.
* Draw a test image to understand the shape measurements even better.
Christian Tischer's avatar
Christian Tischer committed
319

Christian Tischer's avatar
Christian Tischer committed
320 321 322 323 324 325 326 327
### Activity: Explore sampling limits

* Draw a square (=circle) of 2x2 pixels (paper, whiteboard, ...)
	* Measure area, perimeter and circularity
	* Discuss the results
* Discuss the England's coastline paradox 


Christian Tischer's avatar
Christian Tischer committed
328 329
### Formative assessment

Christian Tischer's avatar
Christian Tischer committed
330
True or false? Discuss with your neighbour!
Christian Tischer's avatar
Christian Tischer committed
331

Christian Tischer's avatar
Christian Tischer committed
332 333 334 335 336
* Circularity is independent of image calibration.
* Area is independent of image calibration.
* Perimeter can strongly depend on spatial sampling.
* Volume can strongly depend on spatial sampling.
* Drawing test images to check how certain shape parameters behave is a good idea.
Christian Tischer's avatar
Christian Tischer committed
337 338 339

### Learn more

Christian Tischer's avatar
Christian Tischer committed
340 341 342 343 344
* Especially surface and perimeter measurements are affected by sampling and resolution, see for example:
	* https://en.wikipedia.org/wiki/Coastline_paradox).
* Results visualisation:
	* https://imagej.net/MorphoLibJ#Grayscale_morphological_filters: **Label visualization in 3D viewer**

Christian Tischer's avatar
Christian Tischer committed
345

Christian Tischer's avatar
Christian Tischer committed
346 347 348 349 350 351 352
&nbsp;

&nbsp;

&nbsp;


Christian Tischer's avatar
Christian Tischer committed
353 354 355 356 357
## Object shape measurement workflow

<img src='https://g.gravizo.com/svg?
 digraph G {
    shift [fontcolor=white,color=white];
Christian Tischer's avatar
Christian Tischer committed
358 359 360
    "intensity image" -> "binary image" [label="  threshold"];
    "binary image" -> "label image" [label="  connected components"];
    "label image" -> table [label="  measure_shape"];
Christian Tischer's avatar
Christian Tischer committed
361 362 363 364 365
}
'/>

### Activity: Segment objects and measure shapes

Christian Tischer's avatar
Christian Tischer committed
366
* Open image: xy_8bit__two_cells.tif
Christian Tischer's avatar
Christian Tischer committed
367 368
* Segment the cells and measure their shapes.
	* Devise code to automate the workflow.
Christian Tischer's avatar
Christian Tischer committed
369 370 371

### Formative assessment

Christian Tischer's avatar
Christian Tischer committed
372
Fill in below blanks, using these words: equal_to, larger_than, smaller_than, binary, connected_component_analysis, thresholding
Christian Tischer's avatar
Christian Tischer committed
373

Christian Tischer's avatar
Christian Tischer committed
374 375 376 377 378
1. A label image is the result of _____ .
2. The number of pixels in a binary image is typically _____ the number of connected components. 
3. The number of distinct values in a label image is _____ the number of objects (minus one).
4. Converting an intensity image to a _____ image can be achieved by _____ .
5. The number of connected components can be _____ the maximal label.
Christian Tischer's avatar
Christian Tischer committed
379

Christian Tischer's avatar
Christian Tischer committed
380 381 382 383 384 385 386
&nbsp;

&nbsp;

&nbsp;


Christian Tischer's avatar
Christian Tischer committed
387
## Intensity measurements
Christian Tischer's avatar
Christian Tischer committed
388

Christian Tischer's avatar
Christian Tischer committed
389
### Activity: Measure intensities in image regions
Christian Tischer's avatar
Christian Tischer committed
390

Christian Tischer's avatar
Christian Tischer committed
391
* Open image: xy_float__h2b_bg_corr.tif
Christian Tischer's avatar
Christian Tischer committed
392 393 394 395 396 397 398
* Measure for both nuclei:
	* Maximum intensity
	* Average intensity
	* Median intensity
	* Sum intensity
* Discuss the interpretation!
* Discuss where to measure!
Christian Tischer's avatar
Christian Tischer committed
399 400


Christian Tischer's avatar
Christian Tischer committed
401 402 403
### Activity: Intensity measurements without pixel based background correction

#### Motivation
Christian Tischer's avatar
Christian Tischer committed
404

Christian Tischer's avatar
Christian Tischer committed
405
There are several good reasons not to subtract the background from each pixel in an image: 
Christian Tischer's avatar
Christian Tischer committed
406

Christian Tischer's avatar
Christian Tischer committed
407 408
* It is a bit tricky to do it right, because one has to convert to float to accomodate floting point and negative values.
* If one has really big image data (TB) one would need (at least) another TB storage for the background corrected version of the image.
Christian Tischer's avatar
Christian Tischer committed
409

Christian Tischer's avatar
Christian Tischer committed
410
#### Workflow
Christian Tischer's avatar
Christian Tischer committed
411

Christian Tischer's avatar
Christian Tischer committed
412
* Open image: xy_calibrated_8bit__two_nuclei_high_background.tif
Christian Tischer's avatar
Christian Tischer committed
413 414 415 416 417 418 419 420 421 422
* Measure for both nuclei and a background region:
	* Maximum intensity
	* Average intensity
	* Median intensity
	* Sum intensity
* Discuss how to correct the intensities for the background
	* Appreciate that you also need the region areas for this task
	* Measure the region areas
		* Watch out: the image is calibrated!
		* Use the area for the correction.
Christian Tischer's avatar
Christian Tischer committed
423

Christian Tischer's avatar
Christian Tischer committed
424
### Formative assessment: Intensity measurements
Christian Tischer's avatar
Christian Tischer committed
425

Christian Tischer's avatar
Christian Tischer committed
426
Fill in the blanks, using these words: integrated, mean, number_of_pixels, decrease, increase, sum
Christian Tischer's avatar
Christian Tischer committed
427

Christian Tischer's avatar
Christian Tischer committed
428 429 430 431
1. Average intensity is just another word for _____ intensity.
2. The _____ intensity is equal to the mean intensity times the _____ in the measured region.
3. In an 8-bit image, increasing the size of the measurement region can only _____ the sum intensity.
4. In a float image, increasing the size of the measurement region can _____ the sum intensity. 
Christian Tischer's avatar
Christian Tischer committed
432

Christian Tischer's avatar
Christian Tischer committed
433 434 435 436 437 438 439
&nbsp;

&nbsp;

&nbsp;


Christian Tischer's avatar
Christian Tischer committed
440 441 442 443 444 445
## Convolution filters

<img src='https://g.gravizo.com/svg?
 digraph G {
    shift [fontcolor=white,color=white];
    "intensity image" -> "convolution" -> "filtered image";
Christian Tischer's avatar
Christian Tischer committed
446 447
    "small image" -> size;
    "small image" -> "pixel values";
Christian Tischer's avatar
Christian Tischer committed
448
    "kernel" -> "small image" [label="  is"]; 
Christian Tischer's avatar
Christian Tischer committed
449 450 451 452 453 454
    "kernel" -> "convolution";
}
'/>

### Activity: Explore convolution filters

Christian Tischer's avatar
Christian Tischer committed
455
* Open image: xy_8bit__nuclei_noisy_different_intensity.tif
Christian Tischer's avatar
Christian Tischer committed
456 457 458 459 460 461
* Try the result of different convolution filters, e.g.
	* https://en.wikipedia.org/wiki/Kernel_(image_processing)
	* Mean filter
	* Gaussian blur
	* Edge detection
* Appreciate that the results are (slightly) wrong within the 8-bit range of the input image.
Christian Tischer's avatar
Christian Tischer committed
462 463 464

### Activity: Use mean filter to facilitate image segmentation

Christian Tischer's avatar
Christian Tischer committed
465
* Open image: xy_8bit__nuclei_noisy_different_intensity.tif
Christian Tischer's avatar
Christian Tischer committed
466 467 468
* Appreciate that you cannot readily threshold the image
* Apply a mean filter
* Threshold the filtered image
Christian Tischer's avatar
Christian Tischer committed
469 470 471

### Formative assessment

Christian Tischer's avatar
Christian Tischer committed
472 473
* Draw the kernel of a 3x3 mean filter.
* Draw three different kernels that enhance edges.
Christian Tischer's avatar
Christian Tischer committed
474 475 476
 
### Learn more

Christian Tischer's avatar
Christian Tischer committed
477
* https://en.wikipedia.org/wiki/Kernel_(image_processing)
Christian Tischer's avatar
Christian Tischer committed
478

Christian Tischer's avatar
Christian Tischer committed
479

Christian Tischer's avatar
Christian Tischer committed
480 481 482 483 484 485 486
&nbsp;

&nbsp;

&nbsp;


Christian Tischer's avatar
Christian Tischer committed
487
## Typical image analysis workflow
Christian Tischer's avatar
Christian Tischer committed
488

Christian Tischer's avatar
Christian Tischer committed
489
![image](/uploads/b4bdce17515908f40d858b35d5e9256e/image.png)
Christian Tischer's avatar
Christian Tischer committed
490

Christian Tischer's avatar
Christian Tischer committed
491 492 493 494 495 496 497
&nbsp;

&nbsp;

&nbsp;


Christian Tischer's avatar
Christian Tischer committed
498 499