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

16829 단어 C이미지 처리

Q.3. 이진화



이미지를 이진화하라. 2진화란, 화상을 흑백의 2치로 표현하는 방법이다. 여기서, 그레이 스케일에서 임계 값을 128로 설정하고 다음 방정식으로 이진화한다.
y = { 0 (if y < 128)
255 (else)



입력
출력






답변



이진화할 부분의 코드입니다.
이번에도 출력 부분과 정리했습니다.

ex3.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];
        if((int)image_gry[i][k] < 128){
            fprintf(outfp, "0 ");
        }else{
            fprintf(outfp, "255 ");
        }
        k ++;
    }
    fprintf(outfp, "\n");
}

해설



두 번째 질문에 조금 손을 넣었을 뿐입니다.
출력할 때에 0이나 255로 분류할 뿐이므로, fprintf 를 경우 나누어 안에 넣어 주어, image_gray 의 값이 128 미만인지 아닌지로 분기시킵니다.

완성된 프로그램(전문)



ex3.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];
            if((int)image_gry[i][k] < 128){
                fprintf(outfp, "0 ");
            }else{
                fprintf(outfp, "255 ");
            }
            k ++;
        }
        fprintf(outfp, "\n");
    }

    return 0;
}

링크



화상처리 100개 노크를 만들었다
화상 처리 100개 노크 C언어로 도전해 보는 인트로덕션

좋은 웹페이지 즐겨찾기