Pseudo color(유사 색상) : 색이 없는 자료에 색을 부여하는 색 정합. 온도 표현을 위해 사용된다. 영상에서 낮은 온도는 푸른색으로 표현된다. 높은 온도는 붉은색으로 표현된다.
Original Pseudo Color
흑백값에 따른 칼러 분포
C 에서 구현
math.h 를 이용하여 C 에서 삼각함수를 구현할 수 있다 그러나 삼각함수에 입력되는 값은 라디안 단위로 변화시켜야 한다(X°*π/180)
Blue 값은 sin 함수
Red 값은 -sin 함수
Green 값은 -cos 함수
Y(흑백영상 값)의 범위는 0부터 255까지이고 사인,코사인함수의 주기(D)는 0°부터 360°이다
이를 수식적으로 표현하면,
Y : D = 256 : 360
라디안 단위로 변화시키면,
삼각함수의 값(X)이 -1에서 1까지의 값을 가진다 이것을 0부터 255까지 대칭시키면,
-1이 0, 0이 128, +1이 255값을 가져야 한다.
삼각함수의 값에 1을 더한후 127.5를 곱한다
////////////////////////////////////////////////////////////////////////////////////////////
아래는 위 자료를 바탕으로 작성된 Pseudo color 변환 예 입니다.
OpenCV 사용.
원본 변환 후
수행 시간
void main()
{
IplImage* image = cvLoadImage("butterfly.bmp", CV_LOAD_IMAGE_UNCHANGED);
CvSize szImage = cvGetSize(image);
IplImage *gray = cvCreateImage( szImage, IPL_DEPTH_8U, 1);
// 컬러영상 이면 명암도로 변환
if( image->nChannels == 3 )
cvCvtColor(image, gray, CV_BGR2GRAY);
else
gray = cvCloneImage( image );
// 시작 시간
LARGE_INTEGER ticksPerSec;
LARGE_INTEGER startCount, endCount;
QueryPerformanceFrequency(&ticksPerSec);
QueryPerformanceCounter(&startCount);
cvSmooth(gray, gray, CV_GAUSSIAN, 5);
IplImage *r, *g, *b;
r = cvCreateImage( szImage, IPL_DEPTH_8U, 1);
g = cvCreateImage( szImage, IPL_DEPTH_8U, 1);
b = cvCreateImage( szImage, IPL_DEPTH_8U, 1);
cvZero(r); cvZero(g); cvZero(b);
double radian = CV_PI / 180;
double fPeriod, dSin, dCos;
fPeriod = 0.0; dSin = sin(0.0); dCos = cos(0.0);
//Gray 영상에 대한 Pseudo Color 변환
for (int h = 0; h < gray->height; h++)
{
int nWidthStep = h * gray->widthStep;
for (int w = 0; w < gray->width; w++)
{
int nStep = nWidthStep + w;
BYTE byIntensity = (BYTE)gray->imageData[nStep];
//밝기에 대한 라디안값 계산
fPeriod = ((byIntensity*360)/256) * radian;
dSin = sin(fPeriod);
dCos = cos(fPeriod);
//계산된 라디안값의 범위는 -1:0:1 (화소값 -127:0:127)
//화소값 0~255의 값으로 변환하기 위한 연산
r->imageData[nStep] = (BYTE)((-dSin + 1) * 127.5);
g->imageData[nStep] = (BYTE)((-dCos + 1) * 127.5);
b->imageData[nStep] = (BYTE)((+dSin + 1) * 127.5);
}
}
//각 R, G, B 채널을 하나의 영상으로 합친다.
IplImage *gray3c = cvCreateImage( szImage, IPL_DEPTH_8U, 3);
cvMerge(b, g, r, NULL, gray3c);
//종료 시간
QueryPerformanceCounter(&endCount);
double fRunTime = (endCount.QuadPart - startCount.QuadPart) / (double)ticksPerSec.QuadPart;
printf("RunTime = %f [Sec]\n", fRunTime);
Show("gray", gray);
Show("gray3c", gray3c);
cvWaitKey(0);
cvReleaseImage(&r);
cvReleaseImage(&g);
cvReleaseImage(&b);
cvReleaseImage(&image);
cvReleaseImage(&gray);
cvReleaseImage(&gray3c);
cvDestroyAllWindows();
}
[/code]
댓글
댓글 쓰기