Upload
michael-stokes
View
68
Download
0
Embed Size (px)
DESCRIPTION
2 장 . 컬러 공간 분석. 임은경. 차례 및 목적. 차례 컬러 공간에 대한 이야기 RGB 컬러 공간과 명암도 영상 변환 HIS 컬러 공간 CMY(K) 컬러 공간 다른 컬러 공간 HLS, HSL 컬러 공간 YCbCr, YUB, YIQ 컬러 공간 Visual C++ 구현과 CxImage 제공 함수 비교. 컬러 공간에 대한 이야기. 컬러와 컬러공간의 관계 컬러 공간 - PowerPoint PPT Presentation
Citation preview
2 주차 - 디지털영상처리의개념 1
2 장 . 컬러 공간 분석
임은경
영상처리 – 컬러 공간 분석
2 주차 - 디지털영상처리의개념2
차례 및 목적 차례
컬러 공간에 대한 이야기 RGB 컬러 공간과 명암도 영상 변환 HIS 컬러 공간 CMY(K) 컬러 공간 다른 컬러 공간
HLS, HSL 컬러 공간 YCbCr, YUB, YIQ 컬러 공간
Visual C++ 구현과 CxImage 제공 함수 비교
영상처리 – 컬러 공간 분석
컬러 공간에 대한 이야기 컬러와 컬러공간의 관계
컬러 공간 개별 컬러들의 상대적인 위치를 나타내는 컬러 좌표계 9color
coordinates system) 을 표현하는 2 차원 또는 3 차원 공간을 의미함
컬러 표현 시스템 (color representation system), 컬러 모델(color model) 로도 사용함
모니터에서 사용하는 컬러의 개념 , 프린터에 사용되는 화려한 컬러의 개념 모니터에서는 RGB 채널 구조
빛의 삼원색 인쇄소에서는 CMY(K) 채널 구조
빛의 반사를 기반으로 둔 감원색2 주차 - 디지털영상처리의개념
3
영상처리 – 컬러 공간 분석
컬러 공간에 대한 이야기
2 주차 - 디지털영상처리의개념4
가산 색 모형 감산 색 모형
RGB 컬러 모형 CMY 컬러 모형
영상처리 – 컬러 공간 분석
컬러 공간에 대한 이야기 인간의 시각 시스템 – 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 recover
2 주차 - 디지털영상처리의개념22
영상처리 – 컬러 공간 분석
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 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
영상처리 – 컬러 공간 분석
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; BYTE **green; BYTE **blue;int height = 0; int width = 0;
// 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
ID : ID_CH2_SPLIT2HSI_GS2
2 주차 - 디지털영상처리의개념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; 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
영상처리 – 컬러 공간 분석
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( blue, height );cColor.GS_free2D( hue, height );cColor.GS_free2D( saturation, height );cColor.GS_free2D( intensity, height );
Invalidate( FALSE );}
2 주차 - 디지털영상처리의개념67
영상처리 – 컬러 공간 분석
HIS 컬러 공간 메뉴 만들기
Split to HIS VisualGS1
ID : ID_CH2_SPLIT2HSI_GS1 VisualGS2
ID : ID_CH2_SPLIT2HSI_GS2
2 주차 - 디지털영상처리의개념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];b = (double)blue[m][n];
2 주차 - 디지털영상처리의개념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; 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
영상처리 – 컬러 공간 분석
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( blue, height );cColor.GS_free2D( hue, height );cColor.GS_free2D( saturation, height );cColor.GS_free2D( 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; }
2 주차 - 디지털영상처리의개념81
영상처리 – 컬러 공간 분석
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; } }
2 주차 - 디지털영상처리의개념83
영상처리 – 컬러 공간 분석
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, height,
bitPixels, width*bitPixels, 0);
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 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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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 = (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
영상처리 – 컬러 공간 분석
HIS 컬러 공간 메뉴 추가하기
2 주차 - 디지털영상처리의개념93
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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
영상처리 – 컬러 공간 분석
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 **green, BYTE **blue, int height, int width);
2 주차 - 디지털영상처리의개념101
영상처리 – 컬러 공간 분석
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 **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
영상처리 – 컬러 공간 분석
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 width);
2 주차 - 디지털영상처리의개념109
영상처리 – 컬러 공간 분석
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 CMYcColor.GS_rgb2cmy( &cyan, &magenta, &yellow, red, green, blue,
height, width );
2 주차 - 디지털영상처리의개념114
영상처리 – 컬러 공간 분석
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;
} }
}
2 주차 - 디지털영상처리의개념118
영상처리 – 컬러 공간 분석
CMY(K) 컬러 공간 RGB 컬러 공간 CMYK 컬러 공간 CMYK 컬러 공간 RGB 컬러 공간
해보기 ( 다음 주까지 작성 후 가져오기 )
2 주차 - 디지털영상처리의개념119
영상처리 – 컬러 공간 분석
다른 컬러 공간 HSL, HLS 컬러 공간
HIS 의 유사하며 , 다양한 공식이 사용됨 pp.168 표 2.2 다양한 HSL 관련 실제 사용 공간
다양한 컬러 공간 변환을 비롯한 영상분야는 보다 더 빨리 보다 더 좋은 결과를 위해 최적화가 이루어짐
절대적인 최상의 방법은 없음 특정 분야에 특화된 것이 존재함
2 주차 - 디지털영상처리의개념120
영상처리 – 컬러 공간 분석
다른 컬러 공간 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
영상처리 – 컬러 공간 분석
다른 컬러 공간 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
영상처리 – 컬러 공간 분석
다른 컬러 공간 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
영상처리 – 컬러 공간 분석
다른 컬러 공간 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 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
영상처리 – 컬러 공간 분석
다른 컬러 공간
// copy & pastepDoc->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 : 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
영상처리 – 컬러 공간 분석
다른 컬러 공간// 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
영상처리 – 컬러 공간 분석
다른 컬러 공간// 메모리 해제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
영상처리 – 컬러 공간 분석
다른 컬러 공간 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
영상처리 – 컬러 공간 분석
다른 컬러 공간 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; 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
영상처리 – 컬러 공간 분석
다른 컬러 공간// 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
영상처리 – 컬러 공간 분석
다른 컬러 공간 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);2 주차 - 디지털영상처리의개념
153
영상처리 – 컬러 공간 분석
구현해보자 . 소스 상에서 다음 추가하기 #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 > RGB->HSL COMPARE > RGB->CMY(K) COMPARE > RGB->YUV COMPARE > RGB->YIQ
2 주차 - 디지털영상처리의개념162
영상처리 – 컬러 공간 분석
레포트 -2- 컬러 표현 클래스
클래스 (color.cpp, color.h) 를 분석하여 커멘트를 달기 – 파일은 홈페이지의 강의 노트에 올려둠
제출일 다음 주 수업 전날 밤 12 시까지
제출시 주의 사항 제목 : 레포트 2_ 자신의학과학번이름 이름 : 자신의 이름 파일 첨부를 통해서 올려주세요 .
소스와 분석 커멘트를 다음의 파일명에 담아서 다음의 파일명으로 저장하고 파일첨부를 통해서 올리기
파일 명 : 레포트 2_ 자신의학과학번이름 .hwp
2 주차 - 디지털영상처리의개념163