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

12668 단어 C이미지 처리

Q.1. 채널 교환



이미지를 읽고 RGB를 BGR 순서로 바꿉니다.



입력
출력






답변



픽셀의 값을 바꾸는 부분의 코드입니다.

ex1.c
int array = 0;
for(int i = 0; i < height; i++){
    for(int j = 0; j < width*3-2; j = j+3){
        array = image[i][j+2];
        image[i][j+2] = image[i][j];
        image[i][j] = array;
    }
}

해설



RGB의 3개의 값은 각각 2차원 배열에 격납되어 있어, 3개가 가로 정렬되어 있습니다.
이번에는 RGB를 BGR의 순서로 바꾸기 때문에 3가지 중 머리와 엉덩이의 값을 바꾸면 좋다.
따라서, 우선은 3번째의 값(B의 값)을 새롭게 준비한 변수 array에 피난시켜 두고, 1번째의 값(R의 값)으로 덧쓰기합니다. 이 조작으로 RGB가 RGR입니다.
다음으로 대피시킨 B의 값을 첫 번째 값으로 덮어씁니다. 이 조작으로 RGR이 BGR이 되었습니다.

2중 루프를 돌리고 있습니다만, 교환은 3개 1조로 실시하기 때문에, 내부의 for문의 변화식은 2개 날아가 되고 있습니다.

완성된 프로그램(전문)



ex1.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
    int image[height][width*3];
    for(int i = 0; i < height; i ++){
        for(int j = 0; j < width*3; j ++){
            fscanf(infp, "%d", &image[i][j]);
        }
    }

    outfp = fopen("imori.ppm", "w");

    fprintf(outfp, "%s", magic);
    fprintf(outfp, "%d ", width);
    fprintf(outfp, "%d\n", height);
    fprintf(outfp, "%d\n", max);

    int array = 0;
    for(int i = 0; i < height; i++){
        for(int j = 0; j < width*3-2; j = j+3){
            array = image[i][j+2];
            image[i][j+2] = image[i][j];
            image[i][j] = array;
        }
    }

    for(int i = 0; i < height; i ++){
        for(int j = 0; j < width*3; j ++){
            fprintf(outfp, "%d ", image[i][j]);
        }
        fprintf(outfp, "\n");
    }
    return 0;
}

링크



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

좋은 웹페이지 즐겨찾기