From b3fcaf007507eef03a5b32a214115b69a950ce20 Mon Sep 17 00:00:00 2001 From: ItsMAX0112 Date: Tue, 13 Aug 2024 15:41:24 +0530 Subject: [PATCH] init2 --- lab1/src/a.out | Bin 0 -> 124008 bytes lab1/src/detail_times.txt | 35 ++++++ lab1/src/graph.py | 26 +++++ lab1/src/image_sharpener.cpp | 204 ++++++++++++++++++++++++++--------- lab1/src/read_times.txt | 35 ++++++ lab1/src/runall.sh | 24 +++++ lab1/src/sharp_times.txt | 35 ++++++ lab1/src/smooth_times.txt | 35 ++++++ lab1/src/text_parser.py | 26 +++++ lab1/src/write_times.txt | 35 ++++++ 10 files changed, 402 insertions(+), 53 deletions(-) create mode 100644 lab1/src/a.out create mode 100644 lab1/src/detail_times.txt create mode 100644 lab1/src/graph.py create mode 100644 lab1/src/read_times.txt create mode 100644 lab1/src/runall.sh create mode 100644 lab1/src/sharp_times.txt create mode 100644 lab1/src/smooth_times.txt create mode 100644 lab1/src/text_parser.py create mode 100644 lab1/src/write_times.txt diff --git a/lab1/src/a.out b/lab1/src/a.out new file mode 100644 index 0000000000000000000000000000000000000000..6331fab927e177b5fe09f5ea6869247ab5f58200 GIT binary patch literal 124008 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 Lx-3DN)A@e^C^+98 literal 0 HcmV?d00001 diff --git a/lab1/src/detail_times.txt b/lab1/src/detail_times.txt new file mode 100644 index 0000000..1e2c434 --- /dev/null +++ b/lab1/src/detail_times.txt @@ -0,0 +1,35 @@ +../images/1.ppm 0.0240894 +../images/2.ppm 0.0798028 +../images/3.ppm 0.136535 +../images/4.ppm 0.248314 +../images/5.ppm 0.363927 +../images/6.ppm 0.814739 +../images/7.ppm 3.20648 +../images/1.ppm 0.0255179 +../images/2.ppm 0.082453 +../images/3.ppm 0.187293 +../images/4.ppm 0.504723 +../images/5.ppm 0.421034 +../images/6.ppm 0.905171 +../images/7.ppm 4.12279 +../images/1.ppm 0.0105311 +../images/2.ppm 0.0422888 +../images/3.ppm 0.0912897 +../images/4.ppm 0.204927 +../images/5.ppm 0.497162 +../images/6.ppm 0.452158 +../images/7.ppm 1.66216 +../images/1.ppm 0.0135349 +../images/2.ppm 0.0437362 +../images/3.ppm 0.0821199 +../images/4.ppm 0.54249 +../images/5.ppm 0.39126 +../images/6.ppm 0.555806 +../images/7.ppm 2.16977 +../images/1.ppm 0.0217065 +../images/2.ppm 0.0748607 +../images/3.ppm 0.174253 +../images/4.ppm 0.201994 +../images/5.ppm 0.352959 +../images/6.ppm 0.497504 +../images/7.ppm 1.79435 diff --git a/lab1/src/graph.py b/lab1/src/graph.py new file mode 100644 index 0000000..ebb4f8e --- /dev/null +++ b/lab1/src/graph.py @@ -0,0 +1,26 @@ +import matplotlib.pyplot as plt + +pixels = [81000, 308898, 588800, 1164800, 1500000, 3406500, 9262500] +read_time = [0.0372315, 0.1104362, 0.162849, 0.3120326, 0.4681494, 0.9840036, 1.665642] +smoothened_time = [0.03347448, 0.1221104, 0.2514082, 0.4795412, 0.6044902, 1.1334092, 2.453936] +details_time = [0.01907596, 0.0646283, 0.13429812, 0.3404896, 0.4052684, 0.6450756, 2.591112] +sharpened_time = [0.02013736, 0.07459558, 0.13045596, 0.2987406, 0.4569202, 0.699245, 3.019178] +write_time = [0.010278664, 0.03954574, 0.05814792, 0.1842653, 0.2484992, 0.304828, 1.119439] + + +plt.figure(figsize=(12, 8)) +plt.plot(pixels, read_time, marker='o', label='Read Time') +plt.plot(pixels, smoothened_time, marker='o', label='Smoothened Time') +plt.plot(pixels, details_time, marker='o', label='Details Time') +plt.plot(pixels, sharpened_time, marker='o', label='Sharpened Time') +plt.plot(pixels, write_time, marker='o', label='Write Time') + +plt.xlabel('Pixels') +plt.ylabel('Time (seconds)') +plt.title('Pixels vs Time') +plt.legend() +plt.grid(True) +plt.xscale('log') +plt.yscale('log') + +plt.show() diff --git a/lab1/src/image_sharpener.cpp b/lab1/src/image_sharpener.cpp index b76171a..f158146 100644 --- a/lab1/src/image_sharpener.cpp +++ b/lab1/src/image_sharpener.cpp @@ -1,6 +1,8 @@ #include #include "libppm.h" #include +#include +#include using namespace std; @@ -15,79 +17,123 @@ struct image_t* S1_smoothen(struct image_t *input_image) smoother->height = height; smoother->width = width; smoother->image_pixels = new uint8_t**[height]; - for(int i = 0; i < height; i++) - { - smoother->image_pixels[i] = new uint8_t*[width]; - for(int j = 0; j < width; j++) - smoother->image_pixels[i][j] = new uint8_t[3]; - } + for(int i = 0; i < height; i++) + { + smoother->image_pixels[i] = new uint8_t*[width]; + for(int j = 0; j < width; j++) + smoother->image_pixels[i][j] = new uint8_t[3]; + } for(int i = 1; i < height-1; i++) + { + for(int j = 1; j < width-1; j++) { - for(int j = 1; j < width-1; j++) + for(int k = 0; k < 3; k++) { - for(int k = 0; k < 3; k++) - { - //image->image_pixels[i][j][k] = val; - //cout << unsigned( input_image->image_pixels[i][j][k]) << endl; - //break; - // edge cases - if(i == 0 && j == 0) { // i-1 and j - 1 doesnt exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9 + input_image->image_pixels[i+1][j+1][k] / 9); - - } - else if(i == height - 1 && j == 0) { // i+1 and j-1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9); - } + //image->image_pixels[i][j][k] = val; + // edge cases + if(i == 0 && j == 0) { // i-1 and j - 1 doesnt exist + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9 + input_image->image_pixels[i+1][j+1][k] / 9); - else if(i == 0 && j == width - 1) { // i-1 and j+1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i+1][j-1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9); - } - else if(i == height - 1 && j == width - 1) { // i+1 and j+1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9 + input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9); - } - else if (i == 0) { // i - 1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9+ input_image->image_pixels[i+1][j-1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9+ input_image->image_pixels[i+1][j+1][k] / 9); - } - - else if(j == 0) { // j -1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9+ input_image->image_pixels[i+1][j+1][k]/ 9); - } - - else if(i == height - 1) { // i+1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9+ input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j-1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k]/ 9); - } - else if(j == width - 1) { // j + 1 does not exist - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9+ input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i][j-1][k] / 9+ input_image->image_pixels[i][j][k]/ 9 + input_image->image_pixels[i+1][j-1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9); - } - else { - smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9 + input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i-1][j+1][k]/9 + input_image->image_pixels[i][j-1][k]/9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j+1][k] / 9 + input_image->image_pixels[i+1][j-1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9 + input_image->image_pixels[i+1][j+1][k] / 9); - cout << unsigned(smoother->image_pixels[i][j][k]) << endl; + } + else if(i == height - 1 && j == 0) { // i+1 and j-1 does not exist + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9); + } + + else if(i == 0 && j == width - 1) { // i-1 and j+1 does not exist + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i+1][j-1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9); + } + else if(i == height - 1 && j == width - 1) { // i+1 and j+1 does not exist + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9 + input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9); + } + else if (i == 0) { // i - 1 does not exist + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j-1][k] / 9 + input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9+ input_image->image_pixels[i+1][j-1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9+ input_image->image_pixels[i+1][j+1][k] / 9); } + + else if(j == 0) { // j -1 does not exist + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9+ input_image->image_pixels[i+1][j+1][k]/ 9); + } + + else if(i == height - 1) { // i+1 does not exist + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9+ input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i-1][j+1][k] / 9+ input_image->image_pixels[i][j-1][k] / 9+ input_image->image_pixels[i][j][k] / 9+ input_image->image_pixels[i][j+1][k]/ 9); + } + else if(j == width - 1) { // j + 1 does not exist + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9+ input_image->image_pixels[i-1][j][k] / 9+ input_image->image_pixels[i][j-1][k] / 9+ input_image->image_pixels[i][j][k]/ 9 + input_image->image_pixels[i+1][j-1][k] / 9+ input_image->image_pixels[i+1][j][k] / 9); + } + else { + smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9 + input_image->image_pixels[i-1][j][k] / 9 + input_image->image_pixels[i-1][j+1][k]/9 + input_image->image_pixels[i][j-1][k]/9 + input_image->image_pixels[i][j][k] / 9 + input_image->image_pixels[i][j+1][k] / 9 + input_image->image_pixels[i+1][j-1][k] / 9 + input_image->image_pixels[i+1][j][k] / 9 + input_image->image_pixels[i+1][j+1][k] / 9); + } } } + } - for(int i = 0; i < height; ++i) { - break; - for(int j = 0; j < width; ++j) { - cout << unsigned(smoother->image_pixels[i][j][0]) << "" ; - } - cout << endl; - } return smoother; } struct image_t* S2_find_details(struct image_t *input_image, struct image_t *smoothened_image) { // TODO - return 0; + int width = input_image->width; + int height = input_image->height; + + struct image_t* details = new struct image_t; + details->height = height; + details->width = width; + details->image_pixels = new uint8_t**[height]; + + for(int i = 0; i < height; i++) + { + details->image_pixels[i] = new uint8_t*[width]; + for(int j = 0; j < width; j++) + details->image_pixels[i][j] = new uint8_t[3]; + } + + for(int i = 1; i < height-1; i++) + { + for(int j = 1; j < width-1; j++) + { + for(int k = 0; k < 3; k++) + { + details->image_pixels[i][j][k] = max(0, input_image->image_pixels[i][j][k] - smoothened_image->image_pixels[i][j][k]); + } + } + } + + return details; } struct image_t* S3_sharpen(struct image_t *input_image, struct image_t *details_image) { // TODO - return input_image; //TODO remove this line when adding your code + int width = input_image->width; + int height = input_image->height; + + int a = 1; + + struct image_t* sharp = new struct image_t; + sharp->height = height; + sharp->width = width; + sharp->image_pixels = new uint8_t**[height]; + + for(int i = 0; i < height; i++) + { + sharp->image_pixels[i] = new uint8_t*[width]; + for(int j = 0; j < width; j++) + sharp->image_pixels[i][j] = new uint8_t[3]; + } + + for(int i = 1; i < height-1; i++) + { + for(int j = 1; j < width-1; j++) + { + for(int k = 0; k < 3; k++) + { + sharp->image_pixels[i][j][k] = min(255, input_image->image_pixels[i][j][k] + details_image->image_pixels[i][j][k]) * a; + } + } + } + return sharp; //TODO remove this line when adding your code } int main(int argc, char **argv) @@ -98,15 +144,67 @@ int main(int argc, char **argv) exit(0); } + auto startread = chrono::high_resolution_clock::now(); struct image_t *input_image = read_ppm_file(argv[1]); + auto endread = std::chrono::high_resolution_clock::now(); + auto startsmooth = chrono::high_resolution_clock::now(); struct image_t *smoothened_image = S1_smoothen(input_image); + auto endsmooth = std::chrono::high_resolution_clock::now(); + auto startdetail = chrono::high_resolution_clock::now(); struct image_t *details_image = S2_find_details(input_image, smoothened_image); + auto enddetail = std::chrono::high_resolution_clock::now(); + auto startsharp = chrono::high_resolution_clock::now(); struct image_t *sharpened_image = S3_sharpen(input_image, details_image); + auto endsharp = std::chrono::high_resolution_clock::now(); - write_ppm_file(argv[2], smoothened_image); + auto startwrite = chrono::high_resolution_clock::now(); + write_ppm_file(argv[2], sharpened_image); + auto endwrite = std::chrono::high_resolution_clock::now(); + + chrono::duration readduration = endread - startread; + chrono::duration smoothduration = endsmooth - startsmooth; + chrono::duration detailduration = enddetail - startdetail; + chrono::duration sharpduration = endsharp - startsharp; + chrono::duration writeduration = endwrite - startwrite; + + + ofstream logFile("read_times.txt", std::ios_base::app); + if (logFile.is_open()) { + logFile << argv[1] << " "; + logFile << readduration.count() << endl; + logFile.close(); + } + + logFile.open("smooth_times.txt", std::ios_base::app); + if (logFile.is_open()) { + logFile << argv[1] << " "; + logFile << smoothduration.count() << endl; + logFile.close(); + } + + logFile.open("detail_times.txt", std::ios_base::app); + if (logFile.is_open()) { + logFile << argv[1] << " "; + logFile << detailduration.count() << endl; + logFile.close(); + } + + logFile.open("sharp_times.txt", std::ios_base::app); + if (logFile.is_open()) { + logFile << argv[1] << " "; + logFile << sharpduration.count() << endl; + logFile.close(); + } + + logFile.open("write_times.txt", std::ios_base::app); + if (logFile.is_open()) { + logFile << argv[1] << " "; + logFile << writeduration.count() << endl; + logFile.close(); + } return 0; } diff --git a/lab1/src/read_times.txt b/lab1/src/read_times.txt new file mode 100644 index 0000000..092213e --- /dev/null +++ b/lab1/src/read_times.txt @@ -0,0 +1,35 @@ +../images/1.ppm 0.0436004 +../images/2.ppm 0.200632 +../images/3.ppm 0.142189 +../images/4.ppm 0.328569 +../images/5.ppm 0.584479 +../images/6.ppm 1.57548 +../images/7.ppm 1.44286 +../images/1.ppm 0.0362725 +../images/2.ppm 0.121128 +../images/3.ppm 0.199664 +../images/4.ppm 0.402522 +../images/5.ppm 0.51656 +../images/6.ppm 0.831204 +../images/7.ppm 1.68258 +../images/1.ppm 0.0502397 +../images/2.ppm 0.0540259 +../images/3.ppm 0.104212 +../images/4.ppm 0.217633 +../images/5.ppm 0.566316 +../images/6.ppm 1.06233 +../images/7.ppm 1.76924 +../images/1.ppm 0.0191352 +../images/2.ppm 0.0632993 +../images/3.ppm 0.0990502 +../images/4.ppm 0.304179 +../images/5.ppm 0.306761 +../images/6.ppm 0.740531 +../images/7.ppm 1.62881 +../images/1.ppm 0.0369097 +../images/2.ppm 0.113096 +../images/3.ppm 0.26913 +../images/4.ppm 0.30726 +../images/5.ppm 0.366631 +../images/6.ppm 0.711473 +../images/7.ppm 1.80572 diff --git a/lab1/src/runall.sh b/lab1/src/runall.sh new file mode 100644 index 0000000..4b116f0 --- /dev/null +++ b/lab1/src/runall.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# List of input and output file pairs +input_files=("1" "2" "3" "4" "5" "6" "7") +output_files=("output1" "output2" "output3" "output4" "output5" "output6" "output7") + +# Loop through each file pair and run the make command +for i in "${!input_files[@]}" +do + input_file="${input_files[$i]}" + output_file="${output_files[$i]}" + + echo "Running make for input: $input_file and output: $output_file" + make run-sharpen INPUT="$input_file" OUTPUT="$output_file" + + # Check if make was successful + if [ $? -ne 0 ]; then + echo "Make failed for input: $input_file and output: $output_file" + exit 1 + fi +done + +echo "Make completed successfully for all file pairs." + diff --git a/lab1/src/sharp_times.txt b/lab1/src/sharp_times.txt new file mode 100644 index 0000000..a6fa605 --- /dev/null +++ b/lab1/src/sharp_times.txt @@ -0,0 +1,35 @@ +../images/1.ppm 0.0285746 +../images/2.ppm 0.118526 +../images/3.ppm 0.133181 +../images/4.ppm 0.333111 +../images/5.ppm 0.687696 +../images/6.ppm 0.919815 +../images/7.ppm 5.18353 +../images/1.ppm 0.0278552 +../images/2.ppm 0.080822 +../images/3.ppm 0.201076 +../images/4.ppm 0.509533 +../images/5.ppm 0.535679 +../images/6.ppm 0.747966 +../images/7.ppm 4.45165 +../images/1.ppm 0.0100292 +../images/2.ppm 0.0381673 +../images/3.ppm 0.0739177 +../images/4.ppm 0.223357 +../images/5.ppm 0.433985 +../images/6.ppm 0.450129 +../images/7.ppm 1.67468 +../images/1.ppm 0.0115579 +../images/2.ppm 0.040362 +../images/3.ppm 0.0973441 +../images/4.ppm 0.257049 +../images/5.ppm 0.231088 +../images/6.ppm 0.573983 +../images/7.ppm 2.23737 +../images/1.ppm 0.0226699 +../images/2.ppm 0.0941006 +../images/3.ppm 0.146761 +../images/4.ppm 0.170653 +../images/5.ppm 0.396153 +../images/6.ppm 0.804332 +../images/7.ppm 2.54863 diff --git a/lab1/src/smooth_times.txt b/lab1/src/smooth_times.txt new file mode 100644 index 0000000..e68cfc9 --- /dev/null +++ b/lab1/src/smooth_times.txt @@ -0,0 +1,35 @@ +../images/1.ppm 0.0422791 +../images/2.ppm 0.118747 +../images/3.ppm 0.26533 +../images/4.ppm 0.377423 +../images/5.ppm 0.673011 +../images/6.ppm 1.36309 +../images/7.ppm 2.34904 +../images/1.ppm 0.0396053 +../images/2.ppm 0.14362 +../images/3.ppm 0.398949 +../images/4.ppm 0.59141 +../images/5.ppm 0.730647 +../images/6.ppm 0.869892 +../images/7.ppm 2.32653 +../images/1.ppm 0.0165813 +../images/2.ppm 0.102202 +../images/3.ppm 0.143081 +../images/4.ppm 0.43276 +../images/5.ppm 0.646602 +../images/6.ppm 1.36732 +../images/7.ppm 2.33917 +../images/1.ppm 0.0341145 +../images/2.ppm 0.079444 +../images/3.ppm 0.163173 +../images/4.ppm 0.501014 +../images/5.ppm 0.52402 +../images/6.ppm 1.03143 +../images/7.ppm 2.75437 +../images/1.ppm 0.0347922 +../images/2.ppm 0.166539 +../images/3.ppm 0.287508 +../images/4.ppm 0.495099 +../images/5.ppm 0.448171 +../images/6.ppm 1.03631 +../images/7.ppm 2.50061 diff --git a/lab1/src/text_parser.py b/lab1/src/text_parser.py new file mode 100644 index 0000000..a22e57d --- /dev/null +++ b/lab1/src/text_parser.py @@ -0,0 +1,26 @@ +import os +from collections import defaultdict + + +file_names = ["read_times.txt", "sharp_times.txt", "smooth_times.txt", "detail_times.txt", "write_times.txt"] + + +def calculate_average_times(file_path): + times = defaultdict(list) + with open(file_path, 'r') as file: + for line in file: + parts = line.strip().split() + if len(parts) == 2: + image, time = parts + times[image].append(float(time)) + + average_times = {image: sum(time_list) / len(time_list) for image, time_list in times.items()} + return average_times + + +for file_name in file_names: + average_times = calculate_average_times(file_name) + print(f"Averages for {file_name}:") + for image, avg_time in sorted(average_times.items()): + print(f"{image}: {avg_time}") + print() diff --git a/lab1/src/write_times.txt b/lab1/src/write_times.txt new file mode 100644 index 0000000..928ccc8 --- /dev/null +++ b/lab1/src/write_times.txt @@ -0,0 +1,35 @@ +../images/1.ppm 0.0129698 +../images/2.ppm 0.0731423 +../images/3.ppm 0.0586685 +../images/4.ppm 0.391597 +../images/5.ppm 0.441327 +../images/6.ppm 0.362438 +../images/7.ppm 1.01397 +../images/1.ppm 0.0104656 +../images/2.ppm 0.0389386 +../images/3.ppm 0.102665 +../images/4.ppm 0.229473 +../images/5.ppm 0.370227 +../images/6.ppm 0.359944 +../images/7.ppm 1.65748 +../images/1.ppm 0.00587877 +../images/2.ppm 0.0390165 +../images/3.ppm 0.0345854 +../images/4.ppm 0.0927168 +../images/5.ppm 0.184159 +../images/6.ppm 0.231483 +../images/7.ppm 1.05401 +../images/1.ppm 0.00660735 +../images/2.ppm 0.0207068 +../images/3.ppm 0.0402921 +../images/4.ppm 0.0976897 +../images/5.ppm 0.119102 +../images/6.ppm 0.249217 +../images/7.ppm 0.822115 +../images/1.ppm 0.0164718 +../images/2.ppm 0.0259248 +../images/3.ppm 0.0545286 +../images/4.ppm 0.10985 +../images/5.ppm 0.127681 +../images/6.ppm 0.322058 +../images/7.ppm 1.0496