163
2 주주 - 주주주주주주주주주주 1 2 장 . 장장 장장 장장 주주주

2 장 . 컬러 공간 분석

Embed Size (px)

DESCRIPTION

2 장 . 컬러 공간 분석. 임은경. 차례 및 목적. 차례 컬러 공간에 대한 이야기 RGB 컬러 공간과 명암도 영상 변환 HIS 컬러 공간 CMY(K) 컬러 공간 다른 컬러 공간 HLS, HSL 컬러 공간 YCbCr, YUB, YIQ 컬러 공간 Visual C++ 구현과 CxImage 제공 함수 비교. 컬러 공간에 대한 이야기. 컬러와 컬러공간의 관계 컬러 공간 - PowerPoint PPT Presentation

Citation preview

Page 1: 2 장 .  컬러 공간 분석

2 주차 - 디지털영상처리의개념 1

2 장 . 컬러 공간 분석

임은경

Page 2: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

2 주차 - 디지털영상처리의개념2

차례 및 목적 차례

컬러 공간에 대한 이야기 RGB 컬러 공간과 명암도 영상 변환 HIS 컬러 공간 CMY(K) 컬러 공간 다른 컬러 공간

HLS, HSL 컬러 공간 YCbCr, YUB, YIQ 컬러 공간

Visual C++ 구현과 CxImage 제공 함수 비교

Page 3: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

컬러 공간에 대한 이야기 컬러와 컬러공간의 관계

컬러 공간 개별 컬러들의 상대적인 위치를 나타내는 컬러 좌표계 9color

coordinates system) 을 표현하는 2 차원 또는 3 차원 공간을 의미함

컬러 표현 시스템 (color representation system), 컬러 모델(color model) 로도 사용함

모니터에서 사용하는 컬러의 개념 , 프린터에 사용되는 화려한 컬러의 개념 모니터에서는 RGB 채널 구조

빛의 삼원색 인쇄소에서는 CMY(K) 채널 구조

빛의 반사를 기반으로 둔 감원색2 주차 - 디지털영상처리의개념

3

Page 4: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

컬러 공간에 대한 이야기

2 주차 - 디지털영상처리의개념4

가산 색 모형 감산 색 모형

RGB 컬러 모형 CMY 컬러 모형

Page 5: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

컬러 공간에 대한 이야기 인간의 시각 시스템 – HIS 컬러 모델

RGB 컬러 모델과는 다른 형태를 사용함

2 주차 - 디지털영상처리의개념5

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

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

Page 8: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 앞의 방식을 이용한 RGB 영상 Gray Level

영상으로 변환한 예제 그림 2.8

2 주차 - 디지털영상처리의개념8

Page 9: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 클래스 생성하기

컬러 변환과 관련된 클래스 만들기

2 주차 - 디지털영상처리의개념9

Page 10: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 생성된 클래스의 상황

2 주차 - 디지털영상처리의개념10

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

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

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

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

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

Page 16: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 /** 할당된 메모리 해제 - BYTE */

void CColor::GS_free2D(BYTE **image, int length) { for(int i=0; i<length; i++) free( image[i] );

free(image); }

2 주차 - 디지털영상처리의개념16

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

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

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

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

Page 21: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 헤더 파일의 모습

2 주차 - 디지털영상처리의개념21

Page 22: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 메뉴 추가하기

Rgb2gray CxImage

ID : ID_CH2_RGB2GRAY_CXIMAGE 연동한 프로그램에서 RGB2GRAY 변환 함수 사용하기

VisualGS ID : ID_CH2_RGB2GRAY_GS 직접 구현한 함수 사용하기

Split recover

2 주차 - 디지털영상처리의개념22

Page 23: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 View 클래스에서 Color 클래스를 사용하기

위해 헤더 추가하기 #include "Color.h"

2 주차 - 디지털영상처리의개념23

Page 24: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 추가된 메뉴에 함수 연결하기

CXIMAGE 메뉴에 연결할 함수 만들기

2 주차 - 디지털영상처리의개념24

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

Page 26: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 추가된 메뉴에 함수 연결하기

VisualGS 메뉴에 연결할 함수 연결하기

2 주차 - 디지털영상처리의개념26

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

Page 28: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환// RGB to GraycColor.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 주차 - 디지털영상처리의개념28

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

Page 30: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 원 영상과 영역 분할 영상

그림 2.9 영상의 영역 분할

각 비슷한 화소값끼리 모아 영역 (region) 으로 만드는 것 영상 검색 , 배경 및 객체 분해 등에 많이 응용

양자화 큰 자연 영상을 모바일 같은 작은 공간에 옮기기 위해 압축

작업이 필요 1600 만 컬러 영역을 256 컬러 영상으로 변환함 . 그림 2.10

2 주차 - 디지털영상처리의개념30

Page 31: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리 pp.144 에서처럼 RGB 컬러 모델을 각

채널별로 분리함 이를 구현해보자 .

2 주차 - 디지털영상처리의개념31

Page 32: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리

Split 방법론 들은 CxImage 방식과 직접 구현한 VisualGS 방식을 이용함

2 주차 - 디지털영상처리의개념32

Page 33: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리 CXIMAGE 를 이용한 방식

메뉴에 연결할 함수 만들기

CXIMAGE ID : ID_CH2_SPLIT2RGB_CXIMAGE

VisualGS ID : ID_CH2_SPLIT2RGB_GS

2 주차 - 디지털영상처리의개념33

Page 34: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리 메뉴에 연결할 함수 만들기

2 주차 - 디지털영상처리의개념34

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

Page 36: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리

pDoc->CopyClipBoard(newg);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

pDoc->CopyClipBoard(newb);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

Invalidate( FALSE );}

2 주차 - 디지털영상처리의개념36

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

Page 38: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리 메뉴에 연결할 함수 만들기

2 주차 - 디지털영상처리의개념38

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

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

Page 41: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리// 메모리 해제cColor.GS_free2D( red, height );cColor.GS_free2D( green, height );cColor.GS_free2D( blue, height );

Invalidate( FALSE );}

2 주차 - 디지털영상처리의개념41

Page 42: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리 앞의 방법의 실행 결과

각 red, green, blue 채널이 gray image 로 나타남

각 채널이 가지는 값으로 표현하기 . Red 채널 red 형식으로 Green 채널 green 형식으로 Blue 채널 blue 형식으로…

이를 구현하시오 .

2 주차 - 디지털영상처리의개념42

Page 43: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 각 채널 분리 레포트 -1- 앞의 방식대로 구현하시오 .

제출일 11 월 11 일 제출하기

제출시 주의 사항 제목 : 레포트 1_ 자신의학과학번이름 이름 : 자신의 이름 파일 첨부를 통해서 올려주세요 .

파일 이름 : color.cpp 또는 View 클래스 내에서 구현하기 위해서 생성되는 함수와 연결되는 함수들을 표현하고 이들에 대한 설명와 같이 메모장에 추가하여 넣어서 제출하기

파일 명 : 레포트 1_ 자신의학과학번이름 .txt

2 주차 - 디지털영상처리의개념43

Page 44: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 다양한 컬러 모델 공간

RGB 모니터와 같은 디스플레이 장치에 사용됨

YIQ TV 방송

CMY 인쇄소 프린터 , 하드카피 출력

YUV 유럽에서 사용되는 TV 방송

YCbCr JPEG 압축 분야

2 주차 - 디지털영상처리의개념44

Page 45: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 HSI 모델은 인간의 색 인지 방법에

기반을 둔 모델이다 . H 는 색상(Hue), S 는 채도 (Saturation), I는 명도 (intensity) 를 나타냄 이 색상 모델을 사용한다면 특정한

칼라를 만들어내기 위해 색을 조합할 필요가 없다 . 왜냐하면 H 자체가 색상 정보를 나타내기 때문이다 .

색상 H 는 빨간 , 파랑 , 녹색 등의 색을 구별하기 위해 사용되는 축으로 0~360 도의 범위를 가진 각도 값으로 나타낸다 . 0 도는 빨강 , 120 도는 초록 , 240 도는 파랑색을 나타냄

2 주차 - 디지털영상처리의개념45

Page 46: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 Hue( 색상 )

빛의 파장 자체의 시각적 특징을 나타냄 물체에 반사되어 나온 파장을 색상 관점에서 구별

가능 빨강 ,, 노랑과 같은 순수한 색깔 (pure color) 을

나타내고 흰색과 검정 , 회색은 색상이 아님 Saturation( 채도 )

색이 얼마나 순수한지를 나타냄 White 와 pure color 와의 혼합비율에 의해

0~100% 순수한 빨강 – 채도가 높음 , 핑크 – 채도가 낮음 색의 맑고 탁한 정보를 결정하는 특성

2 주차 - 디지털영상처리의개념46

Page 47: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 Intensity( 명도 , value, lightness)

빛의 세기 색의 밝고 어두운 것을 느끼게 하는 것

색입체의 예제 그림 2.11

명도는 수직선으로 표현됨 (0-1) 색상은 원으로 표현됨 (0 에서 360 도 ) 채도는 방사선으로 표현됨 (0-1)

예제 빨강 : Hue = 0, Saturation = 1, Intensity = 0.333

2 주차 - 디지털영상처리의개념47

Page 48: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 색 입체

2 주차 - 디지털영상처리의개념48

Page 49: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 RGB 컬러 모델로부터 HSI 컬러 모델로의

변환은 다음 식을 이용하여 가능함

2 주차 - 디지털영상처리의개념49

Page 50: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 HSI 컬러모델로부터

RGB 컬러모델로의 변환은 H 값에 따라 다르다 . H 의 값이 0도~120 도 이내인 경우는 첫번째 식과 같이 수행되며 , H 의 값이 120 도 ~240 도 이내이면 두번째 식 , H의 값이 240 도 ~360도의 범위내이면 세번째 식을 사용

2 주차 - 디지털영상처리의개념50

Page 51: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 HIS 컬러 모델 예제 ( 그림 2.13)

2 주차 - 디지털영상처리의개념51

Page 52: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 메뉴 만들기

Split to HIS VisualGS1

ID : ID_CH2_SPLIT2HSI_GS1 VisualGS2

ID : ID_CH2_SPLIT2HSI_GS2

2 주차 - 디지털영상처리의개념52

Page 53: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 54: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

54

Page 55: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 /** 할당된 메모리 해제 - double */

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

Page 56: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 57: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 /** 2 차원 메모리 할당 - double */

double **CColor::GS_doubleAlloc2D(int height, int width){

return GS_doubleAlloc2D(height, width, 0);}

/** 2 차원 메모리 할당 - double */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 주차 - 디지털영상처리의개념57

Page 58: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 59: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 60: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 61: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간

GS_sub_rgb2hsi(&h, &s, &i, r, g, b, method);

(*hue)[m][n] = h;(*saturation)[m][n] = s;(*intensity)[m][n]= i;

}}

}

2 주차 - 디지털영상처리의개념61

Page 62: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 = 3.14159265359;

*i = (double)(r + g + b)/3.0; // intensity

*s = 1.0 - (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 주차 - 디지털영상처리의개념62

Page 63: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 // 0~360 도의 degree 로 바꾸어야 한다 . *h = *h *(180.0/M_PI); // 180.0/M_PI = 57.2957951 // b/i > g/i 이면 H = 360 - H 로 바꾸어야 한다 . if(b/(*i) > g/(*i)) {

*h = 360.0 - *h;}

// 여기서 H 영상이 0~360 의 범위를 갖는데 ,

if( method == 1 ) // 명암도 영상의 범위인 0~255 로 매핑

*h = (*h/360.0)*255.0;}

}

2 주차 - 디지털영상처리의개념63

Page 64: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 메뉴에 연결할 함수 만들기

2 주차 - 디지털영상처리의개념64

Page 65: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 HSIcColor.GS_rgb2hsi( &hue, &saturation, &intensity, red, green, blue, height, width, 1);

// hue, saturation 을 0~255 로 매핑하는 option 적용

2 주차 - 디지털영상처리의개념65

Page 66: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

CxImage *newI = cColor.GS_gray2CxImage(intensity, height, width);pDoc->CopyClipBoard(newI);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

// 메모리 해제cColor.GS_free2D( red, height );cColor.GS_free2D( green, height );

2 주차 - 디지털영상처리의개념66

Page 67: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간cColor.GS_free2D( blue, height );cColor.GS_free2D( hue, height );cColor.GS_free2D( saturation, height );cColor.GS_free2D( intensity, height );

Invalidate( FALSE );}

2 주차 - 디지털영상처리의개념67

Page 68: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 메뉴 만들기

Split to HIS VisualGS1

ID : ID_CH2_SPLIT2HSI_GS1 VisualGS2

ID : ID_CH2_SPLIT2HSI_GS2

2 주차 - 디지털영상처리의개념68

Page 69: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 70: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

RGB 컬러 공간과 명암도 영상 변환 void CColor::GS_rgb2hsi_2nd(double ***hue, double

***saturation, double ***intensity, BYTE **red, BYTE **green, BYTE **blue, int height, int width)

2 주차 - 디지털영상처리의개념70

Page 71: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 72: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 73: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 메뉴에 연결할 함수 만들기

2 주차 - 디지털영상처리의개념73

Page 74: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 75: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

CxImage *newI = cColor.GS_gray2CxImage(intensity, height, width);pDoc->CopyClipBoard(newI);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

// 메모리 해제cColor.GS_free2D( red, height );cColor.GS_free2D( green, height );

2 주차 - 디지털영상처리의개념75

Page 76: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간cColor.GS_free2D( blue, height );cColor.GS_free2D( hue, height );cColor.GS_free2D( saturation, height );cColor.GS_free2D( intensity, height );

Invalidate( FALSE );

}

2 주차 - 디지털영상처리의개념76

Page 77: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 HIS rgb 컬러 공간으로의 복구 메뉴 추가하기

복구 명령 HSI RGB(1)

ID : ID_CH2_HSI2RGB_GS1 HSI RGB(2)

ID : ID_CH2_HSI2RGB_GS2

2 주차 - 디지털영상처리의개념77

Page 78: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 79: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 80: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 81: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 = 3.141592654; if(i==0.0) { // i 가 0이면 검정색임 *r = 0.; *g = 0.; *b = 0.; return; } if(s==0.0) { // Hue 가 정의되지 않음 *r = i; *g = i; *b = i; return; }

2 주차 - 디지털영상처리의개념81

Page 82: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 */ angle2=(60.0-h)*(M_PI/180.0); *r = (1.0-s)/3.0;

2 주차 - 디지털영상처리의개념82

Page 83: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 *g = (1.0 + (s*cos(angle1)/cos(angle2)))/3.0; *b = 1.0 - *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 = 1.0 - *g - *b; *r *= scale; *g *= scale; *b *= scale; } }

2 주차 - 디지털영상처리의개념83

Page 84: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 85: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간CxImage *cxColor = new CxImage();cxColor->CreateFromMatrix(color, width, height,

bitPixels, width*bitPixels, 0);

return cxColor;}

2 주차 - 디지털영상처리의개념85

Page 86: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 메뉴 추가하기

2 주차 - 디지털영상처리의개념86

Page 87: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 HSIcColor.GS_rgb2hsi( &hue, &saturation, &intensity, red, green, blue, height, width); // HSI to RGBcColor.GS_hsi2rgb( red, green, blue, hue, saturation, intensity, height, width);

2 주차 - 디지털영상처리의개념87

Page 88: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 89: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 HIS rgb 컬러 공간으로의 복구 메뉴 추가하기

복구 명령 HSI RGB(1)

ID : ID_CH2_HSI2RGB_GS1 HSI RGB(2)

ID : ID_CH2_HSI2RGB_GS2

2 주차 - 디지털영상처리의개념89

Page 90: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 91: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 92: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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- (1.0 / sqrt(6.0)) * v2);

red[m][n] = (BYTE)CLAMP(r); green[m][n] = (BYTE)CLAMP(g); blue[m][n] = (BYTE)CLAMP(b); } }}

2 주차 - 디지털영상처리의개념92

Page 93: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 메뉴 추가하기

2 주차 - 디지털영상처리의개념93

Page 94: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 HSIcColor.GS_rgb2hsi_2nd( &hue, &saturation, &intensity, red, green, blue, height, width);

2 주차 - 디지털영상처리의개념94

Page 95: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간// HSI to RGBcColor.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 주차 - 디지털영상처리의개념95

Page 96: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간

free(rgb);Invalidate( FALSE );

}

2 주차 - 디지털영상처리의개념96

Page 97: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 실행해보기

2 주차 - 디지털영상처리의개념97

Page 98: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

HIS 컬러 공간 메모

RGB 다른 컬러 모델 다른 컬러 모델 RGB

두개의 영상은 동일할 수 없다 .

왜냐하면… 공식 자체가 실수형으로 처리되는 만큼 미세한 값을 잃어버리기 때문

2 주차 - 디지털영상처리의개념98

Page 99: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간 CMY 모델은 청록 (Cyan), 자홍 (Magenta), 노랑

(Yellow) 인 삼원색을 사용한 모델이며 , RGB 모델의 보색 관계에 있는 색을 사용하여 표현한 모델

이 색상 모델은 컬러 복사기나 프린트와 같은 종이 출력장치에 사용되며 종이에 색깔을 나타내는 안료를 칠하기 위해 필요하다 . 프린트업체에서는 CMY 에 검정색을 더하여 CMYK 라는 모델을

만들었다 . K는 검정색을 나타내며 , 검정색을 만들기 위해 C, M, Y 를

조합하여 사용하는 것보다는 검정색 잉크를 그냥 사용하는 것이 비용적인 측면에서 경제적이고 질적 수준에서 더 효과적이기 때문에 만들어진 것이다 . 다음의 식이 추가됨

2 주차 - 디지털영상처리의개념99

Page 100: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간 CMYK 컬러 예제 ( 그림 2.17)

2 주차 - 디지털영상처리의개념100

Page 101: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 102: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 = 255 - red[i][j];m = 255 - green[i][j];y = 255 - blue[i][j];

2 주차 - 디지털영상처리의개념102

Page 103: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간(*cyan)[i][j] = c;(*magenta)[i][j] = m;(*yellow)[i][j] = y;

}}

}

2 주차 - 디지털영상처리의개념103

Page 104: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간 RGB CMY 변환시 메뉴 추가하기

ID : ID_CH2_SPLIT2CMY_GS

2 주차 - 디지털영상처리의개념104

Page 105: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간 RGB CMY 변환시 추가된 메뉴에 함수

연결하기

2 주차 - 디지털영상처리의개념105

Page 106: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 CMYcColor.GS_rgb2cmy( &cyan, &magenta, &yellow, red, green, blue, height, width );

2 주차 - 디지털영상처리의개념106

Page 107: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

CxImage *newY = cColor.GS_gray2CxImage(yellow, height, width);pDoc->CopyClipBoard(newY);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

// 메모리 해제cColor.GS_free2D( red, height );cColor.GS_free2D( green, height );cColor.GS_free2D( blue, height );

2 주차 - 디지털영상처리의개념107

Page 108: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간cColor.GS_free2D( cyan, height );cColor.GS_free2D( magenta, height );cColor.GS_free2D( yellow, height );

Invalidate( FALSE );}

2 주차 - 디지털영상처리의개념108

Page 109: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 110: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 = 255 - cyan[i][j];g = 255 - magenta[i][j];b = 255 - yellow[i][j];

2 주차 - 디지털영상처리의개념110

Page 111: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간red[i][j] = r;green[i][j] = g;blue[i][j] = b;

}}

}

2 주차 - 디지털영상처리의개념111

Page 112: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간 CMY 컬러 공간 RGB 컬러 공간 변환 메뉴

추가하기 ID : ID_CH2_CMY2RGB_GS

2 주차 - 디지털영상처리의개념112

Page 113: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간 CMY 컬러 공간 RGB 컬러 공간 변환 메뉴

함수 연결하기

2 주차 - 디지털영상처리의개념113

Page 114: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 CMYcColor.GS_rgb2cmy( &cyan, &magenta, &yellow, red, green, blue,

height, width );

2 주차 - 디지털영상처리의개념114

Page 115: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

115

Page 116: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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

Page 117: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간for(int i=0; i<height; i++) {

for(int j=0; j<width; j++) {c = 255 - red[i][j];m = 255 - green[i][j];y = 255 - 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 주차 - 디지털영상처리의개념117

Page 118: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

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 = 255 - cyan[i][j];

g = 255 - magenta[i][j];

b = 255 - yellow[i][j];

k = black[i][j];

red[i][j] = r - k;

green[i][j] = g - k;

blue[i][j] = b - k;

} }

}

2 주차 - 디지털영상처리의개념118

Page 119: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간 RGB 컬러 공간 CMYK 컬러 공간 CMYK 컬러 공간 RGB 컬러 공간

해보기 ( 다음 주까지 작성 후 가져오기 )

2 주차 - 디지털영상처리의개념119

Page 120: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 HSL, HLS 컬러 공간

HIS 의 유사하며 , 다양한 공식이 사용됨 pp.168 표 2.2 다양한 HSL 관련 실제 사용 공간

다양한 컬러 공간 변환을 비롯한 영상분야는 보다 더 빨리 보다 더 좋은 결과를 위해 최적화가 이루어짐

절대적인 최상의 방법은 없음 특정 분야에 특화된 것이 존재함

2 주차 - 디지털영상처리의개념120

Page 121: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 HSL, HLS 컬러 공간

2 주차 - 디지털영상처리의개념121

소프트웨어 혹은 환경 공간명 H 범위 S 범위 L/V/B 범위Paint Shop Pro HSL 0~255 0~255 L 0~255

GIMP HSV 0~360 0~100 V 0~100

Adobe Photoshop HSB 0~360 0~100 B 0~100

Windows HSL 0~240 1~240 L 0~240

Linux/KDE HSV 0~360 0~255 V 0~255

GTK HSV 0~360 0~1.0 V 0~1.0

Java HSB 0~1.0 0~1.0 B 0~1.0

Apple HSV 0~360 0~1000

L 0~100

Page 122: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 HSL, HLS 컬러 공간

페이지 169 ~ 172 RGB 컬러 공간 HLS 컬러 공간 변환 HLS 컬러 공간 RGB 컬러 공간 변환

페이지 173~177 RGB 컬러 공간 HSL 컬러 공간 변환 HSL 컬러 공간 RGB 컬러 공간 변환

2 주차 - 디지털영상처리의개념122

Page 123: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YIQ 컬러 모델

YIQ 모델은 TV 방송국에서 사용하는 모델이다 . 만약 RGB 컬러 모델을 이용해서 TV 영상 전파를 보낸다면 , 가정에서 이를 받아 흑백 TV 로 시청한다고 할 경우 , 다시 밝기를 나타내는 명암도 값을 계산해야 하는 번거로움이 있다 . 따라서 이러한 번거로움을 피하고 , 가정용의 TV 가 흑백이든 칼라이든 상관없이 사용하기 위해 사용된다 .

YIQ 모형은 다음 식에 의해 변환될 수 있다 . 또한 반대로 YIQ 모델을 RGB 모델로 역변환 가능

2 주차 - 디지털영상처리의개념123

Page 124: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YIQ 컬러 모델 변환 식

2 주차 - 디지털영상처리의개념124

Page 125: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YIQ 에서 Y는 명암도 (luminance), I, Q 는 색에

관련된 정보인 색상 (hue) 과 채도 (saturation) 정보를 나타낸다 . 흑백 TV 인 경우 영상신호에서 Y만을 취해 흑백화면을 만들고 컬러 TV 인 경우에는 세 신호 모두를 이용해서 RGB 컬러값을 만듬

장점 YIQ 모델의 사용시 , 밝기를 나타내는 Y 정보인

명암도를 바로 사용 가능히스토그램 평활화와 같은 영상처리나 컬러 영상의

유화처리 등에 색상 모델의 변환없이 그대로 사용이 가능 또한 사람의 눈은 밝기값에 민감한 특징을 보인다 .

따라서 영상신호 전송 시 , 민감한 Y값은 덜 압축하고 , 둔감한 I, Q 의 정보는 많은 압축을 사용해서 신호 전송의 효율성을 높일 수 있다

2 주차 - 디지털영상처리의개념125

Page 126: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YIQ 컬러 모델 예제

2 주차 - 디지털영상처리의개념126

Page 127: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 RGBYIQ 컬러 공간 변환하기 위해 필요한 클래스

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

Page 128: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 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);

}void CColor::GS_rgb2yiq(double ***Y, double ***I, double ***Q, 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 주차 - 디지털영상처리의개념128

Page 129: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간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 + 0.587*g + 0.114*b;(*I)[i][j] = 0.596*r - 0.275*g - 0.321*b;(*Q)[i][j] = 0.212*r - 0.523*g + 0.312*b;

if( method == 1 ){(*I)[i][j] += 128.0;(*Q)[i][j] += 128.0;}

}}

}

2 주차 - 디지털영상처리의개념129

Page 130: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 RGB YIQ 컬러 공간 변환하기 위한 메뉴 추가

CXIMAGE ID : ID_CH2_SPLIT2YIQ_CXIMAGE

VisualGS ID : ID_CH2_SPLIT2YIQ_GS

2 주차 - 디지털영상처리의개념130

Page 131: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 RGB YIQ 컬러 공간 변환 메뉴에 함수 연결하기

( 연동시킨 함수 연결하기 )

2 주차 - 디지털영상처리의개념131

Page 132: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 RGB YIQ 컬러 공간 변환 메뉴에 함수 연결하기 (

연동시킨 함수 연결하기 )void CFirstCxImageView::OnCh2Split2yiqCximage() {

// TODO: Add your command handler code hereCFirstCxImageDoc* 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 주차 - 디지털영상처리의개념132

Page 133: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간

// copy & pastepDoc->CopyClipBoard(newY);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

pDoc->CopyClipBoard(newI);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

pDoc->CopyClipBoard(newQ);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

Invalidate( FALSE );}

2 주차 - 디지털영상처리의개념133

Page 134: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 RGB YIQ 컬러 공간 변환 메뉴에 함수 연결하기

2 주차 - 디지털영상처리의개념134

Page 135: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 RGB YIQ 컬러 공간 변환 함수 구현하기

void CFirstCxImageView::OnCh2Split2yiqGs() { CFirstCxImageDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

BYTE **red; BYTE **green; BYTE **blue;double **Y; // Y : Luminancedouble **I; // I : In-phase modulationdouble **Q; // Q : Quadradure-modulation in NTSC systemint height = 0;int width = 0;CColor cColor;

// RGB 를 가져온다 .cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width );

2 주차 - 디지털영상처리의개념135

Page 136: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간// RGB to YIQcColor.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);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

CxImage *newQ = cColor.GS_gray2CxImage(Q, height, width);pDoc->CopyClipBoard(newQ);((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();

2 주차 - 디지털영상처리의개념136

Page 137: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간// 메모리 해제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 주차 - 디지털영상처리의개념137

Page 138: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YIQRGB 컬러 공간 변환하기 위해 필요한 클래스

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

Page 139: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 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 + 0.956*ii + 0.620*q;green[i][j] = y - 0.272*ii -0.647*q;blue[i][j] = y - 1.108*ii + 1.705*q; }}

}

2 주차 - 디지털영상처리의개념139

Page 140: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YIQ RGB 컬러 공간 변환을 위한 메뉴

추가하기 ID : ID_CH2_YIQ2RGB_GS

2 주차 - 디지털영상처리의개념140

Page 141: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YIQ RGB 컬러 공간 변환의 메뉴에 함수

추가하기

2 주차 - 디지털영상처리의개념141

Page 142: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 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 YIQcColor.GS_rgb2yiq( &Y, &I,&Q, red, green, blue, height, width);

2 주차 - 디지털영상처리의개념142

Page 143: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간// YIQ to RGBcColor.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 주차 - 디지털영상처리의개념143

Page 144: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 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 주차 - 디지털영상처리의개념144

Page 145: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YCrCb 컬러 변환 식

이 128 은 8비트에서의 0~255 범위를 갖기 위해 더해주는 요소값

역변환 공식

2 주차 - 디지털영상처리의개념145

Page 146: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YCrCb 컬러 예제

2 주차 - 디지털영상처리의개념146

Page 147: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

CMY(K) 컬러 공간 RGB 컬러 공간 YUV 컬러 공간 YUV 컬러 공간 RGB 컬러 공간

RGB 컬러 공간 YCbCr 컬러 공간 YCbCr 컬러 공간 RGB 컬러 공간

해보기 ( 다음 주까지 작성 후 가져오기 )

2 주차 - 디지털영상처리의개념147

Page 148: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

다른 컬러 공간 YCrCb 컬러 공간

페이지 179 ~ 181 RGB 컬러 공간 YCrCb 컬러 공간 변환 YCrCb 컬러 공간 RGB 컬러 공간 변환

2 주차 - 디지털영상처리의개념148

Page 149: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 . 각 컬러 공간들의 변환을 구현해보자 .

CColor 라는 클래스를 만들기 클래스를 분석해보자 .

2 주차 - 디지털영상처리의개념149

Page 150: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 . 선언한 클래스를 현재 구현한 프로그램에

연결해보자 . 메뉴를 추가하기 추가된 메뉴에 함수를 연결하자 . 함수에 각 클래스의 내용을 연결하여 출력하자 .

2 주차 - 디지털영상처리의개념150

Page 151: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 . 다음 메뉴를 추가하고 이를 구현하고자 함 .

2 주차 - 디지털영상처리의개념151

Page 152: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 . 각 메뉴의 ID 명

COMPARE > RGB->gray ID : ID_CH2_COMPAREGRAY_GS

COMPARE > RGB->HSL ID : ID_CH2_COMPAREHSL_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 주차 - 디지털영상처리의개념152

Page 153: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 . 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 주차 - 디지털영상처리의개념

153

Page 154: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 . 소스 상에서 다음 추가하기 #define VIEWER_BACK_GROUND 200

2 주차 - 디지털영상처리의개념154

Page 155: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 ./*====================================

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

Page 156: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 ./** 명암도 영상을 가져온다 .*/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 주차 - 디지털영상처리의개념156

Page 157: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 .// 인수종속적 오류나는 이유로 직접 메모리 할당*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(i=0; i<*height; i++) {for(j=0; j<*width; j++) {color = m_pImage->GetPixelColor(j, i);(*gray)[i][j] = (BYTE)(color.rgbRed*0.2999+color.rgbGreen*0.587+color.rgbBlue*0.114);}}

}

2 주차 - 디지털영상처리의개념157

Page 158: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 ./** 원 컬러 영상 , 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 주차 - 디지털영상처리의개념158

Page 159: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 .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 주차 - 디지털영상처리의개념159

Page 160: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 .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 주차 - 디지털영상처리의개념160

Page 161: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 . COMPARE > RGB->gray 메뉴에 함수 연결하기

2 주차 - 디지털영상처리의개념161

Page 162: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

구현해보자 . 나머지도 구현해보자 .

COMPARE > RGB->HSL COMPARE > RGB->CMY(K) COMPARE > RGB->YUV COMPARE > RGB->YIQ

2 주차 - 디지털영상처리의개념162

Page 163: 2 장 .  컬러 공간 분석

영상처리 – 컬러 공간 분석

레포트 -2- 컬러 표현 클래스

클래스 (color.cpp, color.h) 를 분석하여 커멘트를 달기 – 파일은 홈페이지의 강의 노트에 올려둠

제출일 다음 주 수업 전날 밤 12 시까지

제출시 주의 사항 제목 : 레포트 2_ 자신의학과학번이름 이름 : 자신의 이름 파일 첨부를 통해서 올려주세요 .

소스와 분석 커멘트를 다음의 파일명에 담아서 다음의 파일명으로 저장하고 파일첨부를 통해서 올리기

파일 명 : 레포트 2_ 자신의학과학번이름 .hwp

2 주차 - 디지털영상처리의개념163