https://cs50.harvard.edu/x/2023/psets/4/filter/less/#specification
Filter - CS50x 2023
Harvard University's introduction to the intellectual enterprises of computer science and the art of programming.
cs50.harvard.edu
코드가 지나치게 길어져서
블러 부분을 다시 만들어야한다.
작동은 정상작동 함.
#include "helpers.h"
#include <string.h>
#include <math.h>
// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
float rgb_average = // 수정됨 BYTE에서 float
(image[i][j].rgbtBlue + image[i][j].rgbtGreen + image[i][j].rgbtRed) / 3.0;
image[i][j].rgbtBlue = (BYTE)round(rgb_average); // (BYTE)추가
image[i][j].rgbtGreen = (BYTE)round(rgb_average); // round추가
image[i][j].rgbtRed = (BYTE)round(rgb_average);
// change color to red
};
};
return;
}
// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
float new_red = image[i][j].rgbtRed * .393 + image[i][j].rgbtGreen * .769 + image[i][j].rgbtBlue * .189;
float new_green = image[i][j].rgbtRed * .349 + image[i][j].rgbtGreen * .686 + image[i][j].rgbtBlue * .168; // 숫자오타
float new_blue = image[i][j].rgbtRed * .272 + image[i][j].rgbtGreen * .534 + image[i][j].rgbtBlue * .131;
// BYTE -> float 변경
if (new_blue > 255)
{
image[i][j].rgbtBlue = 255;
}
else
{
image[i][j].rgbtBlue = (BYTE)round(new_blue);
};
if (new_green > 255)
{
image[i][j].rgbtGreen = 255;
}
else
{
image[i][j].rgbtGreen = (BYTE)round(new_green);
};
if (new_red > 255)
{
image[i][j].rgbtRed = 255;
}
else
{
image[i][j].rgbtRed = (BYTE)round(new_red);
};
};
};
return;
}
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE temp_image[height][width];
memset(temp_image, 0, sizeof(temp_image));
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
memcpy(&temp_image[i][width - j - 1], &image[i][j], sizeof(RGBTRIPLE));
// width-j 가 앞쪽에 있어야함. 순서대로 복사해야하므로.
// 반대로하면 함수가 순서대로 작동이 안됨. -1추가됨
};
};
memcpy(image, temp_image, sizeof(RGBTRIPLE[height][width]));
return;
}
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE temp_image[height][width];
memset(temp_image, 0, sizeof(temp_image));
memcpy(temp_image, image, sizeof(RGBTRIPLE[height][width]));
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (i == 0 && j == 0) // 좌상단모서리
{
float new_blue =
(temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i + 0][j + 1].rgbtBlue +
temp_image[i + 1][j + 0].rgbtBlue +
temp_image[i + 1][j + 1].rgbtBlue) /
4.0;
float new_green =
(temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i + 0][j + 1].rgbtGreen +
temp_image[i + 1][j + 0].rgbtGreen +
temp_image[i + 1][j + 1].rgbtGreen) /
4.0;
float new_red =
(temp_image[i + 0][j + 0].rgbtRed +
temp_image[i + 0][j + 1].rgbtRed +
temp_image[i + 1][j + 0].rgbtRed +
temp_image[i + 1][j + 1].rgbtRed) /
4.0;
image[i][j].rgbtBlue = (BYTE)round(new_blue);
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
}
else if (i == 0 && j == width - 1) // 우측상단모서리
{
float new_blue =
(temp_image[i + 0][j - 1].rgbtBlue +
temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i + 1][j - 1].rgbtBlue +
temp_image[i + 1][j + 0].rgbtBlue) /
4.0;
float new_green =
(temp_image[i + 0][j - 1].rgbtGreen +
temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i + 1][j - 1].rgbtGreen +
temp_image[i + 1][j + 0].rgbtGreen) /
4.0;
float new_red =
(temp_image[i + 0][j - 1].rgbtRed +
temp_image[i + 0][j + 0].rgbtRed +
temp_image[i + 1][j - 1].rgbtRed +
temp_image[i + 1][j + 0].rgbtRed) /
4.0;
image[i][j].rgbtBlue = (BYTE)round(new_blue);
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
}
else if (i == height - 1 && j == width - 1) // 우측하단모서리
{
float new_blue =
(temp_image[i + 0][j - 1].rgbtBlue +
temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i - 1][j - 1].rgbtBlue +
temp_image[i - 1][j + 0].rgbtBlue) /
4.0;
float new_green =
(temp_image[i + 0][j - 1].rgbtGreen +
temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i - 1][j - 1].rgbtGreen +
temp_image[i - 1][j + 0].rgbtGreen) /
4.0;
float new_red =
(temp_image[i + 0][j - 1].rgbtRed +
temp_image[i + 0][j + 0].rgbtRed +
temp_image[i - 1][j - 1].rgbtRed +
temp_image[i - 1][j + 0].rgbtRed) /
4.0;
image[i][j].rgbtBlue = (BYTE)round(new_blue);
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
}
else if (i == height - 1 && j == 0) // 좌측하단모서리
{
float new_blue =
(temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i + 0][j + 1].rgbtBlue +
temp_image[i - 1][j + 0].rgbtBlue +
temp_image[i - 1][j + 1].rgbtBlue) /
4.0;
float new_green =
(temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i + 0][j + 1].rgbtGreen +
temp_image[i - 1][j + 0].rgbtGreen +
temp_image[i - 1][j + 1].rgbtGreen) /
4.0;
float new_red =
(temp_image[i + 0][j + 0].rgbtRed +
temp_image[i + 0][j + 1].rgbtRed +
temp_image[i - 1][j + 0].rgbtRed +
temp_image[i - 1][j + 1].rgbtRed) /
4.0;
image[i][j].rgbtBlue = (BYTE)round(new_blue);
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
}
else if (i != 0 && i != height - 1 && j == width - 1) // 오른쪽변
{
float new_blue =
(temp_image[i + 1][j - 1].rgbtBlue +
temp_image[i + 0][j - 1].rgbtBlue +
temp_image[i - 1][j - 1].rgbtBlue +
temp_image[i + 1][j + 0].rgbtBlue +
temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i - 1][j + 0].rgbtBlue) /
6.0;
float new_green =
(temp_image[i + 1][j - 1].rgbtGreen +
temp_image[i + 0][j - 1].rgbtGreen +
temp_image[i - 1][j - 1].rgbtGreen +
temp_image[i + 1][j + 0].rgbtGreen +
temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i - 1][j + 0].rgbtGreen) /
6.0;
float new_red =
(temp_image[i + 1][j - 1].rgbtRed +
temp_image[i + 0][j - 1].rgbtRed +
temp_image[i - 1][j - 1].rgbtRed +
temp_image[i + 1][j + 0].rgbtRed +
temp_image[i + 0][j + 0].rgbtRed +
temp_image[i - 1][j + 0].rgbtRed) /
6.0;
image[i][j].rgbtBlue = (BYTE)round(new_blue);
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
}
else if (i != 0 && i != height - 1 && j == 0) // 왼쪽변
{
float new_blue =
(temp_image[i - 1][j + 0].rgbtBlue +
temp_image[i - 1][j + 1].rgbtBlue +
temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i + 0][j + 1].rgbtBlue +
temp_image[i + 1][j + 0].rgbtBlue +
temp_image[i + 1][j + 1].rgbtBlue) /
6.0;
float new_green =
(temp_image[i - 1][j + 0].rgbtGreen +
temp_image[i - 1][j + 1].rgbtGreen +
temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i + 0][j + 1].rgbtGreen +
temp_image[i + 1][j + 0].rgbtGreen +
temp_image[i + 1][j + 1].rgbtGreen) /
6.0;
float new_red =
(temp_image[i - 1][j + 0].rgbtRed +
temp_image[i - 1][j + 1].rgbtRed +
temp_image[i + 0][j + 0].rgbtRed +
temp_image[i + 0][j + 1].rgbtRed +
temp_image[i + 1][j + 0].rgbtRed +
temp_image[i + 1][j + 1].rgbtRed) /
6.0;
image[i][j].rgbtBlue = (BYTE)round(new_blue);
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
}
else if (i == 0 && j != 0 && j != width - 1) // 위쪽변
{
float new_blue =
(temp_image[i + 0][j - 1].rgbtBlue +
temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i + 0][j + 1].rgbtBlue +
temp_image[i + 1][j - 1].rgbtBlue +
temp_image[i + 1][j + 0].rgbtBlue +
temp_image[i + 1][j + 1].rgbtBlue) /
6.0;
float new_green =
(temp_image[i + 0][j - 1].rgbtGreen +
temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i + 0][j + 1].rgbtGreen +
temp_image[i + 1][j - 1].rgbtGreen +
temp_image[i + 1][j + 0].rgbtGreen +
temp_image[i + 1][j + 1].rgbtGreen) /
6.0;
float new_red =
(temp_image[i + 0][j - 1].rgbtRed +
temp_image[i + 0][j + 0].rgbtRed +
temp_image[i + 0][j + 1].rgbtRed +
temp_image[i + 1][j - 1].rgbtRed +
temp_image[i + 1][j + 0].rgbtRed +
temp_image[i + 1][j + 1].rgbtRed) /
6.0;
image[i][j].rgbtBlue = (BYTE)round(new_blue);
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
}
else if (i == height - 1 && j != 0 && j != width - 1) // 아래쪽변
{
float new_blue =
(temp_image[i - 1][j - 1].rgbtBlue +
temp_image[i - 1][j + 0].rgbtBlue +
temp_image[i - 1][j + 1].rgbtBlue +
temp_image[i + 0][j - 1].rgbtBlue +
temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i + 0][j + 1].rgbtBlue) /
6.0;
float new_green =
(temp_image[i - 1][j - 1].rgbtGreen +
temp_image[i - 1][j + 0].rgbtGreen +
temp_image[i - 1][j + 1].rgbtGreen +
temp_image[i + 0][j - 1].rgbtGreen +
temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i + 0][j + 1].rgbtGreen) /
6.0;
float new_red =
(temp_image[i - 1][j - 1].rgbtRed +
temp_image[i - 1][j + 0].rgbtRed +
temp_image[i - 1][j + 1].rgbtRed +
temp_image[i + 0][j - 1].rgbtRed +
temp_image[i + 0][j + 0].rgbtRed +
temp_image[i + 0][j + 1].rgbtRed) /
6.0;
image[i][j].rgbtBlue = (BYTE)round(new_blue);
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
}
else
{
float new_blue =
(temp_image[i - 1][j - 1].rgbtBlue +
temp_image[i - 1][j + 0].rgbtBlue +
temp_image[i - 1][j + 1].rgbtBlue +
temp_image[i + 0][j - 1].rgbtBlue +
temp_image[i + 0][j + 0].rgbtBlue +
temp_image[i + 0][j + 1].rgbtBlue +
temp_image[i + 1][j - 1].rgbtBlue +
temp_image[i + 1][j + 0].rgbtBlue +
temp_image[i + 1][j + 1].rgbtBlue) /
9.0;
float new_green =
(temp_image[i - 1][j - 1].rgbtGreen +
temp_image[i - 1][j + 0].rgbtGreen +
temp_image[i - 1][j + 1].rgbtGreen +
temp_image[i + 0][j - 1].rgbtGreen +
temp_image[i + 0][j + 0].rgbtGreen +
temp_image[i + 0][j + 1].rgbtGreen +
temp_image[i + 1][j - 1].rgbtGreen +
temp_image[i + 1][j + 0].rgbtGreen +
temp_image[i + 1][j + 1].rgbtGreen) /
9.0;
float new_red = // float 변경
(
temp_image[i - 1][j - 1].rgbtRed +
temp_image[i - 1][j + 0].rgbtRed +
temp_image[i - 1][j + 1].rgbtRed +
temp_image[i + 0][j - 1].rgbtRed +
temp_image[i + 0][j + 0].rgbtRed +
temp_image[i + 0][j + 1].rgbtRed +
temp_image[i + 1][j - 1].rgbtRed +
temp_image[i + 1][j + 0].rgbtRed +
temp_image[i + 1][j + 1].rgbtRed) /
9.0; // .0추가
image[i][j].rgbtBlue = (BYTE)round(new_blue); // round, byte강제화 추가
image[i][j].rgbtGreen = (BYTE)round(new_green);
image[i][j].rgbtRed = (BYTE)round(new_red);
};
};
};
return;
}