'Animation' 카테고리의 다른 글
다시보는 Z 건담 (1) | 2011.03.15 |
---|---|
건담 팬들을 위한 부천 판타스틱 영화제 (2) | 2010.05.26 |
강식 장갑 가이버 2005 (0) | 2009.12.01 |
건담 강림.. (0) | 2009.06.17 |
막장 기어스 드디어 다 보다 (0) | 2009.01.03 |
다시보는 Z 건담 (1) | 2011.03.15 |
---|---|
건담 팬들을 위한 부천 판타스틱 영화제 (2) | 2010.05.26 |
강식 장갑 가이버 2005 (0) | 2009.12.01 |
건담 강림.. (0) | 2009.06.17 |
막장 기어스 드디어 다 보다 (0) | 2009.01.03 |
OpenCV Convert Image
(주) 글을 읽기 전에
이 글은 저와 같은 OpenCV초보자를 위해서 정리하는 것입니다.
전문가시라면 굳이 읽을 필요가 없습니다.
공부하면서 정리하는 글이라서 서툰 부분이 많이많이 보입니다.
영상 처리를 하기 위해서는 때때로 컬러 공간을 바꾸어 줘야 할 때가 많습니다.
영상에서 필요한 정보를 찾아서 추출하기 위해서는 RGB공간에서 얻을 수 없는 정보를
다른 컬러 공간에서 얻어낼 수 있기 때문입니다.
예를들어서 사진에서 휘도를 바꾸고 싶을 경우
YCbCr로 바꾼후에 Y를 변경하고 다시 이것을 RGB로 바꾸는 과정을 거치게 됩니다.
이럴 경우 컬러 공간을 변환하는 함수가 있어야 하는데
OpenCV에서는 아래 함수가 그 동작을 도와줍니다.
cvCvtColor( 입력 이미지 , 출력 이미지 , 옵션 );
옵션은 아주 많이 있지만 아래에 몇가지 중요한 옵션을 설명하였습니다.
CV_RGB2GRAY : 흑백으로 바꾸기
수식은 다음과 같다.
RGB[A]->Gray: Y<-0.299*R + 0.587*G + 0.114*B
CV_RGB2YCrCb : YCrCb로 바꾸기
Y <- 0.299*R + 0.587*G + 0.114*B
Cr <- (R-Y)*0.713 + delta
Cb <- (B-Y)*0.564 + delta
CV_RGB2HLS : ( Hue Lightness Saturation ) 으로 변환한다.
// In case of 8-bit and 16-bit images
// R, G and B are converted to floating-point format and scaled to fit 0..1 range
V,,max,, <- max(R,G,B)
V,,min,, <- min(R,G,B)
L <- (V,,max,, + V,,min,,)/2
S <- (V,,max,, - V,,min,,)/(V,,max,, + V,,min,,) if L < 0.5
(V,,max,, - V,,min,,)/(2 - (V,,max,, + V,,min,,)) if L = 0.5
(G - B)*60/S, if V,,max,,=R
H <- 180+(B - R)*60/S, if V,,max,,=G
240+(R - G)*60/S, if V,,max,,=B
if H<0 then H<-H+360
On output 0=L=1, 0=S=1, 0=H=360.
The values are then converted to the destination data type:
8-bit images:
L <- L*255, S <- S*255, H <- H/2
16-bit images (currently not supported):
L <- L*65535, S <- S*65535, H <- H
32-bit images:
H, L, S are left as is
CV_RGB2HSV : RGB 값을 HSV로 바꾼다. HSV란 Hue Saturation Value를 의미한다.
// In case of 8-bit and 16-bit images
// R, G and B are converted to floating-point format and scaled to fit 0..1 range
V <- max(R,G,B)
S <- (V-min(R,G,B))/V if V?0, 0 otherwise
(G - B)*60/S, if V=R
H <- 120+(B - R)*60/S, if V=G
240+(R - G)*60/S, if V=B
if H<0 then H<-H+360
On output 0=V=1, 0=S=1, 0=H=360.
The values are then converted to the destination data type:
8-bit images:
V <- V*255, S <- S*255, H <- H/2 (to fit to 0..255)
16-bit images (currently not supported):
V <- V*65535, S <- S*65535, H <- H
32-bit images:
H, S, V are left as is
CV_RGB2Lab : CIE Lab Color로 변환한다.
// In case of 8-bit and 16-bit images
// R, G and B are converted to floating-point format and scaled to fit 0..1 range
// convert R,G,B to CIE XYZ
|X| |0.412453 0.357580 0.180423| |R|
|Y| <- |0.212671 0.715160 0.072169|*|G|
|Z| |0.019334 0.119193 0.950227| |B|
X <- X/Xn, where Xn = 0.950456
Z <- Z/Zn, where Zn = 1.088754
L <- 116*Y^1/3-16 for Y>0.008856
L <- 903.3*Y for Y<=0.008856
a <- 500*(f(X)-f(Y)) + delta
b <- 200*(f(Y)-f(Z)) + delta
where f(t)=t^1/3^ for t>0.008856
f(t)=7.787*t+16/116 for t<=0.008856
where delta = 128 for 8-bit images,
0 for floating-point images
On output 0=L=100, -127=a=127, -127=b=127
The values are then converted to the destination data type:
8-bit images:
L <- L*255/100, a <- a + 128, b <- b + 128
16-bit images are currently not supported
32-bit images:
L, a, b are left as is
// In case of 8-bit and 16-bit images
// R, G and B are converted to floating-point format and scaled to fit 0..1 range
// convert R,G,B to CIE XYZ
|X| |0.412453 0.357580 0.180423| |R|
|Y| <- |0.212671 0.715160 0.072169|*|G|
|Z| |0.019334 0.119193 0.950227| |B|
L <- 116*Y^1/3^ for Y>0.008856
L <- 903.3*Y for Y<=0.008856
u' <- 4*X/(X + 15*Y + 3*Z)
v' <- 9*Y/(X + 15*Y + 3*Z)
u <- 13*L*(u' - u,,n,,), where u,,n,,=0.19793943
v <- 13*L*(v' - v,,n,,), where v,,n,,=0.46831096
On output 0=L=100, -134=u=220, -140=v=122
The values are then converted to the destination data type:
8-bit images:
L <- L*255/100, u <- (u + 134)*255/354, v <- (v + 140)*255/256
16-bit images are currently not supported
32-bit images:
L, u, v are left as is
코드는 아래와 같습니다.
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
int main(int argc , char *argv[]){
IplImage *imgB ;
if (argc < 3 )
{
printf("usage : colorcvt.elf srcimage dstimage option \n");
printf(" srcimage : source image file name\n");
printf(" dstimage : destination image file name\n");
printf(" option : 0 : CV_RGB2GRAY \n");
printf(" 1 : CV_RGB2YCrCb \n");
printf(" 2 : CV_RGB2HLS \n");
printf(" 3 : CV_RGB2HSV \n");
printf(" 4 : CV_RGB2Lab \n");
printf(" 5 : CV_RGB2Luv \n");
exit(0);
}
// 이미지 읽기
IplImage *imgA = cvLoadImage( argv[1] , 1);
// 대상 이미지 확정
switch( *argv[3] )
{
case '0' :
imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 1);
cvCvtColor(imgA , imgB , CV_RGB2GRAY );
break;
case '1' :
imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);
cvCvtColor(imgA , imgB , CV_RGB2YCrCb );
break;
case '2' :
imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);
cvCvtColor(imgA , imgB , CV_RGB2HLS );
break;
case '3' :
imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);
cvCvtColor(imgA , imgB , CV_RGB2HSV );
break;
case '4' :
imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);
cvCvtColor(imgA , imgB , CV_RGB2Lab );
break;
case '5' :
imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);
cvCvtColor(imgA , imgB , CV_RGB2Luv );
break;
}
cvNamedWindow("Converted Image",0);
cvShowImage("Converted Image",(CvArr*)imgB);
cvWaitKey(0);
cvDestroyWindow("Converted Image");
cvSaveImage( argv[2] , imgB);
cvReleaseImage( &imgA );
cvReleaseImage( &imgB );
return 0;
}
아래는 각각의 옵션으로 했을때의 그림입니다.
컬러 스페이스가 틀린것을 강제로 출력한 형태이므로 다른 컬러 공간의 그림은 정확하게 표현되지는 않습니다. 그냥 이렇게 되었다는 것만 보면 될 듯 합니다.
원본 이미지
흑백으로 변환 이미지
OpenCV - cvSmooth (2) | 2009.04.22 |
---|---|
Rob Hess의 SIFT [6] (0) | 2009.04.18 |
OpenCV - Image Mask (0) | 2009.03.16 |
OpenCV - Extract (2) | 2009.03.12 |
OpenCV - Image Rotation & Scale (0) | 2009.03.10 |
아래에 관련된 글을 올렸는데요
이번에는 그냥 동작하는 사진을 올립니다.
AHB 버스를 통해서 FPGA보드를 구동하는 것입니다.
예상보다 쉽게 동작을 성공시켜서 기분이 좋습니다.
보드 색상도 맘에 들고,
사실 녹색 보드는 너무 평범하고, 맘에 안들죠
다음 보드 색상은 푸른색입니다.
"기가노스의 푸른매" 를 생각해서 선택할 색상입니다.
(혹 모르시는 분들은 메탈아머 드래고나를 보시기 바랍니다.)
이제 ARM Platform 만들때 프로세서 때문에 FPGA 테스트에서 고생할 일은
많이 줄어들것 같습니다.
통상 3배의 개발 편의성 (ㅋㅋ)
[1] 가장 작은 32비트 프로세서 ZPU 입니다. (2) | 2009.07.13 |
---|---|
Computer Architecture 강의 자료 (0) | 2009.06.09 |
"그분" 전용의 SilverChip (0) | 2009.03.26 |
한사람의 기사를 맞이 하기 위해서는... (2) (0) | 2009.02.09 |
한사람의 기사를 만들기 위해서는 다른 한사람의 기사가 죽어야한다. - F.S.S. (0) | 2009.02.03 |
맥에서 프로파일링 하기 (0) | 2009.06.18 |
---|---|
OSX용 YUV Player 입니다. (0) | 2009.06.16 |
맥에서 개발한다는 것은.. (0) | 2009.03.19 |
수치스러운 인터페이스의 명예의 전당 (0) | 2009.03.05 |
Culture Code의 개발 이미지 (0) | 2009.01.28 |
이번에 칩을 하나 만들면서 SilverChip 기능을 넣었습니다.
ARM926-EJS로 여러가지 기능을 많이 넣어서 만들었습니다만,
그중에 백미는
Graphic Accelerator 와
SilverChip기능입니다.
Silver Chip이란 프로세서 Core와 그 Core의 AHB버스가 밖으로 나와서 동작하는 Chip입니다.
내부에서는 ARM926 Core와 약간의 Glue Logic이 들어간 것입니다.
ARM사에서 제공하는 CoreTile B/D의 칩을 생각하시면 맞습니다.
이번에 개발한 칩은 본래 목적은 그래픽/미디어 처리 프로세서이지만
그 외에도 내부 개발용으로 사용하기 위해서 Silver Chip 기능을 추가해서 만든 것입니다.
보드를 만들때, "그분" 전용으로 만들려고 붉은색으로 PCB를 만들었습니다.
패키지도 "그분" 전용 답게 붉은색으로 하면 좋지만, 검정색 밖에 없어서 아쉽습니다.
물론 통상 3배의 속도로 동작하지는 않습니다. (^^)
멋질거라 생각했고 나온 보드 색상도 나름 괜찮은데,
보드 색상에 대해서 결과물을 보고 멤버들이 비난아닌 비난을 조금 해서..
맘 상했습니다. 쩝..
아직도 건담의 로망을 모르다니..
AHB에 대한 테스트와 , SoC Chip의 프로토 타입 FPGA 검증 등, 보드 개발시에 편리성 등을 따져보면,
통상 3배의 (속도가 아니고) 개발 편의성을 자랑할 수 있습니다.ㅋㅋ
아래에 사진을 올립니다
밑에 있는 보드는 자체 개발한 프로토 타입 보드입니다.
그동안 프로토타입 보드를 3개를 개발했는데 그중 3번째보드입니다.
Virtex 5 제일 큰것이 2개 들어간 막강 보드입니다.
이것이 마지막 프로토타입보드가 되었으면 하는데 Virtex6가 가을에 나오고
용량이 Virtex5의 2배가 된다고 하니
나중에는 그분 전용 프로토 타입보드를 개발해야 하지 않을까 합니다.
아니면 그때는 GOLD로 해볼까요 ? KOG를 고려해 봐야하지 않을까 생각합니다.
그럼 파티마도 필요할텐데~
Computer Architecture 강의 자료 (0) | 2009.06.09 |
---|---|
“그분” 전용 SilverChip [2] (2) | 2009.04.07 |
한사람의 기사를 맞이 하기 위해서는... (2) (0) | 2009.02.09 |
한사람의 기사를 만들기 위해서는 다른 한사람의 기사가 죽어야한다. - F.S.S. (0) | 2009.02.03 |
DSP Design [2] (0) | 2009.01.30 |