2020. 9. 28. 21:27ㆍOpen CV
이차원 m x n 컬러영상에서 픽셀(i, j)의 k번째 원소는 일차원 영상에서 i x n x 채널수 + j x 채널 수 + k번째 픽셀에 해당된다. 여기서 i=0, ..., m-1이고, j=0, ..., n-1, k=0, 1, 2이다.
예를 들어, 5 x 5 컬러 영상에서 3행 3열의 첫 원소를 1차원 배열로 나타내보면, 흑백 영상은 1픽셀이 1바이트를 할당하지만, RGB컬러 영상은 1픽셀이 3채널로 구성됨으로 채널 당 1바이트씩 할당되므로 BGR순으로 픽셀 당 3바이트가 할당된다.
즉, 컬러 영상 배열은 (B0, G0, R0), (B1, G1, R1), ..., (Bn, Gn, Rn) 순서로 저장되어 있으며 (B0, G0, R0)는 첫 번째 픽셀의 파란색, 녹색, 빨간색을 나타낸다. 따라서 3행 3열의 첫 원소를 1차원 배열로 표현하면 아래 표에서 보는 것과 같이 imageData[36]이다. 여기서 imageData 변수의 인덱스 36은 2 x 5 x 3 + 2 x 3 + 0 =36에 의해 얻어진다.
imageData[0] | imageData[3] | imageData[6] | imageData[9] | imageData[12] |
imageData[15] | imageData[18] | imageData[21] | imageData[24] | imageData[27] |
imageData[30] | imageData[] | |||
표의 컬러 영상에서 각 채널의 R, G, B 데이터 값이 똑같으면 그 영상은 흑백영상이다.
흑백영상은 아래 그림의 컬러 공간에서 검정색과 흰색 사이 점선에 해당된다.
RGB 영상을 흑백영상으로 변환하는 공식은 다음과 같다.
I = 0.299 x R+ 0.587 x G + 0.114 X B
위 식은 NTSC* 표준에서 비롯된 것이다. RGB 영상을 흑백영상으로 변환하는 일반적인 공식은 다음과 같이 각 채널의 평균을 구하는 것이다.
I = 0.333x R+ 0.333 x G + 0.333 X B
* NTSC는 National Television System Committee의 약자로 미국의 텔레비젼 시스템 위원회를 나타내며 카메라에서 포착한 영상/음성을 전기화시켜 시청자의 아날로그 TV(흑백/ 컬러)에 영상을 복원시키는 텔레비젼 시스템 중의 하나이다. NTSC에서 1941년 3월에 흑백 텔레지변을 위한 기술표준을 제정하였으며 1953년 3월에 컬러 텔레비젼을 위한 기술 표준을 제정하였다.
[컬러영상을 흑백영상으로 변환]
#pragma warning (disable:4819)
#pragma warning (disable:4996)
#include <opencv\cv.h>
#include <opencv\highgui.h>
using namespace cv;
int main(int argc, char *argv[])
{
IplImage*image;
int height, width, channels;
uchar*data;
int i,j,k;
int intensity;
image= cvLoadImage("C:/Users/Documents/lena.jpg",-1);
height = image->height;
width = image->width;
channels = image->nChannels;
data = (uchar*)image->imageData;
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
intensity=(int)(0.333*data[i*width*channels+j*channels+0] +
0.333*data[i*width*channels+j*channels+1]+
0.333*data[i*width*channels+j*channels+2]);
data[i*width*channels+j*channels]=intensity;
for(k=0;k<channels;k++)
{
data[i*width*channels+j*channels+k]=intensity;
}
}
}
cvNamedWindow("Image:", CV_WINDOW_AUTOSIZE);
cvShowImage("Image:", image);
cvReleaseImage(&image);
cvWaitKey(0);
return 0;
}
[실행 결과]
HSV 컬러 모형
HSV 컬러모형은 색상(hue), 채도(Saturation), 명도(Value)를 기본으로 색을 표현하는 모형이다. 색상은 빨강, 파랑과 같은 색 자체를 나타내고, 채도는 색의 맑고 탁함을 나타내며, 채도가 높을수록 색이 맑다고 할 수 있다. 명도는 색의 밝고 어두움을 나타낸다.
[출처 : http://commons.wikimedia.org/wiki/File:HSV_color_solid_cone.png]
HSV 컬러 모델은 그림과 같이 원뿔 모양의 좌표계로 표현된다. 색상은 0에서 360도 사이의 각도로 표현되며, 0도는 빨강색, 120도는 초록색, 240도는 파란색을 나타낸다. 채도는 0에서 1까지의 값을 가지며 원뿔 중심으로부터의 수평거리(z축과의 거리)로 표현된다. 명도는 세로축에 해당하며, 가장 아래로 명도 0인 검정색을 나타내고, 가장 위쪽이 명도 1인 흰색을 나타낸다.
HSV 모형과 RGB 모형간의 변경이 가능하다. RGB 모형을 HSV 모형으로 변경하기 위해서는 다음의 식이 사용된다.
'Open CV' 카테고리의 다른 글
단일영상에서의 산술연산 (0) | 2020.09.28 |
---|---|
히스토그램 코드로 확인 (0) | 2020.09.28 |
ROI(관심 영역) 설정과 영상 정보 출력 (0) | 2020.09.28 |
컬러 영상 출력해보기(channel, origin, width, height, widthStep, depth, imageSize, imageData) (0) | 2020.09.28 |
히스토그램 (0) | 2020.09.28 |