Merge branch 'main' of https://gitea.iitdh.ac.in/220010001/OS-Labs
This commit is contained in:
commit
8a470b47ae
|
@ -0,0 +1,59 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"iostream": "cpp",
|
||||||
|
"array": "cpp",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"bit": "cpp",
|
||||||
|
"*.tcc": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"charconv": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"compare": "cpp",
|
||||||
|
"concepts": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"deque": "cpp",
|
||||||
|
"string": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"vector": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"memory_resource": "cpp",
|
||||||
|
"numeric": "cpp",
|
||||||
|
"optional": "cpp",
|
||||||
|
"random": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"string_view": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"fstream": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"iomanip": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"istream": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"new": "cpp",
|
||||||
|
"numbers": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"span": "cpp",
|
||||||
|
"sstream": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"typeinfo": "cpp",
|
||||||
|
"variant": "cpp",
|
||||||
|
"format": "cpp"
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,117 @@
|
||||||
|
#include "important.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <chrono>
|
||||||
|
#include <fstream>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
// if(argc != 3)
|
||||||
|
// {
|
||||||
|
// cout << "usage: ./a.out <path-to-original-image> <path-to-transformed-image>\n\n";
|
||||||
|
// 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();
|
||||||
|
|
||||||
|
int pipe1[2];
|
||||||
|
int pipe2[2];
|
||||||
|
char buf;
|
||||||
|
pid_t CHILD;
|
||||||
|
|
||||||
|
if (pipe(pipe1) == -1) {
|
||||||
|
perror("pipe1");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHILD = fork();
|
||||||
|
if (CHILD == -1) {
|
||||||
|
perror("fork");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CHILD == 0) { /* Child reads from pipe */
|
||||||
|
|
||||||
|
if (pipe(pipe2) == -1) {
|
||||||
|
perror("pipe2");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t GRAND_CHILD = fork();
|
||||||
|
|
||||||
|
if (GRAND_CHILD == -1) {
|
||||||
|
perror("fork");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GRAND_CHILD == 0) { /* Child reads from pipe */
|
||||||
|
close(pipe1[1]); /* Close unused write end for s1_s2 pipe */
|
||||||
|
close(pipe1[0]); /* Close unused read end for s1_s2 pipe */
|
||||||
|
close(pipe2[1]); /* Close unused write end for s2_s3 pipe */
|
||||||
|
char to_print[] = "C : x\n";
|
||||||
|
char buf1;
|
||||||
|
while (read(pipe2[0], &buf1, 1) > 0)
|
||||||
|
{
|
||||||
|
cout << "in child ka child" << endl;
|
||||||
|
to_print[4] = buf;
|
||||||
|
}
|
||||||
|
close(pipe2[0]);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
close(pipe1[1]); /* Close unused write end for s1_s2 pipe */
|
||||||
|
close(pipe2[0]); /* Close unused read end for s2_s3 pipe */
|
||||||
|
char to_print[] = "C : x\n";
|
||||||
|
while (read(pipe1[0], &buf, 1) > 0)
|
||||||
|
{
|
||||||
|
printf("child reading from pipe\n");
|
||||||
|
to_print[4] = buf;
|
||||||
|
write(STDOUT_FILENO, &to_print, strlen(to_print));
|
||||||
|
}
|
||||||
|
printf("child writing to pipe\n");
|
||||||
|
write(STDOUT_FILENO, "\n", 1);
|
||||||
|
write(pipe2[1], argv[1], strlen(argv[1]));
|
||||||
|
close(pipe1[0]);
|
||||||
|
close(pipe2[1]);
|
||||||
|
wait(NULL);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else { /* Parent writes argv[1] to pipe */
|
||||||
|
close(pipe1[0]); /* Close unused read end of pipe 1 */
|
||||||
|
close(pipe2[0]); /* Close unused read end of pipe 2*/
|
||||||
|
close(pipe2[1]); /* Close unused write end of pipe 2*/
|
||||||
|
printf("parent writing to pipe\n");
|
||||||
|
write(pipe1[1], argv[1], strlen(argv[1]));
|
||||||
|
close(pipe1[1]); /* Reader will see EOF */
|
||||||
|
wait(NULL); /* Wait for child */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cout << "success" << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
../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
|
||||||
|
../images/1.ppm 0.00378666
|
||||||
|
../images/2.ppm 0.0142673
|
||||||
|
../images/3.ppm 0.0612914
|
|
@ -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()
|
|
@ -0,0 +1,244 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include "libppm.h"
|
||||||
|
#include <cstdint>
|
||||||
|
#include <chrono>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
struct image_t* S1_smoothen(struct image_t *input_image)
|
||||||
|
{
|
||||||
|
//cout << input_image->width << input_image->height << " " << input_image->image_pixels << endl;
|
||||||
|
int width = input_image->width;
|
||||||
|
int height = input_image->height;
|
||||||
|
|
||||||
|
// memory allocation
|
||||||
|
struct image_t* smoother = new struct image_t;
|
||||||
|
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 = 1; i < height-1; i++)
|
||||||
|
{
|
||||||
|
for(int j = 1; j < width-1; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
//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 == 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);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return smoother;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct image_t* S2_find_details(struct image_t *input_image, struct image_t *smoothened_image)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
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* Rotate_image(struct image_t *input_image)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
int width = input_image->width;
|
||||||
|
int height = input_image->height;
|
||||||
|
|
||||||
|
struct image_t* rotated = new struct image_t;
|
||||||
|
rotated->height = width;
|
||||||
|
rotated->width = height;
|
||||||
|
rotated->image_pixels = new uint8_t**[height];
|
||||||
|
|
||||||
|
for(int i = 0; i < rotated->height; i++)
|
||||||
|
{
|
||||||
|
rotated->image_pixels[i] = new uint8_t*[rotated->width];
|
||||||
|
for(int j = 0; j < rotated->width; j++)
|
||||||
|
rotated->image_pixels[i][j] = new uint8_t[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 1; i < rotated->height-1; i++)
|
||||||
|
{
|
||||||
|
for(int j = 1; j < rotated->width-1; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
rotated->image_pixels[i][j][k] = input_image->image_pixels[j][i][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rotated;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct image_t* S3_sharpen(struct image_t *input_image, struct image_t *details_image)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
if(argc != 3)
|
||||||
|
{
|
||||||
|
cout << "usage: ./a.out <path-to-original-image> <path-to-transformed-image>\n\n";
|
||||||
|
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();
|
||||||
|
|
||||||
|
struct image_t *rotated_image = Rotate_image(input_image);
|
||||||
|
|
||||||
|
auto startwrite = chrono::high_resolution_clock::now();
|
||||||
|
write_ppm_file(argv[2], rotated_image);
|
||||||
|
auto endwrite = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
|
chrono::duration<double> readduration = endread - startread;
|
||||||
|
chrono::duration<double> smoothduration = endsmooth - startsmooth;
|
||||||
|
chrono::duration<double> detailduration = enddetail - startdetail;
|
||||||
|
chrono::duration<double> sharpduration = endsharp - startsharp;
|
||||||
|
chrono::duration<double> 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;
|
||||||
|
}
|
|
@ -0,0 +1,277 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include "important.h"
|
||||||
|
#include <cstdint>
|
||||||
|
#include <chrono>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
struct image_t* S1_smoothen(struct image_t *input_image)
|
||||||
|
{
|
||||||
|
//cout << input_image->width << input_image->height << " " << input_image->image_pixels << endl;
|
||||||
|
int width = input_image->width;
|
||||||
|
int height = input_image->height;
|
||||||
|
|
||||||
|
// memory allocation
|
||||||
|
struct image_t* smoother = new struct image_t;
|
||||||
|
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 = 1; i < height-1; i++)
|
||||||
|
{
|
||||||
|
for(int j = 1; j < width-1; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
//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 == 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);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return smoother;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct image_t* S2_find_details(struct image_t *input_image, struct image_t *smoothened_image)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
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
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t skip_blanks_comments_while_reading(ifstream *read_stream) //returns the byte at the first position after the skipping of the blank space
|
||||||
|
{
|
||||||
|
uint8_t val;
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
val = read_stream->get();
|
||||||
|
if(val == '#')
|
||||||
|
{
|
||||||
|
while(val != '\n')
|
||||||
|
{
|
||||||
|
val = read_stream->get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(val == '\n' || val == ' ' || val == '\t')
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(val != '#')
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct image_t* read_ppm_file(char* path_to_input_file)
|
||||||
|
{
|
||||||
|
//cout << "input image file = " << path_to_input_file << "\n";
|
||||||
|
|
||||||
|
ifstream read_stream(path_to_input_file, ios::binary | ios::in);
|
||||||
|
|
||||||
|
if(read_stream.is_open())
|
||||||
|
{
|
||||||
|
struct image_t* image = new struct image_t;
|
||||||
|
|
||||||
|
uint8_t val = skip_blanks_comments_while_reading(&read_stream); // 'P'
|
||||||
|
val = read_stream.get(); //'6'
|
||||||
|
|
||||||
|
// width
|
||||||
|
val = skip_blanks_comments_while_reading(&read_stream);
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
if(val == ' ' || val == '\t' || val == '\n')
|
||||||
|
break;
|
||||||
|
image->width = image->width * 10 + (val - '0');
|
||||||
|
val = read_stream.get();
|
||||||
|
}
|
||||||
|
//cout << "width = " << image->width << "\n";
|
||||||
|
|
||||||
|
// height
|
||||||
|
val = skip_blanks_comments_while_reading(&read_stream);
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
if(val == ' ' || val == '\t' || val == '\n')
|
||||||
|
break;
|
||||||
|
image->height = image->height * 10 + (val - '0');
|
||||||
|
val = read_stream.get();
|
||||||
|
}
|
||||||
|
//cout << "height = " << image->height << "\n";
|
||||||
|
|
||||||
|
image->image_pixels = new uint8_t**[image->height];
|
||||||
|
for(int i = 0; i < image->height; i++)
|
||||||
|
{
|
||||||
|
image->image_pixels[i] = new uint8_t*[image->width];
|
||||||
|
for(int j = 0; j < image->width; j++)
|
||||||
|
image->image_pixels[i][j] = new uint8_t[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
// maxval
|
||||||
|
val = skip_blanks_comments_while_reading(&read_stream);
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
if(val == ' ' || val == '\t' || val == '\n')
|
||||||
|
break;
|
||||||
|
val = read_stream.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// get pixel values
|
||||||
|
val = skip_blanks_comments_while_reading(&read_stream);
|
||||||
|
for(int i = 0; i < image->height; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < image->width; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
image->image_pixels[i][j][k] = val;
|
||||||
|
val = read_stream.get(); //assuming maxval of <=255
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//read_stream.seekg(-1, ios_base::cur);
|
||||||
|
//read_stream.read(((char*)image->image_pixels), image->height * image->width * 3); //assuming maxval of <=255
|
||||||
|
|
||||||
|
read_stream.close();
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cerr << "failed to open file " << path_to_input_file << "\n\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_ppm_file(char * path_to_output_file, struct image_t* image)
|
||||||
|
{
|
||||||
|
//cout << "output image file = " << path_to_output_file << "\n";
|
||||||
|
|
||||||
|
ofstream write_stream(path_to_output_file, ios::binary | ios::out);
|
||||||
|
|
||||||
|
if(write_stream.is_open())
|
||||||
|
{
|
||||||
|
write_stream.write("P6\n", 3);
|
||||||
|
std::string width_string = std::to_string(image->width);
|
||||||
|
//cout << "width = " << width_string << "\n";
|
||||||
|
write_stream.write(width_string.c_str(), width_string.length());
|
||||||
|
write_stream.write(" ", 1);
|
||||||
|
std::string height_string = std::to_string(image->height);
|
||||||
|
//cout << "height = " << height_string << "\n";
|
||||||
|
write_stream.write(height_string.c_str(), height_string.length());
|
||||||
|
write_stream.write("\n255\n", 5);
|
||||||
|
for(int i = 0; i < image->height; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < image->width; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
write_stream.put(image->image_pixels[i][j][k]); //assuming maxval of <=255
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//write_stream.write(((char*)image->image_pixels), image->height * image->width * 3);
|
||||||
|
write_stream.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cerr << "failed to open file " << path_to_output_file << "\n\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef IMPORTANT_H
|
||||||
|
#define IMPORTANT_H
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
struct image_t
|
||||||
|
{
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
uint8_t*** image_pixels;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct image_t* S1_smoothen(struct image_t *input_image);
|
||||||
|
struct image_t* S2_find_details(struct image_t *input_image, struct image_t *smoothened_image);
|
||||||
|
struct image_t* S3_sharpen(struct image_t *input_image, struct image_t *details_image);
|
||||||
|
|
||||||
|
struct image_t* read_ppm_file(char* path_to_input_file);
|
||||||
|
void write_ppm_file(char* path_to_output_file, struct image_t* image);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,144 @@
|
||||||
|
#include "libppm.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
uint8_t skip_blanks_comments_while_reading(ifstream *read_stream) //returns the byte at the first position after the skipping of the blank space
|
||||||
|
{
|
||||||
|
uint8_t val;
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
val = read_stream->get();
|
||||||
|
if(val == '#')
|
||||||
|
{
|
||||||
|
while(val != '\n')
|
||||||
|
{
|
||||||
|
val = read_stream->get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(val == '\n' || val == ' ' || val == '\t')
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(val != '#')
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct image_t* read_ppm_file(char* path_to_input_file)
|
||||||
|
{
|
||||||
|
//cout << "input image file = " << path_to_input_file << "\n";
|
||||||
|
|
||||||
|
ifstream read_stream(path_to_input_file, ios::binary | ios::in);
|
||||||
|
|
||||||
|
if(read_stream.is_open())
|
||||||
|
{
|
||||||
|
struct image_t* image = new struct image_t;
|
||||||
|
|
||||||
|
uint8_t val = skip_blanks_comments_while_reading(&read_stream); // 'P'
|
||||||
|
val = read_stream.get(); //'6'
|
||||||
|
|
||||||
|
// width
|
||||||
|
val = skip_blanks_comments_while_reading(&read_stream);
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
if(val == ' ' || val == '\t' || val == '\n')
|
||||||
|
break;
|
||||||
|
image->width = image->width * 10 + (val - '0');
|
||||||
|
val = read_stream.get();
|
||||||
|
}
|
||||||
|
//cout << "width = " << image->width << "\n";
|
||||||
|
|
||||||
|
// height
|
||||||
|
val = skip_blanks_comments_while_reading(&read_stream);
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
if(val == ' ' || val == '\t' || val == '\n')
|
||||||
|
break;
|
||||||
|
image->height = image->height * 10 + (val - '0');
|
||||||
|
val = read_stream.get();
|
||||||
|
}
|
||||||
|
//cout << "height = " << image->height << "\n";
|
||||||
|
|
||||||
|
image->image_pixels = new uint8_t**[image->height];
|
||||||
|
for(int i = 0; i < image->height; i++)
|
||||||
|
{
|
||||||
|
image->image_pixels[i] = new uint8_t*[image->width];
|
||||||
|
for(int j = 0; j < image->width; j++)
|
||||||
|
image->image_pixels[i][j] = new uint8_t[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
// maxval
|
||||||
|
val = skip_blanks_comments_while_reading(&read_stream);
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
if(val == ' ' || val == '\t' || val == '\n')
|
||||||
|
break;
|
||||||
|
val = read_stream.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// get pixel values
|
||||||
|
val = skip_blanks_comments_while_reading(&read_stream);
|
||||||
|
for(int i = 0; i < image->height; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < image->width; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
image->image_pixels[i][j][k] = val;
|
||||||
|
val = read_stream.get(); //assuming maxval of <=255
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//read_stream.seekg(-1, ios_base::cur);
|
||||||
|
//read_stream.read(((char*)image->image_pixels), image->height * image->width * 3); //assuming maxval of <=255
|
||||||
|
|
||||||
|
read_stream.close();
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cerr << "failed to open file " << path_to_input_file << "\n\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_ppm_file(char * path_to_output_file, struct image_t* image)
|
||||||
|
{
|
||||||
|
//cout << "output image file = " << path_to_output_file << "\n";
|
||||||
|
|
||||||
|
ofstream write_stream(path_to_output_file, ios::binary | ios::out);
|
||||||
|
|
||||||
|
if(write_stream.is_open())
|
||||||
|
{
|
||||||
|
write_stream.write("P6\n", 3);
|
||||||
|
std::string width_string = std::to_string(image->width);
|
||||||
|
//cout << "width = " << width_string << "\n";
|
||||||
|
write_stream.write(width_string.c_str(), width_string.length());
|
||||||
|
write_stream.write(" ", 1);
|
||||||
|
std::string height_string = std::to_string(image->height);
|
||||||
|
//cout << "height = " << height_string << "\n";
|
||||||
|
write_stream.write(height_string.c_str(), height_string.length());
|
||||||
|
write_stream.write("\n255\n", 5);
|
||||||
|
for(int i = 0; i < image->height; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < image->width; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
write_stream.put(image->image_pixels[i][j][k]); //assuming maxval of <=255
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//write_stream.write(((char*)image->image_pixels), image->height * image->width * 3);
|
||||||
|
write_stream.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cerr << "failed to open file " << path_to_output_file << "\n\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef LIBPPM_H
|
||||||
|
#define LIBPPM_H
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
struct image_t
|
||||||
|
{
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
uint8_t*** image_pixels;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct image_t* read_ppm_file(char* path_to_input_file);
|
||||||
|
void write_ppm_file(char* path_to_output_file, struct image_t* image);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,18 @@
|
||||||
|
build-sharpen: ./a.out
|
||||||
|
|
||||||
|
./a.out: image_sharpener.cpp libppm.cpp
|
||||||
|
g++ -g image_sharpener.cpp libppm.cpp
|
||||||
|
|
||||||
|
run-sharpen: ./a.out
|
||||||
|
./a.out ../images/$(INPUT).ppm ../images/$(OUTPUT).ppm
|
||||||
|
|
||||||
|
./coms.out: coms.cpp important.cpp
|
||||||
|
g++ -g coms.cpp important.cpp -o coms.out
|
||||||
|
|
||||||
|
run-coms: ./coms.out
|
||||||
|
./coms.out $(F)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm a.out coms.out
|
||||||
|
|
||||||
|
.PHONY: run-coms
|
|
@ -0,0 +1,38 @@
|
||||||
|
../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
|
||||||
|
../images/1.ppm 0.0197896
|
||||||
|
../images/2.ppm 0.0329337
|
||||||
|
../images/3.ppm 0.199503
|
|
@ -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."
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
../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
|
||||||
|
../images/1.ppm 0.00357817
|
||||||
|
../images/2.ppm 0.0139955
|
||||||
|
../images/3.ppm 0.0578726
|
|
@ -0,0 +1,38 @@
|
||||||
|
../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
|
||||||
|
../images/1.ppm 0.00590421
|
||||||
|
../images/2.ppm 0.0222273
|
||||||
|
../images/3.ppm 0.0992293
|
|
@ -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()
|
|
@ -0,0 +1,38 @@
|
||||||
|
../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
|
||||||
|
../images/1.ppm 0.00731258
|
||||||
|
../images/2.ppm 0.02392
|
||||||
|
../images/3.ppm 0.152686
|
Loading…
Reference in New Issue