Presentation is loading. Please wait.

Presentation is loading. Please wait.

2장. 컬러 공간 분석 임은경 2주차 - 디지털영상처리의개념.

Similar presentations


Presentation on theme: "2장. 컬러 공간 분석 임은경 2주차 - 디지털영상처리의개념."— Presentation transcript:

1 2장. 컬러 공간 분석 임은경 2주차 - 디지털영상처리의개념

2 차례 및 목적 차례 컬러 공간에 대한 이야기 RGB 컬러 공간과 명암도 영상 변환 HIS 컬러 공간 CMY(K) 컬러 공간
다른 컬러 공간 HLS, HSL 컬러 공간 YCbCr, YUB, YIQ 컬러 공간 Visual C++구현과 CxImage 제공 함수 비교 2주차 - 디지털영상처리의개념

3 컬러 공간에 대한 이야기 컬러와 컬러공간의 관계 모니터에서 사용하는 컬러의 개념, 프린터에 사용되는 화려한 컬러의 개념
개별 컬러들의 상대적인 위치를 나타내는 컬러 좌표계9color coordinates system)을 표현하는 2차원 또는 3차원 공간을 의미함 컬러 표현 시스템(color representation system), 컬러 모델(color model)로도 사용함 모니터에서 사용하는 컬러의 개념, 프린터에 사용되는 화려한 컬러의 개념 모니터에서는 RGB 채널 구조 빛의 삼원색 인쇄소에서는 CMY(K) 채널 구조 빛의 반사를 기반으로 둔 감원색 2주차 - 디지털영상처리의개념

4 컬러 공간에 대한 이야기 가산 색 모형 감산 색 모형 RGB 컬러 모형 CMY 컬러 모형 2주차 - 디지털영상처리의개념

5 컬러 공간에 대한 이야기 인간의 시각 시스템 – HIS 컬러 모델 RGB 컬러 모델과는 다른 형태를 사용함
2주차 - 디지털영상처리의개념

6 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주차 - 디지털영상처리의개념

7 RGB 컬러 공간과 명암도 영상 변환 RGB 칼라 영상의 그레이 레벨(Gray-Scale)의 영상변환
RGB 칼라 모델을 그레이 레벨의 흑백영상으로 바꾸기 위해서는 다음 방식으로 변환될 수 있다. 두번째 식은 TV나 모니터 등에서 사용되는 수식이며, 첫번째 식은 나머지 대부분의 응용에서 사용됨 GrayLevel = 0.333*Red *Green *Blue GrayLevel = 0.299*Red *Green *Blue NTSC 제안 각 Red, Green, Blue 중 한가지만 사용 Green만 사용 GrayLevel = *Red *Green *Blue 2주차 - 디지털영상처리의개념

8 RGB 컬러 공간과 명암도 영상 변환 앞의 방식을 이용한 RGB영상  Gray Level 영상으로 변환한 예제 그림 2.8
2주차 - 디지털영상처리의개념

9 RGB 컬러 공간과 명암도 영상 변환 클래스 생성하기 컬러 변환과 관련된 클래스 만들기 2주차 - 디지털영상처리의개념

10 RGB 컬러 공간과 명암도 영상 변환 생성된 클래스의 상황 2주차 - 디지털영상처리의개념

11 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주차 - 디지털영상처리의개념

12 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주차 - 디지털영상처리의개념

13 RGB 컬러 공간과 명암도 영상 변환 구현하기 메모리 할당하는 함수 /** 2차원 메모리 할당 - BYTE */
BYTE** CColor::GS_alloc2D(int height, int width) { return GS_alloc2D(height, width, 0); } 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주차 - 디지털영상처리의개념

14 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주차 - 디지털영상처리의개념

15 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주차 - 디지털영상처리의개념

16 RGB 컬러 공간과 명암도 영상 변환 /** 할당된 메모리 해제 - BYTE */
void CColor::GS_free2D(BYTE **image, int length) { for(int i=0; i<length; i++) free( image[i] ); free(image); } 2주차 - 디지털영상처리의개념

17 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주차 - 디지털영상처리의개념

18 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주차 - 디지털영상처리의개념

19 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]* blue[i][j]*0.114 ); break; 2주차 - 디지털영상처리의개념

20 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]; 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) ); case 5 : (*gray)[i][j] = (BYTE)( red[i][j]* green[i][j]* blue[i][j]* ); } 2주차 - 디지털영상처리의개념

21 RGB 컬러 공간과 명암도 영상 변환 헤더 파일의 모습 2주차 - 디지털영상처리의개념

22 RGB 컬러 공간과 명암도 영상 변환 메뉴 추가하기 Rgb2gray CxImage
ID : ID_CH2_RGB2GRAY_CXIMAGE 연동한 프로그램에서 RGB2GRAY변환 함수 사용하기 VisualGS ID : ID_CH2_RGB2GRAY_GS 직접 구현한 함수 사용하기 Split recover 2주차 - 디지털영상처리의개념

23 RGB 컬러 공간과 명암도 영상 변환 View 클래스에서 Color 클래스를 사용하기 위해 헤더 추가하기
#include "Color.h" 2주차 - 디지털영상처리의개념

24 RGB 컬러 공간과 명암도 영상 변환 추가된 메뉴에 함수 연결하기 CXIMAGE 메뉴에 연결할 함수 만들기
2주차 - 디지털영상처리의개념

25 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주차 - 디지털영상처리의개념

26 RGB 컬러 공간과 명암도 영상 변환 추가된 메뉴에 함수 연결하기 VisualGS 메뉴에 연결할 함수 연결하기
2주차 - 디지털영상처리의개념

27 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주차 - 디지털영상처리의개념

28 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); cColor.GS_rgb2gray(&gray, 3, red, green, blue, height, width); 2주차 - 디지털영상처리의개념

29 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); cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); cColor.GS_free2D( gray, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

30 RGB 컬러 공간과 명암도 영상 변환 원 영상과 영역 분할 영상 그림 2.9 영상의 영역 분할 양자화
각 비슷한 화소값끼리 모아 영역(region)으로 만드는 것 영상 검색, 배경 및 객체 분해 등에 많이 응용 양자화 큰 자연 영상을 모바일 같은 작은 공간에 옮기기 위해 압축 작업이 필요 1600만 컬러 영역을 256 컬러 영상으로 변환함. 그림 2.10 2주차 - 디지털영상처리의개념

31 RGB 컬러 공간과 각 채널 분리 pp.144에서처럼 RGB 컬러 모델을 각 채널별로 분리함 이를 구현해보자.
2주차 - 디지털영상처리의개념

32 RGB 컬러 공간과 각 채널 분리 Split 방법론 들은 CxImage 방식과 직접 구현한 VisualGS 방식을 이용함
2주차 - 디지털영상처리의개념

33 RGB 컬러 공간과 각 채널 분리 CXIMAGE 를 이용한 방식 메뉴에 연결할 함수 만들기 CXIMAGE
ID : ID_CH2_SPLIT2RGB_CXIMAGE VisualGS ID : ID_CH2_SPLIT2RGB_GS 2주차 - 디지털영상처리의개념

34 RGB 컬러 공간과 각 채널 분리 메뉴에 연결할 함수 만들기 2주차 - 디지털영상처리의개념

35 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주차 - 디지털영상처리의개념

36 RGB 컬러 공간과 각 채널 분리 pDoc->CopyClipBoard(newg);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); pDoc->CopyClipBoard(newb); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

37 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주차 - 디지털영상처리의개념

38 RGB 컬러 공간과 각 채널 분리 메뉴에 연결할 함수 만들기 2주차 - 디지털영상처리의개념

39 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주차 - 디지털영상처리의개념

40 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); CxImage *newb = cColor.GS_gray2CxImage(blue, height, width); pDoc->CopyClipBoard(newb); 2주차 - 디지털영상처리의개념

41 RGB 컬러 공간과 각 채널 분리 // 메모리 해제 cColor.GS_free2D( red, height );
cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

42 RGB 컬러 공간과 각 채널 분리 앞의 방법의 실행 결과 각 red, green, blue채널이 gray image로 나타남
각 채널이 가지는 값으로 표현하기. Red 채널  red형식으로 Green 채널  green형식으로 Blue 채널  blue형식으로… 이를 구현하시오. 2주차 - 디지털영상처리의개념

43 RGB 컬러 공간과 각 채널 분리 레포트 -1- 앞의 방식대로 구현하시오. 제출일 제출시 주의 사항 11월 11일 제출하기
제목 : 레포트1_자신의학과학번이름 이름 : 자신의 이름 파일 첨부를 통해서 올려주세요. 파일 이름 : color.cpp 또는 View 클래스 내에서 구현하기 위해서 생성되는 함수와 연결되는 함수들을 표현하고 이들에 대한 설명와 같이 메모장에 추가하여 넣어서 제출하기 파일 명 : 레포트1_자신의학과학번이름.txt 2주차 - 디지털영상처리의개념

44 HIS 컬러 공간 다양한 컬러 모델 공간 RGB YIQ CMY YUV YCbCr 모니터와 같은 디스플레이 장치에 사용됨
TV 방송 CMY 인쇄소 프린터, 하드카피 출력 YUV 유럽에서 사용되는 TV 방송 YCbCr JPEG 압축 분야 2주차 - 디지털영상처리의개념

45 HIS 컬러 공간 HSI 모델은 인간의 색 인지 방법에 기반을 둔 모델이다. H는 색상(Hue), S는 채도(Saturation), I는 명도(intensity)를 나타냄 이 색상 모델을 사용한다면 특정한 칼라를 만들어내기 위해 색을 조합할 필요가 없다. 왜냐하면 H 자체가 색상 정보를 나타내기 때문이다. 색상 H는 빨간, 파랑, 녹색 등의 색을 구별하기 위해 사용되는 축으로 0~360도의 범위를 가진 각도 값으로 나타낸다. 0도는 빨강, 120도는 초록, 240도는 파랑색을 나타냄 2주차 - 디지털영상처리의개념

46 HIS 컬러 공간 Hue(색상) Saturation(채도) 빛의 파장 자체의 시각적 특징을 나타냄
물체에 반사되어 나온 파장을 색상 관점에서 구별 가능 빨강,, 노랑과 같은 순수한 색깔(pure color)을 나타내고 흰색과 검정, 회색은 색상이 아님 Saturation(채도) 색이 얼마나 순수한지를 나타냄 White와 pure color와의 혼합비율에 의해 0~100% 순수한 빨강 – 채도가 높음, 핑크 – 채도가 낮음 색의 맑고 탁한 정보를 결정하는 특성 2주차 - 디지털영상처리의개념

47 HIS 컬러 공간 Intensity(명도, value, lightness) 색입체의 예제 빛의 세기
색의 밝고 어두운 것을 느끼게 하는 것 색입체의 예제 그림 2.11 명도는 수직선으로 표현됨(0-1) 색상은 원으로 표현됨(0에서 360도) 채도는 방사선으로 표현됨(0-1) 예제 빨강 : Hue = 0, Saturation = 1, Intensity = 0.333 2주차 - 디지털영상처리의개념

48 HIS 컬러 공간 색 입체 2주차 - 디지털영상처리의개념

49 HIS 컬러 공간 RGB 컬러 모델로부터 HSI 컬러 모델로의 변환은 다음 식을 이용하여 가능함 2주차 - 디지털영상처리의개념

50 HIS 컬러 공간 HSI 컬러모델로부터 RGB 컬러모델로의 변환은 H 값에 따라 다르다. H의 값이 0도~120도 이내인 경우는 첫번째 식과 같이 수행되며, H의 값이 120도~240도 이내이면 두번째 식, H의 값이 240도~360도의 범위내이면 세번째 식을 사용 2주차 - 디지털영상처리의개념

51 HIS 컬러 공간 HIS 컬러 모델 예제 (그림 2.13) 2주차 - 디지털영상처리의개념

52 HIS 컬러 공간 메뉴 만들기 Split to HIS VisualGS1 ID : ID_CH2_SPLIT2HSI_GS1
2주차 - 디지털영상처리의개념

53 RGB 컬러 공간과 명암도 영상 변환 VisualGS에서 HSI채널 분류하기
직접 구현하기 위해서…CColor 클래스에 함수 추가하기 필요한 함수는 다음과 같다. void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue) void CColor::GS_free2D(BYTE **image, int length) 앞에서 구현이 되었음. 2주차 - 디지털영상처리의개념

54 RGB 컬러 공간과 명암도 영상 변환 void CColor::GS_rgb2hsi(double ***hue, double ***saturation, double ***intensity, BYTE **red, BYTE **green, BYTE **blue, int height, int width) void CColor::GS_rgb2hsi(double ***hue, double ***saturation, double ***intensity,BYTE **red, BYTE **green, BYTE **blue,int height, int width, int method) void CColor::GS_sub_rgb2hsi(double *h, double *s, double *i, int r, int g, int b, int method) double **CColor::GS_doubleAlloc2D(int height, int width) double **CColor::GS_doubleAlloc2D(int height, int width, double value) void CColor::GS_free2D(double **image, int length) CxImage *CColor::GS_gray2CxImage(double **image, int height, int width) 2주차 - 디지털영상처리의개념

55 HIS 컬러 공간 /** 할당된 메모리 해제 - double */ // clamping
void CColor::GS_free2D(double **image, int length) { for(int i=0; i<length; i++) free( image[i] ); free(image); } // clamping #define CLAMP(pixel) (( pixel > 255 )) ? 255 : (( pixel < 0 ) ? 0 : pixel ) 2주차 - 디지털영상처리의개념

56 HIS 컬러 공간 /** double 명암도 영상을 CxImage 타입으로 변환한다. */
CxImage *CColor::GS_gray2CxImage(double **image, int height, int width) { BYTE **bImage = GS_alloc2D(height, width); for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { bImage[i][j] = (BYTE)CLAMP(image[i][j]); } CxImage *gray = GS_gray2CxImage(bImage, height, width); GS_free2D(bImage, height); return gray; 2주차 - 디지털영상처리의개념

57 HIS 컬러 공간 /** 2차원 메모리 할당 - double */
double **CColor::GS_doubleAlloc2D(int height, int width) { return GS_doubleAlloc2D(height, width, 0); } double **CColor::GS_doubleAlloc2D(int height, int width, double value) { double **image; image = (double **)calloc(height, sizeof(double *)); for(int i=0; i<height; i++) { image[i] = (double *)calloc(width, sizeof(double)); 2주차 - 디지털영상처리의개념

58 HIS 컬러 공간 if( value > 0 ) { for(i=0; i<height; i++)
for(int j=0; j<width; j++) image[i][j] = (double)value; } return image; 2주차 - 디지털영상처리의개념

59 HIS 컬러 공간 /** RGB 컬러공간을 HSI 컬러 공간으로 변환*/
void CColor::GS_rgb2hsi(double ***hue, double ***saturation, double ***intensity,BYTE **red, BYTE **green, BYTE **blue,int height, int width) { GS_rgb2hsi(hue, saturation, intensity, red, green, blue, height, width, 0); } 2주차 - 디지털영상처리의개념

60 HIS 컬러 공간 /** RGB 컬러공간을 HSI 컬러 공간으로 변환 */
void CColor::GS_rgb2hsi(double ***hue, double ***saturation, double ***intensity, BYTE **red, BYTE **green, BYTE **blue, int height, int width, int method){ double h,s,i; int r,g,b; *hue = GS_doubleAlloc2D( height, width ); *saturation = GS_doubleAlloc2D( height, width ); *intensity = GS_doubleAlloc2D( height, width ); for(int m=0; m<height; m++) { for(int n=0; n<width; n++) { r = (int)red[m][n]; g = (int)green[m][n]; b = (int)blue[m][n]; 2주차 - 디지털영상처리의개념

61 HIS 컬러 공간 GS_sub_rgb2hsi(&h, &s, &i, r, g, b, method);
(*hue)[m][n] = h; (*saturation)[m][n] = s; (*intensity)[m][n]= i; } 2주차 - 디지털영상처리의개념

62 HIS 컬러 공간 /** 각 r,g,b 화소값을 h,s,i 화소값으로 변환 */
void CColor::GS_sub_rgb2hsi(double *h, double *s, double *i, int r, int g, int b, int method) { double angle; double M_PI = ; *i = (double)(r + g + b)/3.0; // intensity *s = (3.0/(double)(r + g + b))*__min(r, __min(g,b)); // saturation if( method == 1 ) *s = 255.0*(*s); // 명암도 영상의 범위인 0~255로 매핑 if((r == g) && (g == b)) // Hue // r=g=b 이면 Hue는 정의되지 않는다. { *h=0.0; } else { angle = (r-0.5 * g-0.5 * b)/sqrt(pow((double)(r-g),2.0)+(r-b)*(g-b)); *h = acos(angle); 2주차 - 디지털영상처리의개념

63 HIS 컬러 공간 // 0~360도의 degree로 바꾸어야 한다. *h = *h *(180.0/M_PI); // 180.0/M_PI = // b/i > g/i이면 H = H로 바꾸어야 한다. if(b/(*i) > g/(*i)) { *h = *h; } // 여기서 H영상이 0~360 의 범위를 갖는데, if( method == 1 ) // 명암도 영상의 범위인 0~255로 매핑 *h = (*h/360.0)*255.0; 2주차 - 디지털영상처리의개념

64 HIS 컬러 공간 메뉴에 연결할 함수 만들기 2주차 - 디지털영상처리의개념

65 HIS 컬러 공간 구현하기 void CFirstCxImageView::OnCh2Split2hsiGs1()
{ CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; double **hue; double **saturation; double **intensity; int height = 0; int width = 0; CColor cColor; cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); // RGB to HSI cColor.GS_rgb2hsi( &hue, &saturation, &intensity, red, green, blue, height, width, 1); // hue, saturation을 0~255로 매핑하는 option 적용 2주차 - 디지털영상처리의개념

66 HIS 컬러 공간 CxImage *newH = cColor.GS_gray2CxImage(hue, height, width); pDoc->CopyClipBoard(newH); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); CxImage *newS = cColor.GS_gray2CxImage(saturation, height, width); pDoc->CopyClipBoard(newS); CxImage *newI = cColor.GS_gray2CxImage(intensity, height, width); pDoc->CopyClipBoard(newI); // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); 2주차 - 디지털영상처리의개념

67 HIS 컬러 공간 cColor.GS_free2D( blue, height ); cColor.GS_free2D( hue, height ); cColor.GS_free2D( saturation, height ); cColor.GS_free2D( intensity, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

68 HIS 컬러 공간 메뉴 만들기 Split to HIS VisualGS1 ID : ID_CH2_SPLIT2HSI_GS1
2주차 - 디지털영상처리의개념

69 RGB 컬러 공간과 명암도 영상 변환 VisualGS2에서 HSI채널 분류하기
직접 구현하기 위해서…CColor 클래스에 함수 추가하기 필요한 함수는 다음과 같다. void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue) void CColor::GS_free2D(BYTE **image, int length) double **CColor::GS_doubleAlloc2D(int height, int width) double **CColor::GS_doubleAlloc2D(int height, int width, double value) void CColor::GS_free2D(double **image, int length) CxImage *CColor::GS_gray2CxImage(double **image, int height, int width) 앞에서 구현이 되었음. 2주차 - 디지털영상처리의개념

70 RGB 컬러 공간과 명암도 영상 변환 void CColor::GS_rgb2hsi_2nd(double ***hue, double ***saturation, double ***intensity, BYTE **red, BYTE **green, BYTE **blue, int height, int width) 2주차 - 디지털영상처리의개념

71 HIS 컬러 공간 다른 버전의 rgb  his 변환 /** RGB 컬러공간을 HSI 컬러 공간으로 변환한다.*/
void CColor::GS_rgb2hsi_2nd(double ***hue, double ***saturation, double ***intensity,BYTE **red, BYTE **green, BYTE **blue, int height, int width) { double h,s,i; double r,g,b; double v1, v2; *hue = GS_doubleAlloc2D( height, width ); *saturation = GS_doubleAlloc2D( height, width ); *intensity = GS_doubleAlloc2D( height, width ); for(int m=0; m<height; m++){ for(int n=0; n<width; n++){ r = (double)red[m][n]; g = (double)green[m][n]; b = (double)blue[m][n]; 2주차 - 디지털영상처리의개념

72 HIS 컬러 공간 v1 = (1.0 / sqrt(2.0))*(g - b);
v2 = (2.0 / sqrt(6.0))*r - (1.0 / sqrt(6.0))*(g+b); h = atan2( v2, v1 ); s = sqrt( v1*v1 + v2*v2 ); i = (sqrt(3.0) / 3.0)*(r + g + b); (*hue)[m][n] = h; (*saturation)[m][n] = s; (*intensity)[m][n] = i; } 2주차 - 디지털영상처리의개념

73 HIS 컬러 공간 메뉴에 연결할 함수 만들기 2주차 - 디지털영상처리의개념

74 HIS 컬러 공간 구현하기 void CFirstCxImageView::OnChap2_splitHSI_GS2() {
CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; double **hue; double **saturation; double **intensity; int height = 0; int width = 0; CColor cColor; cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); // RGB to HSI (다른 버전) cColor.GS_rgb2hsi_2nd( &hue, &saturation, &intensity, red, green, blue, height, width); 2주차 - 디지털영상처리의개념

75 HIS 컬러 공간 CxImage *newH = cColor.GS_gray2CxImage(hue, height, width); pDoc->CopyClipBoard(newH); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); CxImage *newS = cColor.GS_gray2CxImage(saturation, height, width); pDoc->CopyClipBoard(newS); CxImage *newI = cColor.GS_gray2CxImage(intensity, height, width); pDoc->CopyClipBoard(newI); // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); 2주차 - 디지털영상처리의개념

76 HIS 컬러 공간 cColor.GS_free2D( blue, height );
cColor.GS_free2D( hue, height ); cColor.GS_free2D( saturation, height ); cColor.GS_free2D( intensity, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

77 HIS 컬러 공간 HIS  rgb 컬러 공간으로의 복구 메뉴 추가하기 복구 명령 HSI  RGB(1)
ID : ID_CH2_HSI2RGB_GS1 HSI  RGB(2) ID : ID_CH2_HSI2RGB_GS2 2주차 - 디지털영상처리의개념

78 HIS 컬러 공간 HIS  RGB채널(1) 분류하기 직접 구현하기 위해서…CColor 클래스에 함수 추가하기
void CColor::GS_hsi2rgb(BYTE **red, BYTE **green, BYTE **blue, double **hue, double **saturation, double **intensity, int height, int width) void CColor::sub_hsi2rgb(double *r, double *g, double *b, double h, double s, double i) CxImage *CColor::GS_color2CxImage(BYTE **image1, BYTE **image2, BYTE **image3, int height, int width) 2주차 - 디지털영상처리의개념

79 HIS 컬러 공간 HIS 컬러 공간  RGB 컬러 공간으로 변환 구현하기
void CColor::GS_hsi2rgb(BYTE **red, BYTE **green, BYTE **blue, double **hue, double **saturation, double **intensity, int height, int width) { double r,g,b; double h,s,i; for(int m=0; m<height; m++) { for(int n=0; n<width; n++) { h = hue[m][n]; s = saturation[m][n]; i = intensity[m][n]; sub_hsi2rgb(&r, &g, &b, h, s, i); 2주차 - 디지털영상처리의개념

80 HIS 컬러 공간 if(r>255.0) r=255.0; else if(r<0.) r=0.; if(g>255.0) g=255.0; else if(g<0.) g=0.; if(b>255.0) b=255.0; else if(b<0.) b=0.; red[m][n] = (BYTE)r; green[m][n] = (BYTE)g; blue[m][n] = (BYTE)b; } 2주차 - 디지털영상처리의개념

81 HIS 컬러 공간 /** 각 h,s,i 화소값을 r,g,b 화소값으로 변환 */ void CColor::sub_hsi2rgb(double *r, double *g, double *b, double h, double s, double i) { double angle1, angle2, scale; double M_PI = ; if(i==0.0) { // i가 0이면 검정색임 *r = 0.; *g = 0.; *b = 0.; return; } if(s==0.0) { // Hue가 정의되지 않음 *r = i; *g = i; *b = i; 2주차 - 디지털영상처리의개념

82 HIS 컬러 공간 if(h<0.0) h+=360.0; scale = 3.0 * i; if(h<=120.0) { angle1=h*(M_PI/180.0); // convert to radians - by M_PI/180 angle2=(60.0-h)*(M_PI/180.0); *b = (1.0-s)/3.0; *r = (1.0 + (s*cos(angle1)/cos(angle2)))/3.0; *g = 1.0-*r-*b; *b *= scale; *r *= scale; *g *= scale; } else if((h>120.0) && (h<=240.0)) { h -= 120.0; angle1=h*(M_PI/180.0); /* convert to radians - M_PI/180 */ *r = (1.0-s)/3.0; 2주차 - 디지털영상처리의개념

83 HIS 컬러 공간 *g = (1.0 + (s*cos(angle1)/cos(angle2)))/3.0; *b = *r - *g; *r *= scale; *g *= scale; *b *= scale; } else { h -= 240.0; angle1 = h*(M_PI/180.0); /* convert to radians - M_PI/180 */ angle2 = (60.0-h)*(M_PI/180.0); *g = (1.0-s)/3.0; *b = (1.0 + (s*cos(angle1)/cos(angle2)))/3.0; *r = *g - *b; } } 2주차 - 디지털영상처리의개념

84 HIS 컬러 공간 // RGB,HSI등 컬러공간을 CxImage 타입으로변환
CxImage *CColor::GS_color2CxImage(BYTE *image1, BYTE **image2, BYTE **image3, int height, int width) { int bitPixels = 24; // 24이면 컬러 int count = 0; BYTE **color = GS_alloc2D( height, 3*width ); for(int i=0; i<height; i++) { count = 0; for(int j=0; j<width; j++) { // 주의 : 역순임 color[i][count+2] = image1[i][j]; color[i][count+1] = image2[i][j]; color[i][count] = image3[i][j]; count += 3; } 2주차 - 디지털영상처리의개념

85 HIS 컬러 공간 CxImage *cxColor = new CxImage();
cxColor->CreateFromMatrix(color, width, height, bitPixels, width*bitPixels, 0); return cxColor; } 2주차 - 디지털영상처리의개념

86 HIS 컬러 공간 메뉴 추가하기 2주차 - 디지털영상처리의개념

87 HIS 컬러 공간 함수 구현하기 void CFirstCxImageView::OnCh2Hsi2rgbGs1()
{ CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; double **hue; double **saturation; double **intensity; int height = 0; int width = 0; CColor cColor; cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); // RGB to HSI cColor.GS_rgb2hsi( &hue, &saturation, &intensity, red, green, blue, height, width); // HSI to RGB cColor.GS_hsi2rgb( red, green, blue, hue, saturation, intensity, height, width); 2주차 - 디지털영상처리의개념

88 HIS 컬러 공간 CxImage *rgb = cColor.GS_color2CxImage(red, green, blue, height, width); pDoc->CopyClipBoard(rgb); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); cColor.GS_free2D( hue, height ); cColor.GS_free2D( saturation, height ); cColor.GS_free2D( intensity, height ); free(rgb); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

89 HIS 컬러 공간 HIS  rgb 컬러 공간으로의 복구 메뉴 추가하기 복구 명령 HSI  RGB(1)
ID : ID_CH2_HSI2RGB_GS1 HSI  RGB(2) ID : ID_CH2_HSI2RGB_GS2 2주차 - 디지털영상처리의개념

90 HIS 컬러 공간 HIS  RGB채널(2) 분류하기 직접 구현하기 위해서…CColor 클래스에 함수 추가하기
void CColor::GS_hsi2rgb_2nd(BYTE **red, BYTE **green, BYTE **blue, double **hue, double **saturation, double **intensity, int height, int width) 2주차 - 디지털영상처리의개념

91 HIS 컬러 공간 구현하기 /** HSI 컬러공간을 RGB 컬러 공간으로 변환한다. */
void CColor::GS_hsi2rgb_2nd(BYTE **red, BYTE **green, BYTE **blue, double **hue, double **saturation, double **intensity, int height, int width) { int r,g,b; double h; double v1, v2; for(int m=0; m<height; m++) { for(int n=0; n<width; n++) { h = hue[m][n]; v1 = saturation[m][n] * cos( h ); v2 = saturation[m][n] * sin( h ); r = (int)((sqrt(3.0) / 3.0) * intensity[m][n] + (2.0 / sqrt(6.0)) * v2); 2주차 - 디지털영상처리의개념

92 HIS 컬러 공간 g = (int)((sqrt(3.0) / 3.0) * intensity[m][n]
+ (1.0 / sqrt(2.0)) * v1 - (1.0 / sqrt(6.0)) * v2); b = (int)((sqrt(3.0) / 3.0) * intensity[m][n] - (1.0 / sqrt(2.0)) * v1 red[m][n] = (BYTE)CLAMP(r); green[m][n] = (BYTE)CLAMP(g); blue[m][n] = (BYTE)CLAMP(b); } 2주차 - 디지털영상처리의개념

93 HIS 컬러 공간 메뉴 추가하기 2주차 - 디지털영상처리의개념

94 HIS 컬러 공간 구현하기 void CFirstCxImageView::OnCh2Hsi2rgbGs2()
{ CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; double **hue; double **saturation; double **intensity; int height = 0; int width = 0; CColor cColor; cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); // RGB to HSI cColor.GS_rgb2hsi_2nd( &hue, &saturation, &intensity, red, green, blue, height, width); 2주차 - 디지털영상처리의개념

95 HIS 컬러 공간 // HSI to RGB cColor.GS_hsi2rgb_2nd( red, green, blue, hue, saturation, intensity, height, width); CxImage *rgb = cColor.GS_color2CxImage(red, green, blue, height, width); pDoc->CopyClipBoard(rgb); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); cColor.GS_free2D( hue, height ); cColor.GS_free2D( saturation, height ); cColor.GS_free2D( intensity, height ); 2주차 - 디지털영상처리의개념

96 HIS 컬러 공간 free(rgb); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

97 HIS 컬러 공간 실행해보기 2주차 - 디지털영상처리의개념

98 HIS 컬러 공간 메모 RGB  다른 컬러 모델 다른 컬러 모델  RGB 두개의 영상은 동일할 수 없다. 왜냐하면…
공식 자체가 실수형으로 처리되는 만큼 미세한 값을 잃어버리기 때문 2주차 - 디지털영상처리의개념

99 CMY(K) 컬러 공간 CMY 모델은 청록(Cyan), 자홍(Magenta), 노랑(Yellow)인 삼원색을 사용한 모델이며, RGB 모델의 보색 관계에 있는 색을 사용하여 표현한 모델 이 색상 모델은 컬러 복사기나 프린트와 같은 종이 출력장치에 사용되며 종이에 색깔을 나타내는 안료를 칠하기 위해 필요하다. 프린트업체에서는 CMY에 검정색을 더하여 CMYK라는 모델을 만들었다. K는 검정색을 나타내며, 검정색을 만들기 위해 C, M, Y를 조합하여 사용하는 것보다는 검정색 잉크를 그냥 사용하는 것이 비용적인 측면에서 경제적이고 질적 수준에서 더 효과적이기 때문에 만들어진 것이다. 다음의 식이 추가됨 2주차 - 디지털영상처리의개념

100 CMY(K) 컬러 공간 CMYK 컬러 예제(그림 2.17) 2주차 - 디지털영상처리의개념

101 CMY(K) 컬러 공간 RGB  CMY 표현시 필요한 클래스
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); CxImage * GS_gray2CxImage(BYTE **image, int height, int width); void GS_free2D(BYTE **image, int length); 구현되어 있음 void GS_rgb2cmy(BYTE ***cyan, BYTE ***magenta, BYTE ***yellow, BYTE **red, BYTE **green, BYTE **blue, int height, int width); 2주차 - 디지털영상처리의개념

102 CMY(K) 컬러 공간 RGB 컬러 공간  CMY 컬러 공간으로 변환 구현하기
void CColor::GS_rgb2cmy(BYTE ***cyan, BYTE ***magenta, BYTE ***yellow, BYTE **red, BYTE **green, BYTE **blue, int height, int width) { BYTE c,m,y; *cyan = GS_alloc2D( height, width ); *magenta = GS_alloc2D( height, width ); *yellow = GS_alloc2D( height, width ); for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { c = red[i][j]; m = green[i][j]; y = blue[i][j]; 2주차 - 디지털영상처리의개념

103 CMY(K) 컬러 공간 (*cyan)[i][j] = c; (*magenta)[i][j] = m;
(*yellow)[i][j] = y; } 2주차 - 디지털영상처리의개념

104 CMY(K) 컬러 공간 RGB  CMY 변환시 메뉴 추가하기 ID : ID_CH2_SPLIT2CMY_GS
2주차 - 디지털영상처리의개념

105 CMY(K) 컬러 공간 RGB  CMY 변환시 추가된 메뉴에 함수 연결하기 2주차 - 디지털영상처리의개념

106 CMY(K) 컬러 공간 메뉴에 연결할 함수 코딩하기
void CFirstCxImageView::OnCh2Split2cmyGs() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; BYTE **cyan; BYTE **magenta; BYTE **yellow; int height = 0; int width = 0; CColor cColor; // RGB를 가져온다. cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); // RGB to CMY cColor.GS_rgb2cmy( &cyan, &magenta, &yellow, red, green, blue, height, width ); 2주차 - 디지털영상처리의개념

107 CMY(K) 컬러 공간 CxImage *newC = cColor.GS_gray2CxImage(cyan, height, width); pDoc->CopyClipBoard(newC); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); CxImage *newM = cColor.GS_gray2CxImage(magenta, height, width); pDoc->CopyClipBoard(newM); CxImage *newY = cColor.GS_gray2CxImage(yellow, height, width); pDoc->CopyClipBoard(newY); // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); 2주차 - 디지털영상처리의개념

108 CMY(K) 컬러 공간 cColor.GS_free2D( cyan, height );
cColor.GS_free2D( magenta, height ); cColor.GS_free2D( yellow, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

109 CMY(K) 컬러 공간 CMY  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); CxImage *GS_color2CxImage(BYTE **image1,BYTE **image2, BYTE **image3, int height, int width); void GS_free2D(BYTE **image, int length); void GS_rgb2cmy(BYTE ***cyan, BYTE ***magenta, BYTE ***yellow, BYTE **red, BYTE **green, BYTE **blue, int height, int width); 구현되어 있음 void GS_cmy2rgb(BYTE **red, BYTE **green, BYTE **blue, BYTE **cyan, BYTE **magenta, BYTE **yellow, int height, int width); 2주차 - 디지털영상처리의개념

110 CMY(K) 컬러 공간 CMY컬러 공간  RGB 컬러 공간 구현하기
void CColor::GS_cmy2rgb(BYTE **red, BYTE **green, BYTE **blue, BYTE **cyan, BYTE **magenta, BYTE **yellow, int height, int width) { BYTE r,g,b; for(int i=0; i<height; i++) for(int j=0; j<width; j++) r = cyan[i][j]; g = magenta[i][j]; b = yellow[i][j]; 2주차 - 디지털영상처리의개념

111 CMY(K) 컬러 공간 red[i][j] = r; green[i][j] = g; blue[i][j] = b; }
2주차 - 디지털영상처리의개념

112 CMY(K) 컬러 공간 CMY컬러 공간  RGB 컬러 공간 변환 메뉴 추가하기 ID : ID_CH2_CMY2RGB_GS
2주차 - 디지털영상처리의개념

113 CMY(K) 컬러 공간 CMY컬러 공간  RGB 컬러 공간 변환 메뉴 함수 연결하기 2주차 - 디지털영상처리의개념

114 CMY(K) 컬러 공간 CMY컬러 공간  RGB 컬러 공간 변환 함수 구현하기
void CFirstCxImageView::OnCh2Cmy2rgbGs() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; BYTE **cyan; BYTE **magenta; BYTE **yellow; int height = 0; int width = 0; CColor cColor; // RGB를 가져온다. cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); // RGB to CMY cColor.GS_rgb2cmy( &cyan, &magenta, &yellow, red, green, blue, height, width ); 2주차 - 디지털영상처리의개념

115 CMY(K) 컬러 공간 // CMY to RGB
cColor.GS_cmy2rgb( red, green, blue, cyan, magenta, yellow, height, width ); CxImage *rgb = cColor.GS_color2CxImage(red, green, blue, height, width); pDoc->CopyClipBoard(rgb); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); cColor.GS_free2D( cyan, height ); cColor.GS_free2D( magenta, height ); cColor.GS_free2D( yellow, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

116 CMY(K) 컬러 공간 RGB 컬러 공간  CMYK 컬러 공간 구현하기
void CColor::GS_rgb2cmyk(BYTE ***cyan, BYTE ***magenta, BYTE ***yellow, BYTE ***black, BYTE **red, BYTE **green, BYTE **blue, int height, int width) { BYTE c,m,y,k; *cyan = GS_alloc2D( height, width ); *magenta = GS_alloc2D( height, width ); *yellow = GS_alloc2D( height, width ); *black = GS_alloc2D( height, width ); 2주차 - 디지털영상처리의개념

117 CMY(K) 컬러 공간 for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { c = red[i][j]; m = green[i][j]; y = blue[i][j]; // c, m, y중 최소값을 찾아 k 값을 정한다. k = __min( y, __min(c, m) ); (*cyan)[i][j] = c - k; (*magenta)[i][j] = m - k; (*yellow)[i][j] = y - k; (*black)[i][j] = k; } 2주차 - 디지털영상처리의개념

118 CMY(K) 컬러 공간 CMYK 컬러 공간  RGB 컬러 공간 구현하기
void CColor::GS_cmyk2rgb(BYTE **red, BYTE **green, BYTE **blue, BYTE **cyan, BYTE **magenta, BYTE **yellow, BYTE **black, int height, int width) { BYTE r,g,b,k; for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { r = cyan[i][j]; g = magenta[i][j]; b = yellow[i][j]; k = black[i][j]; red[i][j] = r - k; green[i][j] = g - k; blue[i][j] = b - k; } } } 2주차 - 디지털영상처리의개념

119 CMY(K) 컬러 공간 RGB 컬러 공간  CMYK 컬러 공간 CMYK 컬러 공간  RGB 컬러 공간
 해보기 (다음 주까지 작성 후 가져오기) 2주차 - 디지털영상처리의개념

120 다른 컬러 공간 HSL, HLS 컬러 공간 HIS의 유사하며, 다양한 공식이 사용됨
pp.168 표 2.2 다양한 HSL관련 실제 사용 공간 다양한 컬러 공간 변환을 비롯한 영상분야는 보다 더 빨리 보다 더 좋은 결과를 위해 최적화가 이루어짐 절대적인 최상의 방법은 없음 특정 분야에 특화된 것이 존재함 2주차 - 디지털영상처리의개념

121 다른 컬러 공간 HSL, HLS 컬러 공간 소프트웨어 혹은 환경 공간명 H범위 S범위 L/V/B 범위
Paint Shop Pro HSL 0~255 L GIMP HSV 0~360 0~100 V Adobe Photoshop HSB B Windows 0~240 1~240 Linux/KDE GTK 0~1.0 Java Apple 0~1000 2주차 - 디지털영상처리의개념

122 다른 컬러 공간 HSL, HLS 컬러 공간 페이지 169 ~ 172 페이지 173~177
RGB 컬러 공간  HLS 컬러 공간 변환 HLS 컬러 공간  RGB 컬러 공간 변환 페이지 173~177 RGB 컬러 공간  HSL 컬러 공간 변환 HSL 컬러 공간  RGB 컬러 공간 변환 2주차 - 디지털영상처리의개념

123 다른 컬러 공간 YIQ 컬러 모델 YIQ 모델은 TV 방송국에서 사용하는 모델이다. 만약 RGB 컬러 모델을 이용해서 TV 영상 전파를 보낸다면, 가정에서 이를 받아 흑백 TV로 시청한다고 할 경우, 다시 밝기를 나타내는 명암도 값을 계산해야 하는 번거로움이 있다. 따라서 이러한 번거로움을 피하고, 가정용의 TV가 흑백이든 칼라이든 상관없이 사용하기 위해 사용된다. YIQ 모형은 다음 식에 의해 변환될 수 있다. 또한 반대로 YIQ 모델을 RGB 모델로 역변환 가능 2주차 - 디지털영상처리의개념

124 다른 컬러 공간 YIQ 컬러 모델 변환 식 2주차 - 디지털영상처리의개념

125 다른 컬러 공간 YIQ에서 Y는 명암도(luminance), I, Q는 색에 관련된 정보인 색상(hue)과 채도(saturation) 정보를 나타낸다. 흑백 TV인 경우 영상신호에서 Y만을 취해 흑백화면을 만들고 컬러 TV인 경우에는 세 신호 모두를 이용해서 RGB 컬러값을 만듬 장점 YIQ 모델의 사용시, 밝기를 나타내는 Y 정보인 명암도를 바로 사용 가능 히스토그램 평활화와 같은 영상처리나 컬러 영상의 유화처리 등에 색상 모델의 변환없이 그대로 사용이 가능 또한 사람의 눈은 밝기값에 민감한 특징을 보인다. 따라서 영상신호 전송 시, 민감한 Y값은 덜 압축하고, 둔감한 I, Q의 정보는 많은 압축을 사용해서 신호 전송의 효율성을 높일 수 있다 2주차 - 디지털영상처리의개념

126 다른 컬러 공간 YIQ 컬러 모델 예제 2주차 - 디지털영상처리의개념

127 다른 컬러 공간 RGBYIQ 컬러 공간 변환하기 위해 필요한 클래스
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); CxImage * GS_gray2CxImage(BYTE **image, int height, int width); void GS_free2D(BYTE **image, int length); void GS_free2D(double **image, int length); 구현되어 있음 void GS_rgb2yiq(double ***Y, double ***I, double ***Q,BYTE **red, BYTE **green, BYTE **blue, int height, int width); void GS_rgb2yiq(double ***Y, double ***I, double ***Q,BYTE **red, BYTE **green, BYTE **blue, int height, int width, int method); 2주차 - 디지털영상처리의개념

128 다른 컬러 공간 RGB  YIQ 컬러 공간 구현하기
void CColor::GS_rgb2yiq(double ***Y, double ***I, double ***Q, BYTE **red, BYTE **green, BYTE **blue, int height, int width) { GS_rgb2yiq(Y, I, Q, red, green, blue, height, width, 0); } BYTE **red, BYTE **green, BYTE **blue, int height, int width, int method) double r,g,b; *Y = GS_doubleAlloc2D( height, width ); *I = GS_doubleAlloc2D( height, width ); *Q = GS_doubleAlloc2D( height, width ); 2주차 - 디지털영상처리의개념

129 다른 컬러 공간 for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { r = (double)red[i][j]; g = (double)green[i][j]; b = (double)blue[i][j]; (*Y)[i][j] = 0.299*r *g *b; (*I)[i][j] = 0.596*r *g *b; (*Q)[i][j] = 0.212*r *g *b; if( method == 1 ){ (*I)[i][j] += 128.0; (*Q)[i][j] += 128.0; } 2주차 - 디지털영상처리의개념

130 다른 컬러 공간 RGB  YIQ 컬러 공간 변환하기 위한 메뉴 추가 CXIMAGE VisualGS
ID : ID_CH2_SPLIT2YIQ_CXIMAGE VisualGS ID : ID_CH2_SPLIT2YIQ_GS 2주차 - 디지털영상처리의개념

131 다른 컬러 공간 RGB  YIQ 컬러 공간 변환 메뉴에 함수 연결하기 (연동시킨 함수 연결하기)
2주차 - 디지털영상처리의개념

132 다른 컬러 공간 RGB  YIQ 컬러 공간 변환 메뉴에 함수 연결하기 (연동시킨 함수 연결하기)
void CFirstCxImageView::OnCh2Split2yiqCximage() { // TODO: Add your command handler code here CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (pDoc->m_pImage==NULL) return; CxImage *newY = new CxImage(); CxImage *newI = new CxImage(); CxImage *newQ = new CxImage(); // YIQ 분리 pDoc->m_pImage->SplitYIQ(newY, newI, newQ); 2주차 - 디지털영상처리의개념

133 다른 컬러 공간 // copy & paste pDoc->CopyClipBoard(newY);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); pDoc->CopyClipBoard(newI); pDoc->CopyClipBoard(newQ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

134 다른 컬러 공간 RGB  YIQ 컬러 공간 변환 메뉴에 함수 연결하기 2주차 - 디지털영상처리의개념

135 다른 컬러 공간 RGB  YIQ 컬러 공간 변환 함수 구현하기
void CFirstCxImageView::OnCh2Split2yiqGs() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; double **Y; // Y : Luminance double **I; // I : In-phase modulation double **Q; // Q : Quadradure-modulation in NTSC system int height = 0; int width = 0; CColor cColor; // RGB를 가져온다. cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); 2주차 - 디지털영상처리의개념

136 다른 컬러 공간 // RGB to YIQ cColor.GS_rgb2yiq( &Y, &I, &Q, red, green, blue, height, width, 1); CxImage *newY = cColor.GS_gray2CxImage(Y, height, width); pDoc->CopyClipBoard(newY); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); CxImage *newI = cColor.GS_gray2CxImage(I, height, width); pDoc->CopyClipBoard(newI); CxImage *newQ = cColor.GS_gray2CxImage(Q, height, width); pDoc->CopyClipBoard(newQ); 2주차 - 디지털영상처리의개념

137 다른 컬러 공간 // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); cColor.GS_free2D( Y, height ); cColor.GS_free2D( I, height ); cColor.GS_free2D( Q, height ); free(newY); free(newI); free(newQ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

138 다른 컬러 공간 YIQRGB 컬러 공간 변환하기 위해 필요한 클래스
void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue); CxImage *GS_color2CxImage(BYTE **image1,BYTE **image2, BYTE **image3,int height, int width); void GS_free2D(BYTE **image, int length); void GS_free2D(double **image, int length); void GS_rgb2yiq(double ***Y, double ***I, double ***Q,BYTE **red, BYTE **green, BYTE **blue, int height, int width); void GS_rgb2yiq(double ***Y, double ***I, double ***Q,BYTE **red, BYTE **green, BYTE **blue, int height, int width, int method);  구현되어 있음 void GS_yiq2rgb(BYTE **red, BYTE **green, BYTE **blue,double **Y, double **I, double **Q, int height, int width); 2주차 - 디지털영상처리의개념

139 다른 컬러 공간 YIQ  RGB 컬러 공간 변환 구현하기
void CColor::GS_yiq2rgb(BYTE **red, BYTE **green, BYTE **blue, double **Y, double **I, double **Q, int height, int width) { double y,ii,q; for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { y = Y[i][j]; ii = I[i][j]; q = Q[i][j]; red[i][j] = y *ii *q; green[i][j] = y *ii *q; blue[i][j] = y *ii *q; } 2주차 - 디지털영상처리의개념

140 다른 컬러 공간 YIQ  RGB 컬러 공간 변환을 위한 메뉴 추가하기 ID : ID_CH2_YIQ2RGB_GS
2주차 - 디지털영상처리의개념

141 다른 컬러 공간 YIQ  RGB 컬러 공간 변환의 메뉴에 함수 추가하기 2주차 - 디지털영상처리의개념

142 다른 컬러 공간 YIQ  RGB 컬러 공간 변환의 함수 구현하기
void CFirstCxImageView::OnCh2Yiq2rgbGs() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; double **Y; double **I; double **Q; int height = 0; int width = 0; CColor cColor; // RGB를 가져온다. cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); // RGB to YIQ cColor.GS_rgb2yiq( &Y, &I,&Q, red, green, blue, height, width); 2주차 - 디지털영상처리의개념

143 다른 컬러 공간 // YIQ to RGB cColor.GS_yiq2rgb( red, green, blue, Y, I, Q, height, width); CxImage *rgb = cColor.GS_color2CxImage(red, green, blue, height, width); pDoc->CopyClipBoard(rgb); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); // 메모리 해제 cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); cColor.GS_free2D( Y, height ); cColor.GS_free2D( I, height ); cColor.GS_free2D( Q, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

144 다른 컬러 공간 YCrCb YCbCr 모델은 ITU_R(International Telecommunications Union Ratio) 601 표준안으로 색상신호가 아니라 휘도(Luminance: Y), 색차 신호(Cb, Cr)에 기반한 컬러 표현방식이다. 원래 아날로그에서 디지털로 변환하는 과정에서 오는 손실을 줄이기 위한 면도 있지만, 우리의 눈이 색상보다 밝기에 더 민감하기 때문에 색차 신호를 처리하는 게 가장 효과적이기 때문 색상정보에 들어가는 정보를 줄이고 밝기에 정보를 늘려주면 결과적으로 더 좋은 화질을 얻게 된다는 뜻이다. ITU-R 601에 따르면 색차 신호인 Cr는 R-Y, Cb는 b-Y의 디지털화 된 신호인데, 붉은정도와 푸른 정도를 나타낸다. 그러면 24비트 RGB 신호에서 YCbCr로의 변환 식은 다음과 같다. 2주차 - 디지털영상처리의개념

145 다른 컬러 공간 YCrCb 컬러 변환 식 이 128은 8비트에서의 0~255 범위를 갖기 위해 더해주는 요소값 역변환 공식
2주차 - 디지털영상처리의개념

146 다른 컬러 공간 YCrCb 컬러 예제 2주차 - 디지털영상처리의개념

147 CMY(K) 컬러 공간 RGB 컬러 공간  YUV 컬러 공간 YUV 컬러 공간  RGB 컬러 공간
RGB 컬러 공간  YCbCr 컬러 공간 YCbCr 컬러 공간  RGB 컬러 공간  해보기 (다음 주까지 작성 후 가져오기) 2주차 - 디지털영상처리의개념

148 다른 컬러 공간 YCrCb 컬러 공간 페이지 179 ~ 181 RGB 컬러 공간  YCrCb 컬러 공간 변환
2주차 - 디지털영상처리의개념

149 구현해보자. 각 컬러 공간들의 변환을 구현해보자. CColor 라는 클래스를 만들기 클래스를 분석해보자.
2주차 - 디지털영상처리의개념

150 구현해보자. 선언한 클래스를 현재 구현한 프로그램에 연결해보자. 메뉴를 추가하기 추가된 메뉴에 함수를 연결하자.
함수에 각 클래스의 내용을 연결하여 출력하자. 2주차 - 디지털영상처리의개념

151 구현해보자. 다음 메뉴를 추가하고 이를 구현하고자 함. 2주차 - 디지털영상처리의개념

152 구현해보자. 각 메뉴의 ID명 COMPARE > RGB->gray ID : ID_CH2_COMPAREGRAY_GS
COMPARE > RGB->HSL ID : ID_CH2_COMPAREH니_GS COMPARE > RGB->CMY(K) ID : ID_CH2_COMPARECMYK_GS COMPARE > RGB->YUV ID : ID_CH2_COMPAREYUV_GS COMPARE > RGB->YIQ ID : ID_CH2_COMPAREYIQ_GS 2주차 - 디지털영상처리의개념

153 구현해보자. COMPARE > RGB->gray 에 대한 이야기
원본 영상에 대한 우리가 구현한 그레이 영상과 CxImage 연동시킨 이미지의 그레이 영상 사이의 차이를 서로 비교 분석하며 볼수 있도록 영상을 같이 보여주는 작업. 필요한 클래스들… void GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue, int *height, int *width); void GS_rgb2gray(BYTE ***gray, int method, BYTE **red, BYTE **green, BYTE **blue, int height, int width);  구현되어 있음 CxImage *GS_copyColorCxImage(CxImage *m_pImage); void GS_getGray(CxImage *m_pImage, BYTE ***gray, int *height, int *width); void GS_getGray(CxImage *m_pImage, BYTE ***gray); CxImage *GS_ChannelView(CxImage *m_pImage, BYTE **image1, BYTE **image2, int height, int width); 2주차 - 디지털영상처리의개념

154 구현해보자. 소스 상에서 다음 추가하기 #define VIEWER_BACK_GROUND 200 2주차 - 디지털영상처리의개념

155 구현해보자. /*==================================== CxImage 클래스를 복사 Copy() 함수로는 한계가 있어 새로 만듬 * GS_copyCxImage() ================================*/ CxImage *CColor::GS_copyColorCxImage(CxImage *m_pImage) { BYTE **red, **green, **blue; int height, width; GS_getRGB(m_pImage, &red, &green, &blue, &height, &width); CxImage *newImage = GS_color2CxImage(red, green, blue, height, width); GS_free2D(red, height); GS_free2D(green, height); GS_free2D(blue, height); return newImage; } 2주차 - 디지털영상처리의개념

156 구현해보자. /** 명암도 영상을 가져온다.*/ void CColor::GS_getGray(CxImage *m_pImage, BYTE ***gray) { int height, width; GS_getGray(m_pImage, gray, &height, &width); } void CColor::GS_getGray(CxImage *m_pImage, BYTE ***gray, int *height, int *width) RGBQUAD color; int i,j; *height = m_pImage->GetHeight(); *width = m_pImage->GetWidth(); 2주차 - 디지털영상처리의개념

157 구현해보자. // 인수종속적 오류나는 이유로 직접 메모리 할당 *gray = (BYTE **)calloc(*height, sizeof(BYTE *)); for(i=0; i<*height; i++) { (*gray)[i] = (BYTE *)calloc(*width, sizeof(BYTE)); } if( m_pImage->IsGrayScale()) m_pImage->IncreaseBpp(24); for(j=0; j<*width; j++) { color = m_pImage->GetPixelColor(j, i); (*gray)[i][j] = (BYTE)(color.rgbRed* color.rgbGreen* color.rgbBlue*0.114); 2주차 - 디지털영상처리의개념

158 구현해보자. /** 원 컬러 영상, 2개의 명암도 영상을 보여준다. */ CxImage *CColor::GS_ChannelView(CxImage *m_pImage, BYTE **image1, BYTE **image2, int height, int width) { int i,j; BYTE **r_resultImage, **g_resultImage, **b_resultImage; int margin = 10; int resultHeight = height + margin*2; int resultWidth = width*3 + margin*4; r_resultImage = GS_alloc2D(resultHeight, resultWidth, VIEWER_BACK_GROUND); g_resultImage = GS_alloc2D(resultHeight, resultWidth, VIEWER_BACK_GROUND); b_resultImage = GS_alloc2D(resultHeight, resultWidth, VIEWER_BACK_GROUND); BYTE **org_red, **org_green, **org_blue; int tmpHeight, tmpWidth; 2주차 - 디지털영상처리의개념

159 구현해보자. GS_getRGB(m_pImage, &org_red, &org_green, &org_blue, &tmpHeight, &tmpWidth); for(i=0; i<height; i++) {// 첫번째 for(j=0; j<width; j++) { r_resultImage[margin+i][margin+j] = org_red[i][j]; g_resultImage[margin+i][margin+j] = org_green[i][j]; b_resultImage[margin+i][margin+j] = org_blue[i][j]; } // 두번째 for(j=margin+width; j<margin+width*2; j++){ r_resultImage[margin+i][margin+j] = image1[i][j-margin-width]; g_resultImage[margin+i][margin+j] = image1[i][j-margin-width]; b_resultImage[margin+i][margin+j] = image1[i][j-margin-width]; } // 세번째 2주차 - 디지털영상처리의개념

160 구현해보자. for(j=margin+width*2; j<margin+width*3; j++) {
r_resultImage[margin+i][margin*2+j] = image2[i][j-margin-width*2]; g_resultImage[margin+i][margin*2+j] = image2[i][j-margin-width*2]; b_resultImage[margin+i][margin*2+j] = image2[i][j-margin-width*2]; } CxImage *cx_result = GS_color2CxImage(r_resultImage, g_resultImage, b_resultImage, resultHeight, resultWidth); GS_free2D( r_resultImage, resultHeight ); GS_free2D( g_resultImage, resultHeight ); GS_free2D( b_resultImage, resultHeight ); GS_free2D( org_red, tmpHeight ); GS_free2D( org_green, tmpHeight ); GS_free2D( org_blue, tmpHeight ); return cx_result; 2주차 - 디지털영상처리의개념

161 구현해보자. COMPARE > RGB->gray 메뉴에 함수 연결하기 2주차 - 디지털영상처리의개념

162 구현해보자. 나머지도 구현해보자. COMPARE > RGB->HSL
COMPARE > RGB->CMY(K) COMPARE > RGB->YUV COMPARE > RGB->YIQ 2주차 - 디지털영상처리의개념

163 레포트 -2- 컬러 표현 클래스 클래스(color.cpp, color.h)를 분석하여 커멘트를 달기 – 파일은 홈페이지의 강의 노트에 올려둠 제출일 다음 주 수업 전날 밤 12시까지 제출시 주의 사항 제목 : 레포트2_자신의학과학번이름 이름 : 자신의 이름 파일 첨부를 통해서 올려주세요. 소스와 분석 커멘트를 다음의 파일명에 담아서 다음의 파일명으로 저장하고 파일첨부를 통해서 올리기 파일 명 : 레포트2_자신의학과학번이름.hwp 2주차 - 디지털영상처리의개념


Download ppt "2장. 컬러 공간 분석 임은경 2주차 - 디지털영상처리의개념."

Similar presentations


Ads by Google