실습과목으로 처음 접한 openCV와 이미지 처리 이론들.
디지털 이미지는 레스터 방식 / 벡터 방식으로 구분지을 수 있다.
이번에 배우는 것은 레스터 방식 이미지.
레스터 방식의 경우 이미지는 픽셀로 이루어져 있다.
이미지는 흑백/컬러 로 나눌 수 있다. 흑백(Grayscale)의 경우에는 이미지는 픽셀별 흑백 값만을 저장하고 있다. 컬러의 경우에는 R, G, B의 3채널이라면 각 컬러별 값을 저장하고 있다.
1. Grayscale 변환
Grayscale 이미지를 받아서, 각 픽셀 값들을 반으로 줄여서 출력.
Grayscale 이미지를 받아서, 각 픽셀 값들을 2배로 늘려서 출력.
저장할 이미지 = (unsigned char*) new unsigned char[원본이미지 가로 * 원본이미지 세로];
for(int i=0;i<height*width;i++) 저장할 이미지[i] = 원본 이미지[i] / 2;
- 흑백 이미지 파일을 읽어서 height, width 값을 가져온다.
- 픽셀수 만큼(height*width) 변환한 이미지를 저장할 변수를 생성한다.
- 원본 파일에 저장된 픽셀값의 *2 또는 /2를 하면 픽셀 값을 수정할 수 있다.
이렇게 단순히 픽셀 값을 조정하는 경우 픽셀 값을 늘릴 경우는 다음과 같은 부분을 처리해줘야 한다.
흑백 이미지의 경우 값은 0-255까지 존재하는데, 위의 문제와 같이 *2배를 해주는 경우는 값들이 255를 초과하는 경우가 발생한다.
이를 방지하기 위해 다음과 같은 조건이 추가되어야 한다.
if (원본이미지[i] * 2 > 255) 저장할이미지[i] = 255;
2. 24비트 컬러 이미지 변환
24비트 이미지를 받아서, NTSC식( G = 0.299R + 0.587G + 0.114B)을 이용하여, grayscale로 변환하여 출력.
24비트 이미지를 받아서 R, G, B 값을 추출해 NTSC식에 적용하는 것 까지는 쉽게 생각했는데, 도대체 파일을 읽었을 때 R, G, B값을 어떻게 나누는지 도무지 이해가 안됐다. (<- 완전 바보같은 생각이었지만, 24비트라는 것은 생각하지도 않고, 1번 문제와 혼동해, 픽셀값 하나를 읽어서 이걸 어떻게 R, G, B 3개 값으로 처리할 수 있는지 엄청 고민했다. 자료형 공부를 안한 티가 이렇게 큰 걸림돌이 될 줄 이야. 1번도 그렇고 2번도, 전부 다 이미지 파일을 unsigend char* 로 받아온다.)
24비트의 경우 R, G, B 값이 8비트씩 사이좋게 저장되어 있다. 그리고 우리는 이 파일을 unsigend char* 로 읽을 것이기 때문에 자동적으로 8비트씩 끊어 읽어온다.
24비트 컬러이미지의 경우 1픽셀에 대한 B, G, R 값이 순서대로 저장되어있다. 그렇기에 예를 들어 3*5만큼의 픽셀로 이루어진 컬러이미지의 경우 3*5*3만큼의 8비트가 저장되어 있다.
그러면 그냥 처음부터 8비트씩 3번 읽어서 B, G, R값을 구한 후 식에 대입해서 저장하면 컬러변환 완성 !
for (int i = 0; i < width * height * 3 ; i+=3 ){
파란색 값 = 원본이미지[i];
초록색 값 = 원본이미지[i+1];
빨간색 값 = 원본이미지[i+2];
저장할 이미지 [i/3] = 0.299 * 빨간색 값 + 0.587 * 초록색 값 + 0.114 * 파란색 값;
}
3. 16비트 컬러 이미지 변환
16비트 이미지를 받아서, NTSC식을 이용하여, grayscale로 변환하여 출력.
16비트의 경우 방법은 2번과 동일하나, 저정된 모양이 좀 다르기 때문에 값 처리를 한 단계 더 해줘야 한다.
16비트는 그림과 같이 R, G, B를 각각 5비트씩 할당하여 값을 저장하고 제일 마지막 비트는 사용하지 않는다.
그래서 컬러 이미지를 읽을때 unsinged short 로 16비트 사이즈로 읽어온 후 5비트씩 끊어 줘야 한다.
처음 접한 내용이라 잘못된 방향으로 이해해서 엄청 헷갈렸다. 지금은 스무스 하게 이해 완료.
'개발 > 개발괴발' 카테고리의 다른 글
[HTTP] 그래서 PUT 이랑 PATCH 는 뭐가 다른건가요 - (2) (0) | 2022.10.05 |
---|---|
[HTTP] 그래서 PUT 이랑 PATCH 는 뭐가 다른건가요 - (1) (0) | 2022.10.04 |
[JPA] 엔티티 값을 수정했는데 save를 안해도 되나요 (0) | 2022.09.27 |
모바일에서 로컬호스트 보기 (0) | 2021.10.31 |
벼락치기 자바스크립트 공부하기 (0) | 2020.11.09 |