컬러 공간 분석

Download Report

Transcript 컬러 공간 분석

2장. 컬러 공간 분석
임은경
2주차 - 디지털영상처리의개념
1
영상처리 – 컬러 공간 분석
차례 및 목적

차례
 컬러
공간에 대한 이야기
 RGB 컬러 공간과 명암도 영상 변환
 HIS 컬러 공간
 CMY(K) 컬러 공간
 다른 컬러 공간


HLS, HSL 컬러 공간
YCbCr, YUB, YIQ 컬러 공간
 Visual
C++구현과 CxImage 제공 함수 비교
2주차 - 디지털영상처리의개념
2
영상처리 – 컬러 공간 분석
컬러 공간에 대한 이야기

컬러와 컬러공간의 관계
 컬러



공간
개별 컬러들의 상대적인 위치를 나타내는 컬러 좌표계9color
coordinates system)을 표현하는 2차원 또는 3차원 공간을
의미함
컬러 표현 시스템(color representation system), 컬러 모델
(color model)로도 사용함
모니터에서 사용하는 컬러의 개념, 프린터에 사
용되는 화려한 컬러의 개념
 모니터에서는

빛의 삼원색
 인쇄소에서는

RGB 채널 구조
CMY(K) 채널 구조
빛의 반사를 기반으로 둔 감원색
2주차 - 디지털영상처리의개념
3
영상처리 – 컬러 공간 분석
컬러 공간에 대한 이야기
가산 색 모형
감산 색 모형
RGB 컬러 모형
CMY 컬러 모형
2주차 - 디지털영상처리의개념
4
영상처리 – 컬러 공간 분석
컬러 공간에 대한 이야기
 인간의

시각 시스템 – HIS 컬러 모델
RGB 컬러 모델과는 다른 형태를 사용함
2주차 - 디지털영상처리의개념
5
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

앞의 방식을 이용한 RGB영상  Gray Level 영
상으로 변환한 예제
 그림
2.8
2주차 - 디지털영상처리의개념
8
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

클래스 생성하기
 컬러
변환과 관련된 클래스 만들기
2주차 - 디지털영상처리의개념
9
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

생성된 클래스의 상황
2주차 - 디지털영상처리의개념
10
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

/** 할당된 메모리 해제 - BYTE */




void CColor::GS_free2D(BYTE **image, int length)
{
for(int i=0; i<length; i++)
free( image[i] );
free(image);


}
2주차 - 디지털영상처리의개념
16
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

헤더 파일의 모습
2주차 - 디지털영상처리의개념
21
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

메뉴 추가하기



Rgb2gray
 CxImage
 ID : ID_CH2_RGB2GRAY_CXIMAGE
 연동한 프로그램에서 RGB2GRAY변환 함수 사용하기
 VisualGS
 ID : ID_CH2_RGB2GRAY_GS
 직접 구현한 함수 사용하기
Split
22
2주차 - 디지털영상처리의개념
recover
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

View 클래스에서 Color 클래스를 사용하기 위해
헤더 추가하기
 #include
"Color.h"
2주차 - 디지털영상처리의개념
23
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

추가된 메뉴에 함수 연결하기
 CXIMAGE
메뉴에 연결할 함수 만들기
2주차 - 디지털영상처리의개념
24
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

추가된 메뉴에 함수 연결하기
 VisualGS
메뉴에 연결할 함수 연결하기
2주차 - 디지털영상처리의개념
26
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환
// RGB to Gray
cColor.GS_rgb2gray(&gray, 1, red, green, blue, height, width);
CxImage *newG = cColor.GS_gray2CxImage(gray, height,
width);
pDoc->CopyClipBoard(newG);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
cColor.GS_rgb2gray(&gray, 2, red, green, blue, height, width);
newG = cColor.GS_gray2CxImage(gray, height, width);
pDoc->CopyClipBoard(newG);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
cColor.GS_rgb2gray(&gray, 3, red, green, blue, height, width);
newG = cColor.GS_gray2CxImage(gray, height, width);
pDoc->CopyClipBoard(newG);
28
2주차
- 디지털영상처리의개념
((CFirstCxImageApp
*)AfxGetApp())->OnEditPaste();
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

원 영상과 영역 분할 영상
 그림
2.9
 영상의 영역 분할


각 비슷한 화소값끼리 모아 영역(region)으로 만드는 것
영상 검색, 배경 및 객체 분해 등에 많이 응용
 양자화



큰 자연 영상을 모바일 같은 작은 공간에 옮기기 위해 압축
작업이 필요
1600만 컬러 영역을 256 컬러 영상으로 변환함.
그림 2.10
2주차 - 디지털영상처리의개념
30
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리


pp.144에서처럼 RGB 컬러 모델을 각 채널별로
분리함
이를 구현해보자.
2주차 - 디지털영상처리의개념
31
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리
 Split
방법론 들은 CxImage 방식과 직접 구현한
VisualGS 방식을 이용함
2주차 - 디지털영상처리의개념
32
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리

CXIMAGE 를 이용한 방식
 메뉴에


연결할 함수 만들기
CXIMAGE
 ID : ID_CH2_SPLIT2RGB_CXIMAGE
VisualGS
 ID : ID_CH2_SPLIT2RGB_GS
2주차 - 디지털영상처리의개념
33
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리

메뉴에 연결할 함수 만들기
2주차 - 디지털영상처리의개념
34
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리
pDoc->CopyClipBoard(newg);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
pDoc->CopyClipBoard(newb);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
36
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리

메뉴에 연결할 함수 만들기
2주차 - 디지털영상처리의개념
38
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리

구현하기
void CFirstCxImageView::OnCh2Split2rgbGs() {
CFirstCxImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if( pDoc->m_pImage == NULL ) return;
CColor cColor;
BYTE **red;
int height = 0;
BYTE **green;
int width = 0;
BYTE **blue;
// RGB를 가져온다.
cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue,
&height, &width );
2주차 - 디지털영상처리의개념
39
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리
// 메모리 해제
cColor.GS_free2D( red, height );
cColor.GS_free2D( green, height );
cColor.GS_free2D( blue, height );
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
41
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리

앞의 방법의 실행 결과
각
red, green, blue채널이 gray image로 나타남
각
채널이 가지는 값으로 표현하기.
 Red 채널  red형식으로
 Green 채널  green형식으로
 Blue 채널  blue형식으로…
 이를
구현하시오.
2주차 - 디지털영상처리의개념
42
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 각 채널 분리


레포트 -1앞의 방식대로 구현하시오.
 제출일

11월 11일 제출하기
 제출시





주의 사항
제목 : 레포트1_자신의학과학번이름
이름 : 자신의 이름
파일 첨부를 통해서 올려주세요.
파일
해서
대한
파일
이름 : color.cpp 또는 View 클래스 내에서 구현하기 위
생성되는 함수와 연결되는 함수들을 표현하고 이들에
설명와 같이 메모장에 추가하여 넣어서 제출하기
명 : 레포트1_자신의학과학번이름.txt
2주차 - 디지털영상처리의개념
43
영상처리 – 컬러 공간 분석
HIS 컬러 공간

다양한 컬러 모델 공간
 RGB

모니터와 같은 디스플레이 장치에 사용됨
 YIQ

TV 방송
 CMY

인쇄소 프린터, 하드카피 출력
 YUV

유럽에서 사용되는 TV 방송
 YCbCr

JPEG 압축 분야
2주차 - 디지털영상처리의개념
44
영상처리 – 컬러 공간 분석
HIS 컬러 공간

HSI 모델은 인간의 색 인지 방법에
기반을 둔 모델이다. H는 색상
(Hue), S는 채도(Saturation), I는
명도(intensity)를 나타냄


이 색상 모델을 사용한다면 특정한 칼
라를 만들어내기 위해 색을 조합할 필
요가 없다. 왜냐하면 H 자체가 색상
정보를 나타내기 때문이다.
색상 H는 빨간, 파랑, 녹색 등의 색을
구별하기 위해 사용되는 축으로
0~360도의 범위를 가진 각도 값으로
나타낸다. 0도는 빨강, 120도는 초록,
240도는 파랑색을 나타냄
2주차 - 디지털영상처리의개념
45
영상처리 – 컬러 공간 분석
HIS 컬러 공간

Hue(색상)
 빛의
파장 자체의 시각적 특징을 나타냄
 물체에 반사되어 나온 파장을 색상 관점에서 구별 가
능
 빨강,, 노랑과 같은 순수한 색깔(pure color)을 나타내
고 흰색과 검정, 회색은 색상이 아님

Saturation(채도)
 색이
얼마나 순수한지를 나타냄
 White와 pure color와의 혼합비율에 의해 0~100%
 순수한 빨강 – 채도가 높음, 핑크 – 채도가 낮음
 색의 맑고 탁한 정보를 결정하는 특성
2주차 - 디지털영상처리의개념
46
영상처리 – 컬러 공간 분석
HIS 컬러 공간

Intensity(명도, value, lightness)
 빛의
세기
 색의 밝고 어두운 것을 느끼게 하는 것

색입체의 예제
 그림




2.11
명도는 수직선으로 표현됨(0-1)
색상은 원으로 표현됨(0에서 360도)
채도는 방사선으로 표현됨(0-1)
예제
 빨강 : Hue = 0, Saturation = 1,
Intensity = 0.333
2주차 - 디지털영상처리의개념
47
영상처리 – 컬러 공간 분석
HIS 컬러 공간

색 입체
2주차 - 디지털영상처리의개념
48
영상처리 – 컬러 공간 분석
HIS 컬러 공간

RGB 컬러 모델로부터 HSI 컬러 모델로의 변환
은 다음 식을 이용하여 가능함
2주차 - 디지털영상처리의개념
49
영상처리 – 컬러 공간 분석
HIS 컬러 공간

HSI 컬러모델로부터
RGB 컬러모델로의 변환
은 H 값에 따라 다르다.
H의 값이 0도~120도 이
내인 경우는 첫번째 식과
같이 수행되며, H의 값이
120도~240도 이내이면
두번째 식, H의 값이 240
도~360도의 범위내이면
세번째 식을 사용
2주차 - 디지털영상처리의개념
50
영상처리 – 컬러 공간 분석
HIS 컬러 공간

HIS 컬러 모델 예제 (그림 2.13)
2주차 - 디지털영상처리의개념
51
영상처리 – 컬러 공간 분석
HIS 컬러 공간

메뉴 만들기
 Split


to HIS
VisualGS1
 ID : ID_CH2_SPLIT2HSI_GS1
VisualGS2
2주차 - 디지털영상처리의개념
 ID : ID_CH2_SPLIT2HSI_GS2
52
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
HIS 컬러 공간

메뉴에 연결할 함수 만들기
2주차 - 디지털영상처리의개념
64
영상처리 – 컬러 공간 분석
HIS 컬러 공간

구현하기
void CFirstCxImageView::OnCh2Split2hsiGs1()
{ CFirstCxImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BYTE **red;
double **hue;
int height = 0;
BYTE **green; BYTE **blue;
double **saturation;
double **intensity;
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,
height, width, 1);
2주차 - 디지털영상처리의개념
// hue, saturation을 0~255로
매핑하는 option 적용
blue,
65
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
HIS 컬러 공간
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
blue, height );
hue, height );
saturation, height );
intensity, height );
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
67
영상처리 – 컬러 공간 분석
HIS 컬러 공간

메뉴 만들기
 Split


to HIS
VisualGS1
 ID : ID_CH2_SPLIT2HSI_GS1
VisualGS2
2주차 - 디지털영상처리의개념
 ID : ID_CH2_SPLIT2HSI_GS2
68
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
RGB 컬러 공간과 명암도 영상 변환

void CColor::GS_rgb2hsi_2nd(double ***hue, double
***saturation, double ***intensity, BYTE **red, BYTE
**green, BYTE **blue, int height, int width)
2주차 - 디지털영상처리의개념
70
영상처리 – 컬러 공간 분석
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];
2주차 - 디지털영상처리의개념
b = (double)blue[m][n];
71
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
HIS 컬러 공간

메뉴에 연결할 함수 만들기
2주차 - 디지털영상처리의개념
73
영상처리 – 컬러 공간 분석
HIS 컬러 공간

구현하기
void CFirstCxImageView::OnChap2_splitHSI_GS2() {
CFirstCxImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BYTE **red;
double **hue;
int height = 0;
BYTE **green;
BYTE **blue;
double **saturation;
double **intensity;
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
HIS 컬러 공간
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
blue, height );
hue, height );
saturation, height );
intensity, height );
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
76
영상처리 – 컬러 공간 분석
HIS 컬러 공간


HIS  rgb 컬러 공간으로의 복구
메뉴 추가하기
 복구 명령
 HSI  RGB(1)
ID : ID_CH2_HSI2RGB_GS1
HSI  RGB(2)
 ID : ID_CH2_HSI2RGB_GS2


2주차 - 디지털영상처리의개념
77
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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;
81
}
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
영상처리 – 컬러 공간 분석
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;
83
} }
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
영상처리 – 컬러 공간 분석
HIS 컬러 공간
CxImage *cxColor = new CxImage();
cxColor->CreateFromMatrix(color, width,
width*bitPixels,
0);
height, bitPixels,
return cxColor;
}
2주차 - 디지털영상처리의개념
85
영상처리 – 컬러 공간 분석
HIS 컬러 공간

메뉴 추가하기
2주차 - 디지털영상처리의개념
86
영상처리 – 컬러 공간 분석
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,
87
height, width);
2주차 - 디지털영상처리의개념
영상처리 – 컬러 공간 분석
HIS 컬러 공간
CxImage *rgb = cColor.GS_color2CxImage(red, green, blue, height,
width);
pDoc->CopyClipBoard(rgb);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
// 메모리 해제
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
red, height );
green, height );
blue, height );
hue, height );
saturation, height );
intensity, height );
free(rgb);
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
88
영상처리 – 컬러 공간 분석
HIS 컬러 공간


HIS  rgb 컬러 공간으로의 복구
메뉴 추가하기
 복구 명령
 HSI  RGB(1)
ID : ID_CH2_HSI2RGB_GS1
HSI  RGB(2)
 ID : ID_CH2_HSI2RGB_GS2


2주차 - 디지털영상처리의개념
89
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
HIS 컬러 공간
g=
b=
(int)((sqrt(3.0) / 3.0) * intensity[m][n]
+ (1.0 / sqrt(2.0)) * v1
- (1.0 / sqrt(6.0)) * v2);
(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
영상처리 – 컬러 공간 분석
HIS 컬러 공간

메뉴 추가하기
2주차 - 디지털영상처리의개념
93
영상처리 – 컬러 공간 분석
HIS 컬러 공간

구현하기
void CFirstCxImageView::OnCh2Hsi2rgbGs2()
{ CFirstCxImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BYTE **red;
double **hue;
int height = 0;
BYTE **green; BYTE **blue;
double **saturation;
double **intensity;
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주차 - 디지털영상처리의개념
94
영상처리 – 컬러 공간 분석
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(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
red, height );
green, height );
blue, height );
hue, height );
saturation, height );
intensity, height );
2주차 - 디지털영상처리의개념
95
영상처리 – 컬러 공간 분석
HIS 컬러 공간
free(rgb);
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
96
영상처리 – 컬러 공간 분석
HIS 컬러 공간

실행해보기
2주차 - 디지털영상처리의개념
97
영상처리 – 컬러 공간 분석
HIS 컬러 공간

메모
 다른 컬러 모델
 다른 컬러 모델  RGB
 RGB
 두개의
영상은 동일할 수 없다.
 왜냐하면…

공식 자체가 실수형으로 처리되는 만큼 미세한 값을 잃어버
리기 때문
2주차 - 디지털영상처리의개념
98
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간

CMY 모델은 청록(Cyan), 자홍(Magenta), 노랑(Yellow)
인 삼원색을 사용한 모델이며, RGB 모델의 보색 관계에
있는 색을 사용하여 표현한 모델

이 색상 모델은 컬러 복사기나 프린트와 같은 종이 출력장치에 사용
되며 종이에 색깔을 나타내는 안료를 칠하기 위해 필요하다.
 프린트업체에서는 CMY에 검정색을 더하여 CMYK라는 모델을
만들었다.
 K는 검정색을 나타내며, 검정색을 만들기 위해 C, M, Y를 조합
하여 사용하는 것보다는 검정색 잉크를 그냥 사용하는 것이 비용
적인 측면에서 경제적이고 질적 수준에서 더 효과적이기 때문에
만들어진 것이다. 다음의 식이 추가됨
2주차 - 디지털영상처리의개념
99
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간

CMYK 컬러 예제(그림 2.17)
2주차 - 디지털영상처리의개념
100
영상처리 – 컬러 공간 분석
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
101
2주차 - 디지털영상처리의개념
**green, BYTE **blue,
int height, int width);
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간
(*cyan)[i][j] = c;
(*magenta)[i][j] = m;
(*yellow)[i][j] = y;
}
}
}
2주차 - 디지털영상처리의개념
103
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간

RGB  CMY 변환시 메뉴 추가하기
 ID
: ID_CH2_SPLIT2CMY_GS
2주차 - 디지털영상처리의개념
104
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간

RGB  CMY 변환시 추가된 메뉴에 함수 연결하
기
2주차 - 디지털영상처리의개념
105
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간

메뉴에 연결할 함수 코딩하기
void CFirstCxImageView::OnCh2Split2cmyGs()
{ CFirstCxImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BYTE **red;
BYTE **cyan;
int height = 0;
CColor cColor;
BYTE **green; BYTE **blue;
BYTE **magenta;
BYTE **yellow;
int width = 0;
// RGB를 가져온다.
cColor.GS_getRGB( pDoc->m_pImage,
&blue, &height, &width );
&red,
// RGB to CMY
cColor.GS_rgb2cmy( &cyan, &magenta,
- 디지털영상처리의개념
blue,
height, 2주차
width
);
&yellow, red,
&green,
green,
106
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간
cColor.GS_free2D( cyan, height );
cColor.GS_free2D( magenta, height );
cColor.GS_free2D( yellow, height );
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
108
영상처리 – 컬러 공간 분석
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
109
width);
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
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간
red[i][j] = r;
green[i][j] = g;
blue[i][j] = b;
}
}
}
2주차 - 디지털영상처리의개념
111
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간

CMY컬러 공간  RGB 컬러 공간 변환 메뉴 추
가하기
 ID
: ID_CH2_CMY2RGB_GS
2주차 - 디지털영상처리의개념
112
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간

CMY컬러 공간  RGB 컬러 공간 변환 메뉴 함
수 연결하기
2주차 - 디지털영상처리의개념
113
영상처리 – 컬러 공간 분석
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 );
114
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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;
} }
118
2주차 - 디지털영상처리의개념
}
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간


RGB 컬러 공간  CMYK 컬러 공간
CMYK 컬러 공간  RGB 컬러 공간
 해보기 (다음 주까지 작성 후 가져오기)
2주차 - 디지털영상처리의개념
119
영상처리 – 컬러 공간 분석
다른 컬러 공간

HSL, HLS 컬러 공간
 HIS의
유사하며, 다양한 공식이 사용됨
 pp.168 표 2.2 다양한 HSL관련 실제 사용 공간
 다양한
컬러 공간 변환을 비롯한 영상분야는 보다 더
빨리 보다 더 좋은 결과를 위해 최적화가 이루어짐
 절대적인 최상의 방법은 없음

특정 분야에 특화된 것이 존재함
2주차 - 디지털영상처리의개념
120
영상처리 – 컬러 공간 분석
다른 컬러 공간

HSL, HLS 컬러 공간
소프트웨어 혹은 환경
공간명
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
2주차 - 디지털영상처리의개념
121
영상처리 – 컬러 공간 분석
다른 컬러 공간

HSL, HLS 컬러 공간
 페이지 169 ~ 172
 RGB 컬러 공간  HLS 컬러 공간 변환
 HLS 컬러 공간  RGB 컬러 공간 변환
 페이지 173~177
 RGB 컬러 공간  HSL 컬러 공간 변환
 HSL 컬러 공간  RGB 컬러 공간 변환
2주차 - 디지털영상처리의개념
122
영상처리 – 컬러 공간 분석
다른 컬러 공간

YIQ 컬러 모델


YIQ 모델은 TV 방송국에서 사용하는 모델이다. 만약 RGB 컬러
모델을 이용해서 TV 영상 전파를 보낸다면, 가정에서 이를 받아
흑백 TV로 시청한다고 할 경우, 다시 밝기를 나타내는 명암도 값
을 계산해야 하는 번거로움이 있다. 따라서 이러한 번거로움을
피하고, 가정용의 TV가 흑백이든 칼라이든 상관없이 사용하기
위해 사용된다.
YIQ 모형은 다음 식에 의해 변환될 수 있다. 또한 반대로 YIQ 모
델을 RGB 모델로 역변환 가능
2주차 - 디지털영상처리의개념
123
영상처리 – 컬러 공간 분석
다른 컬러 공간
 YIQ
컬러 모델 변환 식
2주차 - 디지털영상처리의개념
124
영상처리 – 컬러 공간 분석
다른 컬러 공간
 YIQ에서
Y는 명암도(luminance), I, Q는 색에 관련된
정보인 색상(hue)과 채도(saturation) 정보를 나타낸
다. 흑백 TV인 경우 영상신호에서 Y만을 취해 흑백화
면을 만들고 컬러 TV인 경우에는 세 신호 모두를 이용
해서 RGB 컬러값을 만듬

장점
 YIQ 모델의 사용시, 밝기를 나타내는 Y 정보인 명암도를
바로 사용 가능
 히스토그램 평활화와 같은 영상처리나 컬러 영상의 유화
처리 등에 색상 모델의 변환없이 그대로 사용이 가능
 또한 사람의 눈은 밝기값에 민감한 특징을 보인다. 따라
서 영상신호 전송 시, 민감한 Y값은 덜 압축하고, 둔감한
I, Q의 정보는 많은 압축을 사용해서 신호 전송의 효율성
을 높일 수 있다
2주차 - 디지털영상처리의개념
125
영상처리 – 컬러 공간 분석
다른 컬러 공간

YIQ 컬러 모델 예제
2주차 - 디지털영상처리의개념
126
영상처리 – 컬러 공간 분석
다른 컬러 공간

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주차 - 디지털영상처리의개념
127
영상처리 – 컬러 공간 분석
다른 컬러 공간

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
영상처리 – 컬러 공간 분석
다른 컬러 공간
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
영상처리 – 컬러 공간 분석
다른 컬러 공간

RGB  YIQ 컬러 공간 변환하기 위한 메뉴 추가
 CXIMAGE

ID : ID_CH2_SPLIT2YIQ_CXIMAGE
 VisualGS

ID : ID_CH2_SPLIT2YIQ_GS
2주차 - 디지털영상처리의개념
130
영상처리 – 컬러 공간 분석
다른 컬러 공간

RGB  YIQ 컬러 공간 변환 메뉴에 함수 연결하기
(연동시킨 함수 연결하기)
2주차 - 디지털영상처리의개념
131
영상처리 – 컬러 공간 분석
다른 컬러 공간

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주차 - 디지털영상처리의개념
132
영상처리 – 컬러 공간 분석
다른 컬러 공간
// copy & paste
pDoc->CopyClipBoard(newY);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
pDoc->CopyClipBoard(newI);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
pDoc->CopyClipBoard(newQ);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
133
영상처리 – 컬러 공간 분석
다른 컬러 공간

RGB  YIQ 컬러 공간 변환 메뉴에 함수 연결하기
2주차 - 디지털영상처리의개념
134
영상처리 – 컬러 공간 분석
다른 컬러 공간

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주차 - 디지털영상처리의개념
135
영상처리 – 컬러 공간 분석
다른 컬러 공간
// 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);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
CxImage *newQ = cColor.GS_gray2CxImage(Q, height, width);
pDoc->CopyClipBoard(newQ);
((CFirstCxImageApp *)AfxGetApp())->OnEditPaste();
2주차 - 디지털영상처리의개념
136
영상처리 – 컬러 공간 분석
다른 컬러 공간
// 메모리 해제
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
cColor.GS_free2D(
red, height );
green, height );
blue, height );
Y, height );
I, height );
Q, height );
free(newY);
free(newI);
free(newQ);
Invalidate( FALSE );
}
2주차 - 디지털영상처리의개념
137
영상처리 – 컬러 공간 분석
다른 컬러 공간

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
138
width);
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
영상처리 – 컬러 공간 분석
다른 컬러 공간

YIQ  RGB 컬러 공간 변환을 위한 메뉴 추가하
기
 ID
: ID_CH2_YIQ2RGB_GS
2주차 - 디지털영상처리의개념
140
영상처리 – 컬러 공간 분석
다른 컬러 공간

YIQ  RGB 컬러 공간 변환의 메뉴에 함수 추가
하기
2주차 - 디지털영상처리의개념
141
영상처리 – 컬러 공간 분석
다른 컬러 공간

YIQ  RGB 컬러 공간 변환의 함수 구현하기
void CFirstCxImageView::OnCh2Yiq2rgbGs()
{ CFirstCxImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BYTE **red;
double **Y;
int height = 0;
CColor cColor;
BYTE **green;
double **I;
int width = 0;
BYTE **blue;
double **Q;
// 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주차 - 디지털영상처리의개념
142
영상처리 – 컬러 공간 분석
다른 컬러 공간
// 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주차 - 디지털영상처리의개념
143
영상처리 – 컬러 공간 분석
다른 컬러 공간

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
영상처리 – 컬러 공간 분석
다른 컬러 공간
 YCrCb


컬러 변환 식
이 128은 8비트에서의 0~255 범위를 갖기 위해 더해주는 요소값
역변환 공식
2주차 - 디지털영상처리의개념
145
영상처리 – 컬러 공간 분석
다른 컬러 공간
 YCrCb
컬러 예제
2주차 - 디지털영상처리의개념
146
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간




RGB 컬러 공간  YUV 컬러 공간
YUV 컬러 공간  RGB 컬러 공간
RGB 컬러 공간  YCbCr 컬러 공간
YCbCr 컬러 공간  RGB 컬러 공간
 해보기 (다음 주까지 작성 후 가져오기)
2주차 - 디지털영상처리의개념
147
영상처리 – 컬러 공간 분석
다른 컬러 공간

YCrCb 컬러 공간
 페이지 179 ~ 181
 RGB 컬러 공간  YCrCb 컬러 공간 변환
 YCrCb 컬러 공간  RGB 컬러 공간 변환
2주차 - 디지털영상처리의개념
148
영상처리 – 컬러 공간 분석
구현해보자.

각 컬러 공간들의 변환을 구현해보자.
 CColor
라는 클래스를 만들기
 클래스를 분석해보자.
2주차 - 디지털영상처리의개념
149
영상처리 – 컬러 공간 분석
구현해보자.

선언한 클래스를 현재 구현한 프로그램에 연결
해보자.
 메뉴를
추가하기
 추가된 메뉴에 함수를 연결하자.
 함수에 각 클래스의 내용을 연결하여 출력하자.
2주차 - 디지털영상처리의개념
150
영상처리 – 컬러 공간 분석
구현해보자.

다음 메뉴를 추가하고 이를 구현하고자 함.
2주차 - 디지털영상처리의개념
151
영상처리 – 컬러 공간 분석
구현해보자.
각





메뉴의 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
영상처리 – 컬러 공간 분석
구현해보자.

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);
153
2주차 - 디지털영상처리의개념
영상처리 – 컬러 공간 분석
구현해보자.


소스 상에서 다음 추가하기
#define VIEWER_BACK_GROUND 200
2주차 - 디지털영상처리의개념
154
영상처리 – 컬러 공간 분석
구현해보자.
/*====================================
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
영상처리 – 컬러 공간 분석
구현해보자.
/** 명암도 영상을 가져온다.*/
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
영상처리 – 컬러 공간 분석
구현해보자.
// 인수종속적 오류나는 이유로 직접 메모리 할당
*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
영상처리 – 컬러 공간 분석
구현해보자.
/** 원 컬러 영상, 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
영상처리 – 컬러 공간 분석
구현해보자.
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
영상처리 – 컬러 공간 분석
구현해보자.
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
영상처리 – 컬러 공간 분석
구현해보자.

COMPARE > RGB->gray 메뉴에 함수 연결하기
2주차 - 디지털영상처리의개념
161
영상처리 – 컬러 공간 분석
구현해보자.

나머지도 구현해보자.




COMPARE
COMPARE
COMPARE
COMPARE
>
>
>
>
RGB->HSL
RGB->CMY(K)
RGB->YUV
RGB->YIQ
2주차 - 디지털영상처리의개념
162
영상처리 – 컬러 공간 분석
레포트 -2
컬러 표현 클래스
 클래스(color.cpp,
color.h)를 분석하여 커멘트를 달
기 – 파일은 홈페이지의 강의 노트에 올려둠
 제출일
 다음 주 수업 전날 밤 12시까지
 제출시 주의 사항





제목 : 레포트2_자신의학과학번이름
이름 : 자신의 이름
파일 첨부를 통해서 올려주세요.
소스와 분석 커멘트를 다음의 파일명에 담아서 다음의 파일
명으로 저장하고 파일첨부를 통해서 올리기
파일 명 : 레포트2_자신의학과학번이름.hwp
2주차 - 디지털영상처리의개념
163