-
[컴퓨터과학] 이미지 처리자료실 2021. 12. 30. 01:05반응형
이미지 처리
이미지 처리란 이미지를 분석하고 원하는 대로 가공하는 법을 다루는 분야로 컴퓨터 비전이나 컴퓨터 그래픽스의 기초적인 단계이다.
- BMP 이미지 파일
- (이 글에서는 비트맵(.bmp)형식의 이미지 파일을 기준으로 설명)
1. 비압축 형식
BMP파일은 이미지의 정보를 압축하지 않고, 즉 아무런 변경 없이 그대로 저장한다.
2. 컬러 모델
BMP파일은 RGB 색상 모델을 사용한다. R은 0~255의 빨간색을, G는 0~255의 초록색을, B는 0~255의 파란색(약 1600만 가지의 색을 표현)
3. 구조
- 헤더: BMP 형식에 대한 정보(이미지 파일의 용량 등)가 저장되는 파일 헤더와 이미지 자체의 정보(이미지 크기 등)가 저장되는 인포 헤더로 구성된다.
-바디: RGB 데이터가 저장되는 공간, 실제로는 B, G, R 순서대로 저장된다.- 파일 입출력과 동적 배열
1. bmp 이미지 파일은 바이너리 파일이다.
더보기FILE *f; f = fopen(filename, "rb");
2. bmp 파일의 이미지를 읽어온다.
단, bmp 파일의 헤더는 같지만 바디의 크기는 파일마다 다를 수 있다. 그러므로 바디는 동적 배열을 이용하여 읽어온다.더보기BITMAPFILEHEADER hf; // 비트맵 파일헤더 선언 BITMAPINFOHEADER hInfo; // 비트맵 인포헤더 선언 fread(&hf, sizeof(BITMAPFILEHEADER), 1, f); // 파일헤더의 정보 읽기 fread(&hInfo, sizeof(BITMAPINFOHEADER), 1, f); // 인포헤더의 정보 읽기 ImgSize = hInfo.biHeight*hInfo.biWidth; // 이미지의 총 픽셀 개수 구하기 B = (unsigned char *)malloc(ImgSize); //배열의 크기가 정해져 있지 않은 동적 배열 선언 G = (unsigned char *)malloc(ImgSize); //각 색상의 데이터를 저장할 수 있게 R = (unsigned char *)malloc(ImgSize); // 3개의 배열을 선언한다. for (int i = 0; i < ImgSize; i++){ B[i] = fgetc(f); //BGR 순서대로 정보를 읽어서 G[i] = fgetc(f); //각 배열에 저장한다. R[i] = fgetc(f); } fclose(f);
3. 파일 쓰기
이미지 처리를 수행한 뒤 작업 결과를 내보내야 한다. 방법은 파일 읽기와 거의 같다.더보기FILE *f = NULL; f = fopen(filename, "wb"); fwrite(&hf, sizeof(BITMAPFILEHEADER), 1, f); fwrite(&hInfo, sizeof(BITMAPINFOHEADER), 1, f); for (int i = 0; i < ImgSize; i++){ fputc(B[i],f); fputc(G[i],f); fputc(R[i],f); } fclose(f);
4. 동적 배열 메모리
동적 배열을 다 사용하면 여태까지 할당된 메모리를 해제해줘야 한다.더보기free(B); free(G); free(R);
- 색상처리(컬러필터)
색상 처리의 기본은 컬러 필터를 이용하여 특정 색상만 남기는 것이다. 위 예시에서는 각각 구역을 나누어 빨강 필터, 초록 필터, 파랑 필터를 씌운 것이다.(우측 하단은 원본) 필터 구현 방법은 각 픽셀의 RGB 값 중 남기고자 하는 색상을 제외하고 0으로 만든다.
- 밝기 필터(대조)
밝기는 기본적으로 각 픽셀의 RGB 값에 똑같은 숫자를 더해주면 된다. 양수를 더하면 밝기가 올라가고 음수를 더하면 밝기가 줄어든다. 그런데 밝기를 덧셈으로 일괄적으로 처리하면 영상이 뭉개질 수 있다. 이럴 때는 곱셈으로 대조 효과를 처리한다. 1보다 큰 값을 곱하면 밝기가 밝아지면서 선명해지고 1보다 작은 값을 곱하면 밝기가 어두워지면서 흐릿해진다. 아래의 세 번째 사진을 보면 원본보다 밝으면서도 단순 덧셈의 두 번째 사진보다 색채가 진한 모습이다.
- 흑백
흑백 처리는 색상 요소를 제외하고 오직 명암으로만 이미지를 표현하는 기법이다. 구현하는 방법은 각 픽셀의 RGB값을 같게 만들어주면 밝기만 남게 된다. RGB에 똑같이 대입해야 하는 값은 인간의 눈의 특성을 이용하여 구한다. 인간의 눈에는 색상을 감지하는 원추세포가 있는데 빨강, 초록, 파랑에 대해 약간 다른 민감도를 가지고 있다.(초록색에 민감도가 제일 높다.) 다음의 수식을 이용하여 구하면 인간의 눈에 최적화된 흑백 처리가 완성된다.
int g = B[index]*0.114 + G[index]*0.587 + R[index]*0.299;
이진화는 이미지를 흰색(255)과 검은색(0)으로만 나타내는 것이다. 흑백 이미지에서 경계값을 설정한다. 만약 경계값이 125면 125보다 밝을 때는 255로 표현하고 125보다 어두우면 0으로 표현하는 것이다.(경계값이 커질수록 이진화 이미지는 어두워진다.) 그렇기 때문에 경계값을 잘 설정해줘야 한다.
반전은 원래 이미지의 어두운 부분과 밝은 부분을 바꾸는 것이다. 흑백 이미지가 가지고 있는 255에서 밝기값을 뺀 값을 대입하여 구현할 수 있다.(255 - 밝기값)이 이미지는 이진화 이미지를 응용하여 윤곽선을 그린 것이다. 이진화 이미지에서 흰색과 검은색이 만나는 구간이 선으로 표현되어 있다. 해당 이미지에는 왼쪽 픽셀과 아래쪽 픽셀을 비교하여 흰색과 검은색이 만나는지를 확인하는 알고리즘이 사용되었다. 만약 상하 좌우, 대각선, 혹은 더 많은 픽셀을 고려한다면 더 정교한 윤곽선그리기 알고리즘이 만들어질 것이다.
소스코드와 더 자세한 설명은 아래 링크를 참고하세요.
https://github.com/Ssukdaebat60/BmpProcess반응형'자료실' 카테고리의 다른 글
[항공우주과학] 항공기의 기초 (0) 2022.07.24 [Music] For Lovers Who Hesitate (0) 2022.01.27 [음악] 잔나비 - 주저하는 연인들을 위해 (0) 2022.01.27 [컴퓨터과학] 컴퓨터 비전(Computer Vision) (0) 2022.01.16 [물리] 탄성력 (0) 2021.12.09 [물리] 빛과 빛의 활용 (0) 2021.11.16 [법] 헌법 (0) 2021.10.27 [이미지 출처 모음] (0) 2021.09.29