화상 처리 100개 노크 C언어로 도전해 보자 #2
Q.2. 그레이스케일화
이미지를 그레이스케일로 만들어라. 그레이 스케일은 이미지의 휘도 표현 방법의 일종이며, 다음 식으로 계산된다.
Y = 0.2126 R + 0.7152 G + 0.0722 B
입력
출력
답변
그레이스케일화할 부분의 코드입니다.
이번은 출력 부분에 정리해 버렸습니다.
ex2.cdouble image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
fprintf(outfp, "%d ", (int)image_gry[i][k]);
k ++;
}
fprintf(outfp, "\n");
}
해설
문제문에 기재되어 있던 식을 맞았습니다.
조금, 이것은 즐겁다고 생각했지만, ppm 형식의 이미지로부터 pgm 형식의 이미지로 변환하는 프로그램으로 했습니다(RGB 그대로 그레이 스케일화하는 방법을 생각하지 않았다).
첫 번째 질문과 마찬가지로 픽셀 값은 세 개로 한 쌍으로 처리됩니다.
우선, 새롭게 height×width 사이즈의 2차원 배열을 준비해, R, G, B 각각의 값에 계산식중의 계수를 곱해 그 합을 격납했습니다.
계산식 자체는 double형의 수치 계산이었으므로, 출력시에 int형에 캐스트 한다고 하는 흐름입니다.
완성된 프로그램(전문)
ex2.c#include <stdio.h>
#define N 256
int main(void) {
FILE *infp;
FILE *outfp;
char magic[64];
char str[256];
int width;
int height;
int max;
char readline[N] = {'\0'};
infp = fopen("../imori.ppm", "r");
//magic
fgets(magic, N, infp);
//width, height
int num[4];
for(int i = 0; i < 2; i ++){
fscanf(infp, "%d", &num[i]);
}
width = num[0];
height = num[1];
//max
fscanf(infp, "%d", &max);
//image
double image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%lf", &image[i][j]);
}
}
outfp = fopen("imori.pgm", "w");
fprintf(outfp, "P2\n");
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
fprintf(outfp, "%d ", (int)image_gry[i][k]);
k ++;
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/e15dc477a700207ff740
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
그레이스케일화할 부분의 코드입니다.
이번은 출력 부분에 정리해 버렸습니다.
ex2.c
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
fprintf(outfp, "%d ", (int)image_gry[i][k]);
k ++;
}
fprintf(outfp, "\n");
}
해설
문제문에 기재되어 있던 식을 맞았습니다.
조금, 이것은 즐겁다고 생각했지만, ppm 형식의 이미지로부터 pgm 형식의 이미지로 변환하는 프로그램으로 했습니다(RGB 그대로 그레이 스케일화하는 방법을 생각하지 않았다).
첫 번째 질문과 마찬가지로 픽셀 값은 세 개로 한 쌍으로 처리됩니다.
우선, 새롭게 height×width 사이즈의 2차원 배열을 준비해, R, G, B 각각의 값에 계산식중의 계수를 곱해 그 합을 격납했습니다.
계산식 자체는 double형의 수치 계산이었으므로, 출력시에 int형에 캐스트 한다고 하는 흐름입니다.
완성된 프로그램(전문)
ex2.c#include <stdio.h>
#define N 256
int main(void) {
FILE *infp;
FILE *outfp;
char magic[64];
char str[256];
int width;
int height;
int max;
char readline[N] = {'\0'};
infp = fopen("../imori.ppm", "r");
//magic
fgets(magic, N, infp);
//width, height
int num[4];
for(int i = 0; i < 2; i ++){
fscanf(infp, "%d", &num[i]);
}
width = num[0];
height = num[1];
//max
fscanf(infp, "%d", &max);
//image
double image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%lf", &image[i][j]);
}
}
outfp = fopen("imori.pgm", "w");
fprintf(outfp, "P2\n");
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
fprintf(outfp, "%d ", (int)image_gry[i][k]);
k ++;
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/e15dc477a700207ff740
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ex2.c
#include <stdio.h>
#define N 256
int main(void) {
FILE *infp;
FILE *outfp;
char magic[64];
char str[256];
int width;
int height;
int max;
char readline[N] = {'\0'};
infp = fopen("../imori.ppm", "r");
//magic
fgets(magic, N, infp);
//width, height
int num[4];
for(int i = 0; i < 2; i ++){
fscanf(infp, "%d", &num[i]);
}
width = num[0];
height = num[1];
//max
fscanf(infp, "%d", &max);
//image
double image[height][width*3];
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3; j ++){
fscanf(infp, "%lf", &image[i][j]);
}
}
outfp = fopen("imori.pgm", "w");
fprintf(outfp, "P2\n");
fprintf(outfp, "%d ", width);
fprintf(outfp, "%d\n", height);
fprintf(outfp, "%d\n", max);
double image_gry[height][width];
int k = 0;
for(int i = 0; i < height; i ++){
for(int j = 0; j < width*3-2; j = j+3){
image[i][j] = image[i][j] * 0.2126;
image[i][j+1] = image[i][j+1] * 0.7152;
image[i][j+2] = image[i][j+2] * 0.0722;
image_gry[i][k] = image[i][j] + image[i][j+1] + image[i][j+2];
fprintf(outfp, "%d ", (int)image_gry[i][k]);
k ++;
}
fprintf(outfp, "\n");
}
return 0;
}
링크
화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fuwasegu/items/e15dc477a700207ff740
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(화상 처리 100개 노크 C언어로 도전해 보자 #2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fuwasegu/items/e15dc477a700207ff740텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)