1.67k likes | 2.01k Views
2 장 . 컬러 공간 분석. 임은경. 차례 및 목적. 차례 컬러 공간에 대한 이야기 RGB 컬러 공간과 명암도 영상 변환 HIS 컬러 공간 CMY(K) 컬러 공간 다른 컬러 공간 HLS, HSL 컬러 공간 YCbCr, YUB, YIQ 컬러 공간 Visual C++ 구현과 CxImage 제공 함수 비교. 컬러 공간에 대한 이야기. 컬러와 컬러공간의 관계 컬러 공간
E N D
2장. 컬러 공간 분석 임은경 2주차 - 디지털영상처리의개념
차례 및 목적 • 차례 • 컬러 공간에 대한 이야기 • RGB 컬러 공간과 명암도 영상 변환 • HIS 컬러 공간 • CMY(K) 컬러 공간 • 다른 컬러 공간 • HLS, HSL 컬러 공간 • YCbCr, YUB, YIQ 컬러 공간 • Visual C++구현과 CxImage 제공 함수 비교 2주차 - 디지털영상처리의개념
컬러 공간에 대한 이야기 • 컬러와 컬러공간의 관계 • 컬러 공간 • 개별 컬러들의 상대적인 위치를 나타내는 컬러 좌표계9color coordinates system)을표현하는 2차원 또는 3차원 공간을 의미함 • 컬러 표현 시스템(colorrepresentation system), 컬러모델(colormodel)로도사용함 • 모니터에서 사용하는 컬러의 개념, 프린터에 사용되는 화려한 컬러의 개념 • 모니터에서는 RGB 채널 구조 • 빛의 삼원색 • 인쇄소에서는 CMY(K) 채널 구조 • 빛의 반사를 기반으로 둔 감원색 2주차 - 디지털영상처리의개념
컬러 공간에 대한 이야기 가산 색 모형 감산 색 모형 RGB 컬러 모형 CMY 컬러 모형 2주차 - 디지털영상처리의개념
컬러 공간에 대한 이야기 • 인간의 시각 시스템 – HIS 컬러 모델 • RGB 컬러 모델과는 다른 형태를 사용함 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • RGB 모델은 빛의 삼원색을 이용한 모델이다. 빨간(red), 파랑(blue), 녹색(green)의 세가지 기본 칼라의 조합을 이용해서 칼라를 표현한다. (그림 2.4, 그림 2.5, 그림 2.6, 그림 2.7) • RGB 모델은 다음 그림과 같이 R, G, B를 나타내는 3차원 좌표계로 표현됨 • 좌표점 (0, 0, 0)은 검은색을 나타내며, (1, 1, 1)은 흰색을 나타내며, 검은색과 흰색을 연결하는 대각선은 빨간, 파랑, 녹색의 세 가지 색이 동등한 비율로 혼합된 색으로 흑백영상의 광도를 가짐 • 각각의 좌표계는 빨간, 파랑, 녹색이 합해지는 비율에 따라 다양한 색이 표현됨 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • RGB 칼라 영상의 그레이 레벨(Gray-Scale)의 영상변환 • RGB 칼라 모델을 그레이 레벨의 흑백영상으로 바꾸기 위해서는 다음 방식으로 변환될 수 있다. 두번째 식은 TV나 모니터 등에서 사용되는 수식이며, 첫번째 식은 나머지 대부분의 응용에서 사용됨 • GrayLevel = 0.333*Red + 0.333*Green + 0.333*Blue • GrayLevel = 0.299*Red + 0.587*Green + 0.114*Blue • NTSC 제안 • 각 Red, Green, Blue 중 한가지만 사용 • Green만 사용 • GrayLevel = 0.212671*Red + 0.715160*Green + 0.071169*Blue 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 앞의방식을 이용한 RGB영상 Gray Level 영상으로 변환한 예제 • 그림 2.8 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 클래스 생성하기 • 컬러 변환과 관련된 클래스 만들기 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 생성된 클래스의 상황 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 클래스에 메소드 추가하기 • void CColor::GS_rgb2gray(BYTE ***gray, int method, BYTE **red, BYTE **green, BYTE **blue, int height, int width) • BYTE **CColor:::GS_alloc2D(int height, int width) • BYTE **CColor::GS_alloc2D(int height, int width, BYTE value) • CxImage *CColor::GS_gray2CxImage(BYTE **image, int height, int width) • void CColor::GS_free2D(BYTE **image, int length) 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue, int *height, int *width) • void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue) • 헤더파일 추가하기 • #include <stdio.h> • #include <stdlib.h> • #include <math.h> 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 구현하기 • 메모리 할당하는 함수 /** 2차원 메모리 할당 - BYTE */ BYTE** CColor::GS_alloc2D(int height, int width) { return GS_alloc2D(height, width, 0); } /** 2차원 메모리 할당 - BYTE */ BYTE **CColor::GS_alloc2D(int height, int width, BYTE value) { BYTE **image; image = (BYTE **)calloc(height, sizeof(BYTE *)); for(int i=0; i<height; i++) 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 { image[i] = (BYTE *)calloc(width, sizeof(BYTE)); } if( value > 0 ) { for(i=0; i<height; i++) for(int j=0; j<width; j++) image[i][j] = (BYTE)value; } return image; } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • /*명암도 영상을 CxImage 타입으로 변환한다. */ CxImage *CColor::GS_gray2CxImage(BYTE **image, int height, int width) { int bitPixels = 8; // 8이면 명암도 CxImage *cxGray = new CxImage(); cxGray->CreateFromMatrix( image, width, height, bitPixels, width*bitPixels, 0); return cxGray; } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • /** 할당된 메모리 해제 - BYTE */ • void CColor::GS_free2D(BYTE **image, int length) • { • for(int i=0; i<length; i++) • free( image[i] ); • free(image); • } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • /** RGB를 가져온다 */ void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue) { int height, width; GS_getRGB(m_pImage, red, green, blue, &height, &width); } void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue, int *height, int *width) { RGBQUAD color; *height = m_pImage->GetHeight(); *width = m_pImage->GetWidth(); 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 *red = (BYTE **)GS_alloc2D( *height, *width ); *green = (BYTE **)GS_alloc2D( *height, *width ); *blue = (BYTE **)GS_alloc2D( *height, *width ); for(int i=0; i<*height; i++) { for(int j=0; j<*width; j++) { color = m_pImage->GetPixelColor(j, i); (*red)[i][j] = color.rgbRed; (*green)[i][j] = color.rgbGreen; (*blue)[i][j] = color.rgbBlue; } } } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • RGB컬러 공간을 명암도 영상으로 변환 void Ccolor::GS_rgb2gray(BYTE ***gray, int method, BYTE **red, BYTE **green, BYTE **blue, int height, int width) { if( method < 0 || method > 4 ) return; *gray = (BYTE **)GS_alloc2D( height, width ); for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { switch( method ) { case 1 : (*gray)[i][j] = (BYTE)( red[i][j]*0.2999 + green[i][j]*0.587 + blue[i][j]*0.114 ); break; 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 case 2 : (*gray)[i][j] = (BYTE)( ( red[i][j] + green[i][j] + blue[i][j] )/3.0 ); break; case 3 : (*gray)[i][j] = green[i][j]; break; case 4 : (*gray)[i][j] = (BYTE)( sqrt( pow(red[i][j],2) + pow(green[i][j],2) + pow(blue[i][j],2))/sqrt(3.0) ); break; case 5 : (*gray)[i][j] = (BYTE)( red[i][j]*0.212671 + green[i][j]*0.715160 + blue[i][j]*0.071169 ); break; } } } } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 헤더 파일의 모습 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 메뉴 추가하기 • Rgb2gray • CxImage • ID : ID_CH2_RGB2GRAY_CXIMAGE • 연동한 프로그램에서 RGB2GRAY변환 함수 사용하기 • VisualGS • ID : ID_CH2_RGB2GRAY_GS • 직접 구현한 함수 사용하기 • Split • recover 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • View 클래스에서 Color 클래스를 사용하기 위해 헤더 추가하기 • #include "Color.h" 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 추가된 메뉴에 함수 연결하기 • CXIMAGE 메뉴에 연결할 함수 만들기 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 함수 구현하기 void CFirstCxImageView::OnCh2Rgb2grayCximage() { // 도큐먼트 클래스에 있는 m_pImage를 가져오기위해참조 호출한다. CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // GrayScale() 함수 호출 pDoc->m_pImage->GrayScale(); CString str; str.Format("명암도 영상 변환 from %s",pDoc->GetTitle()); pDoc->SetTitle(str); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 추가된 메뉴에 함수 연결하기 • VisualGS 메뉴에 연결할 함수 연결하기 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 함수 구현하기 void CFirstCxImageView::OnCh2Rgb2grayGs() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; BYTE **gray; int height = 0; int width = 0; int method = 1; CColor cColor; // RGB를 가져온다. cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 // RGB to Gray cColor.GS_rgb2gray(&gray, 1, red, green, blue, height, width); CxImage *newG = cColor.GS_gray2CxImage(gray, height, width); pDoc->CopyClipBoard(newG); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); cColor.GS_rgb2gray(&gray, 2, red, green, blue, height, width); newG = cColor.GS_gray2CxImage(gray, height, width); pDoc->CopyClipBoard(newG); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); cColor.GS_rgb2gray(&gray, 3, red, green, blue, height, width); newG = cColor.GS_gray2CxImage(gray, height, width); pDoc->CopyClipBoard(newG); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 cColor.GS_rgb2gray(&gray, 4, red, green, blue, height, width); newG = cColor.GS_gray2CxImage(gray, height, width); pDoc->CopyClipBoard(newG); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); cColor.GS_rgb2gray(&gray, 5, red, green, blue, height, width); newG = cColor.GS_gray2CxImage(gray, height, width); pDoc->CopyClipBoard(newG); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); cColor.GS_free2D( gray, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 명암도 영상 변환 • 원영상과 영역 분할 영상 • 그림 2.9 • 영상의 영역 분할 • 각 비슷한 화소값끼리 모아 영역(region)으로 만드는 것 • 영상 검색, 배경 및 객체 분해 등에 많이 응용 • 양자화 • 큰 자연 영상을 모바일 같은 작은 공간에 옮기기 위해 압축 작업이 필요 • 1600만 컬러 영역을 256 컬러 영상으로 변환함. • 그림 2.10 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 pp.144에서처럼 RGB 컬러 모델을 각 채널별로 분리함 이를 구현해보자. 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • Split 방법론 들은 CxImage 방식과 직접 구현한 VisualGS 방식을 이용함 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • CXIMAGE 를 이용한 방식 • 메뉴에 연결할 함수 만들기 • CXIMAGE • ID : ID_CH2_SPLIT2RGB_CXIMAGE • VisualGS • ID : ID_CH2_SPLIT2RGB_GS 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • 메뉴에 연결할 함수 만들기 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • 구현하기 void CFirstCxImageView::OnCh2Split2rgbCximage() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (pDoc->m_pImage==NULL) return; CxImage *newr = new CxImage(); CxImage *newg = new CxImage(); CxImage *newb = new CxImage(); pDoc->m_pImage->SplitRGB(newr,newg,newb);// RGB 분리 pDoc->CopyClipBoard(newr); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 pDoc->CopyClipBoard(newg); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); pDoc->CopyClipBoard(newb); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • VisualGS에서 RGB채널 분류하기 • 직접 구현하기 위해서…CColor 클래스에 함수 추가하기 • 필요한 함수는 다음과 같다. • void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue) • CxImage *CColor::GS_gray2CxImage(BYTE **image, int height, int width) • void CColor::GS_free2D(BYTE **image, int length) • 앞에서구현이 되었음. 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • 메뉴에 연결할 함수 만들기 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • 구현하기 void CFirstCxImageView::OnCh2Split2rgbGs() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if( pDoc->m_pImage == NULL ) return; CColor cColor; BYTE **red; BYTE **green; BYTE **blue; int height = 0; int width = 0; // RGB를 가져온다. cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 CxImage *newr = cColor.GS_gray2CxImage(red, height, width); pDoc->CopyClipBoard(newr); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); CxImage *newg = cColor.GS_gray2CxImage(green, height, width); pDoc->CopyClipBoard(newg); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); CxImage *newb = cColor.GS_gray2CxImage(blue, height, width); pDoc->CopyClipBoard(newb); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • 앞의 방법의 실행 결과 • 각 red, green, blue채널이 gray image로 나타남 • 각 채널이 가지는 값으로 표현하기. • Red 채널 red형식으로 • Green 채널 green형식으로 • Blue 채널 blue형식으로… • 이를 구현하시오. 2주차 - 디지털영상처리의개념
RGB 컬러 공간과 각 채널 분리 • 레포트 -1- • 앞의 방식대로 구현하시오. • 제출일 • 11월 11일제출하기 • 제출시 주의 사항 • 제목 : 레포트1_자신의학과학번이름 • 이름 : 자신의 이름 • 파일 첨부를 통해서 올려주세요. • 파일 이름 : color.cpp 또는 View 클래스 내에서 구현하기 위해서 생성되는 함수와 연결되는 함수들을 표현하고 이들에 대한 설명와 같이 메모장에 추가하여 넣어서 제출하기 • 파일 명 : 레포트1_자신의학과학번이름.txt 2주차 - 디지털영상처리의개념
HIS 컬러 공간 • 다양한 컬러 모델 공간 • RGB • 모니터와 같은 디스플레이 장치에 사용됨 • YIQ • TV 방송 • CMY • 인쇄소 프린터, 하드카피 출력 • YUV • 유럽에서 사용되는 TV 방송 • YCbCr • JPEG 압축 분야 2주차 - 디지털영상처리의개념
HIS 컬러 공간 • HSI 모델은 인간의 색 인지 방법에 기반을 둔 모델이다. H는 색상(Hue), S는 채도(Saturation), I는 명도(intensity)를 나타냄 • 이 색상 모델을 사용한다면 특정한 칼라를 만들어내기 위해 색을 조합할 필요가 없다. 왜냐하면 H 자체가 색상 정보를 나타내기 때문이다. • 색상 H는 빨간, 파랑, 녹색 등의 색을 구별하기 위해 사용되는 축으로 0~360도의 범위를 가진 각도 값으로 나타낸다. 0도는 빨강, 120도는 초록, 240도는 파랑색을 나타냄 2주차 - 디지털영상처리의개념
HIS 컬러 공간 • Hue(색상) • 빛의 파장 자체의 시각적 특징을 나타냄 • 물체에 반사되어 나온 파장을 색상 관점에서 구별 가능 • 빨강,, 노랑과 같은 순수한 색깔(pure color)을 나타내고 흰색과 검정, 회색은 색상이 아님 • Saturation(채도) • 색이얼마나 순수한지를 나타냄 • White와 pure color와의 혼합비율에 의해 0~100% • 순수한빨강 – 채도가 높음, 핑크 – 채도가 낮음 • 색의 맑고 탁한 정보를 결정하는 특성 2주차 - 디지털영상처리의개념
HIS 컬러 공간 • Intensity(명도, value, lightness) • 빛의 세기 • 색의 밝고 어두운 것을 느끼게 하는 것 • 색입체의 예제 • 그림 2.11 • 명도는 수직선으로 표현됨(0-1) • 색상은 원으로표현됨(0에서 360도) • 채도는 방사선으로 표현됨(0-1) • 예제 • 빨강 : Hue = 0, Saturation = 1, Intensity = 0.333 2주차 - 디지털영상처리의개념
HIS 컬러 공간 색 입체 2주차 - 디지털영상처리의개념
HIS 컬러 공간 RGB 컬러 모델로부터 HSI 컬러 모델로의 변환은 다음 식을 이용하여 가능함 2주차 - 디지털영상처리의개념
HIS 컬러 공간 HSI 컬러모델로부터 RGB 컬러모델로의 변환은 H 값에 따라 다르다. H의 값이 0도~120도 이내인 경우는 첫번째 식과 같이 수행되며, H의 값이 120도~240도 이내이면 두번째 식, H의 값이 240도~360도의 범위내이면 세번째 식을 사용 2주차 - 디지털영상처리의개념