화상 처리 100개 노크 C언어로 도전해 보자 #2

16130 단어 C이미지 처리

Q.2. 그레이스케일화



이미지를 그레이스케일로 만들어라. 그레이 스케일은 이미지의 휘도 표현 방법의 일종이며, 다음 식으로 계산된다.
Y = 0.2126 R + 0.7152 G + 0.0722 B



입력
출력






답변



그레이스케일화할 부분의 코드입니다.
이번은 출력 부분에 정리해 버렸습니다.

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언어로 도전해 보는 인트로덕션

좋은 웹페이지 즐겨찾기