편집 기록

편집 기록
  • 프로필 엽토군님의 편집
    날짜2019.01.29

    c언어) 이미지의 명암을 따로 강조하고 싶습니다.


    #include <stdio.h>
    #include <stdlib.h>
    
    #define WIDTH 512
    #define HEIGH 512  // WIDTH, HEIGH 각각에 512이란 값으로 정의
    typedef unsigned char BYTE;  // unsigned char를 BYTE로 표현 
    
    int main()
    {
        FILE*fp_in = 0, *fp_out = 0, *fp_out2 = 0; // fp_in과 fp_out etc..에 쓰레기값 0을 대입후 포인터 생성.
        BYTE **img_in = 0, **img_out = 0, **img_out2 = 0; //img_in과 img_out에 쓰레기값 0을 대입, 더블 포인터 생성.
        int i = 0, j = 0; // 반복문을 위한 변수.
        float temp = 0, temp2 = 0; // 임시로 저장할 값의 변수 선언.
        fp_in = fopen("Lena(512X512).raw", "rb"); // 레나 데이터가 binary 형태로 읽어오고 fp_in이 가르키는 주소에 저장.
        if (fp_in == NULL) {
            printf("File open failed\n"); // fp_in에 아무런 데이터가 입력되지 않았을 때 다음과같은 문구가 뜸.
        }
    
        img_in = (BYTE **)malloc(sizeof(BYTE*)*HEIGH); // img_in에 HEIGH 만큼 1byte의 크기로 메모리 할당.
        for (i = 0; i < HEIGH; i++) {
            img_in[i] = (BYTE *)malloc(sizeof(BYTE)*WIDTH); // img_in에 WIDTH 만큼 1byte의 크기로 메모리 할당.
        }
        for (i = 0; i < HEIGH; i++) {
            fread(img_in[i], sizeof(BYTE), WIDTH, fp_in);  // fp_in에 있는 데이터를 1byte 크기로 WIDTH의 횟수만큼 img_in[i]에 읽어옴.
        }
    
        img_out = (BYTE **)malloc(sizeof(BYTE*)*HEIGH);  // img_in과 마찬가지로 메모리 할당.
        for (i = 0; i < HEIGH; i++) {
            img_out[i] = (BYTE *)malloc(sizeof(BYTE)*WIDTH);
        }
    
        img_out2 = (BYTE **)malloc(sizeof(BYTE*)*HEIGH);  // img_out과 마찬가지로 메모리 할당.
        for (i = 0; i < HEIGH; i++) {
            img_out2[i] = (BYTE *)malloc(sizeof(BYTE)*WIDTH);
        }
    
    
        for (i = 0; i < HEIGH; i++) {
            for (j = 0; j < (WIDTH - 1); j++) {
    
                temp = ? ? ?; // vertical 즉 열끼리의 연산을 하여 이전 열의 값에 저장.
                temp = temp + 90; // 임시저장값 temp에 90을 더한 후 클리핑
                if (temp < 0) {
                    temp = 0;  // 0이하면 0을 대입
                }
                else if (temp > 255) {
                    temp = 255; // 255이상이면 255를 대입
                }
                img_out[i][j] = (BYTE)temp; // 밝은 부분은 매우 밝게 어두운 부분은 어둡게 하여 선명한 차이를 보이게끔 함.
            }
        }
    
        for (j = 0; j < HEIGH; j++) {
            for (i = 0; i < (WIDTH - 1); i++) {
    
                temp2 = ? ? ?; // Horizental 즉 행끼리의 연산을 하여 이전 행의 값에 저장.
                temp2 = temp2 + 90; // 임시저장값 temp2에 90을 더한 후 클리핑
                if (temp2 < 0) {
                    temp2 = 0; // 0이하면 0을 대입
                }
                else if (temp2 > 255) {
                    temp2 = 255; // 255이상이면 255를 대입
                }
                img_out2[i][j] = (BYTE)temp2; // 밝은 부분은 매우 밝게 어두운 부분은 어둡게 하여 선명한 차이를 보이게끔 함.
            }
        }
    
    
    
        fp_out = fopen("[Output_horizontal]Lena(512X512).raw", "wb"); // 레나 데이터의 출력을 binary형태로 쓰고 그 파일을 연다. 그리고 fp_out의 주소에 저장.
        if (fp_out == NULL) {
            printf("File open failed\n"); // 데이터가 들어오지 않았을 때 다음과 같은 문구가 나옴.
        }
        for (i = 0; i < HEIGH; i++) {
            fwrite(img_out[i], sizeof(BYTE), WIDTH, fp_out); // img_out의 배열에 1열의 각 첫번째 요소에 저장된 내용을 1바이트의 크기로 512번 ( 즉 512 바이트 ) < fp_out이 가리키는곳 -> [Output_horizontal]Lena(512X512).raw >에 데이터를 쓴다.
        }
    
        fp_out2 = fopen("[Output_vertical]Lena(512X512).raw", "wb"); // 레나의 출력 파일을 생성하고 이를 가리키는 주소는 fp_out2이다.
        if (fp_out2 == NULL) {
            printf("File open failed\n"); // 데이터가 들어오지 않았을 때 다음과 같은 문구가 나옴.
        }
        for (i = 0; i < HEIGH; i++) {
            fwrite(img_out2[i], sizeof(BYTE), WIDTH, fp_out2); //img_out_second의 배열에 1열의 각 첫번째 요소에 저장된 내용을 1바이트의 크기로 512번 ( 즉 512 바이트 ) < fp_out_seconod이 가리키는곳 -> [Output_vertical]Lena(512X512).raw >에 데이터를 쓴다.
        }
    
        for (i = 0; i < HEIGH; i++) {
            free(? ? ?);
            free(? ? ? );
            free(? ? ?);
        }
        free(img_in);
        free(img_out);
        free(img_out2);
        // 동적할당을 해제.
        fclose(fp_in);
        fclose(fp_out);
        fclose(fp_out2);
        // 작업을 마친후에 파일을 닫는 함수.
    
        return 0;
    }
    

    이런 코드인데요

    총 5개의 ?를 넣어야 된다고 하는데요 어떻게 해야할까요..

    각 행과 렬의 소스를 뽑아 명암을 바꾸어 가로와 세로의 경계선을 강조시킨다는 것은 알았습니다.

    이미지

    이런식으로 나와야 한다고 하는데 도와주세요 ㅠㅠㅠ

  • 프로필 알 수 없는 사용자님의 편집
    날짜2019.01.29

    c언어) 이미지의 명암을 따로 강조하고 싶습니다.


    include

    include

    define WIDTH 512

    define HEIGH 512 // WIDTH, HEIGH 각각에 512이란 값으로 정의

    typedef unsigned char BYTE; // unsigned char를 BYTE로 표현

    int main() { FILE*fp_in = 0, *fp_out = 0, *fp_out2 = 0; // fp_in과 fp_out etc..에 쓰레기값 0을 대입후 포인터 생성. BYTE **img_in = 0, **img_out = 0, **img_out2 = 0; //img_in과 img_out에 쓰레기값 0을 대입, 더블 포인터 생성. int i = 0, j = 0; // 반복문을 위한 변수. float temp = 0, temp2 = 0; // 임시로 저장할 값의 변수 선언. fp_in = fopen("Lena(512X512).raw", "rb"); // 레나 데이터가 binary 형태로 읽어오고 fp_in이 가르키는 주소에 저장. if (fp_in == NULL) { printf("File open failed\n"); // fp_in에 아무런 데이터가 입력되지 않았을 때 다음과같은 문구가 뜸. }

    img_in = (BYTE **)malloc(sizeof(BYTE*)*HEIGH); // img_in에 HEIGH 만큼 1byte의 크기로 메모리 할당.
    for (i = 0; i < HEIGH; i++) {
        img_in[i] = (BYTE *)malloc(sizeof(BYTE)*WIDTH); // img_in에 WIDTH 만큼 1byte의 크기로 메모리 할당.
    }
    for (i = 0; i < HEIGH; i++) {
        fread(img_in[i], sizeof(BYTE), WIDTH, fp_in);  // fp_in에 있는 데이터를 1byte 크기로 WIDTH의 횟수만큼 img_in[i]에 읽어옴.
    }
    
    img_out = (BYTE **)malloc(sizeof(BYTE*)*HEIGH);  // img_in과 마찬가지로 메모리 할당.
    for (i = 0; i < HEIGH; i++) {
        img_out[i] = (BYTE *)malloc(sizeof(BYTE)*WIDTH);
    }
    
    img_out2 = (BYTE **)malloc(sizeof(BYTE*)*HEIGH);  // img_out과 마찬가지로 메모리 할당.
    for (i = 0; i < HEIGH; i++) {
        img_out2[i] = (BYTE *)malloc(sizeof(BYTE)*WIDTH);
    }
    
    
    for (i = 0; i < HEIGH; i++) {
        for (j = 0; j < (WIDTH - 1); j++) {
    
            temp = ? ? ?; // vertical 즉 열끼리의 연산을 하여 이전 열의 값에 저장.
            temp = temp + 90; // 임시저장값 temp에 90을 더한 후 클리핑
            if (temp < 0) {
                temp = 0;  // 0이하면 0을 대입
            }
            else if (temp > 255) {
                temp = 255; // 255이상이면 255를 대입
            }
            img_out[i][j] = (BYTE)temp; // 밝은 부분은 매우 밝게 어두운 부분은 어둡게 하여 선명한 차이를 보이게끔 함.
        }
    }
    
    for (j = 0; j < HEIGH; j++) {
        for (i = 0; i < (WIDTH - 1); i++) {
    
            temp2 = ? ? ?; // Horizental 즉 행끼리의 연산을 하여 이전 행의 값에 저장.
            temp2 = temp2 + 90; // 임시저장값 temp2에 90을 더한 후 클리핑
            if (temp2 < 0) {
                temp2 = 0; // 0이하면 0을 대입
            }
            else if (temp2 > 255) {
                temp2 = 255; // 255이상이면 255를 대입
            }
            img_out2[i][j] = (BYTE)temp2; // 밝은 부분은 매우 밝게 어두운 부분은 어둡게 하여 선명한 차이를 보이게끔 함.
        }
    }
    
    
    
    fp_out = fopen("[Output_horizontal]Lena(512X512).raw", "wb"); // 레나 데이터의 출력을 binary형태로 쓰고 그 파일을 연다. 그리고 fp_out의 주소에 저장.
    if (fp_out == NULL) {
        printf("File open failed\n"); // 데이터가 들어오지 않았을 때 다음과 같은 문구가 나옴.
    }
    for (i = 0; i < HEIGH; i++) {
        fwrite(img_out[i], sizeof(BYTE), WIDTH, fp_out); // img_out의 배열에 1열의 각 첫번째 요소에 저장된 내용을 1바이트의 크기로 512번 ( 즉 512 바이트 ) < fp_out이 가리키는곳 -> [Output_horizontal]Lena(512X512).raw >에 데이터를 쓴다.
    }
    
    fp_out2 = fopen("[Output_vertical]Lena(512X512).raw", "wb"); // 레나의 출력 파일을 생성하고 이를 가리키는 주소는 fp_out2이다.
    if (fp_out2 == NULL) {
        printf("File open failed\n"); // 데이터가 들어오지 않았을 때 다음과 같은 문구가 나옴.
    }
    for (i = 0; i < HEIGH; i++) {
        fwrite(img_out2[i], sizeof(BYTE), WIDTH, fp_out2); //img_out_second의 배열에 1열의 각 첫번째 요소에 저장된 내용을 1바이트의 크기로 512번 ( 즉 512 바이트 ) < fp_out_seconod이 가리키는곳 -> [Output_vertical]Lena(512X512).raw >에 데이터를 쓴다.
    }
    
    for (i = 0; i < HEIGH; i++) {
        free(? ? ?);
        free(? ? ? );
        free(? ? ?);
    }
    free(img_in);
    free(img_out);
    free(img_out2);
    // 동적할당을 해제.
    fclose(fp_in);
    fclose(fp_out);
    fclose(fp_out2);
    // 작업을 마친후에 파일을 닫는 함수.
    
    return 0;
    

    }

    이런 코드인데요

    총 5개의 ?를 넣어야 된다고 하는데요 어떻게 해야할까요..

    각 행과 렬의 소스를 뽑아 명암을 바꾸어 가로와 세로의 경계선을 강조시킨다는 것은 알았습니다.

    이미지

    이런식으로 나와야 한다고 하는데 도와주세요 ㅠㅠㅠ