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

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

Number Recognizer. Team 이성우 컴퓨터소프트웨어학과 조윤성 전자통신공학과
Image Processing 이 뛰어남 존 놀과 토마스 놀 두 형제에 의해 탄생 1990 년 Adobe 사가 상업화 시킴 Web 디자인, 사진합성, 영화 특수 효과 등 컴퓨터 그래픽 전반에 걸쳐 널리 사용됨 비트맵 방식 이미지 프로세싱 Web 디자인 비중이 커지면서.
컴퓨터와 인터넷.
재료수치해석 HW # 박재혁.
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성
02장 ㅎㅎ 디지털 영상 빛과 색, 시각 컬러 모델 디지털 영상의 생성 디지털 영상의 종류 한빛미디어(주)
적분방법의 연속방정식으로부터 Q=AV 방정식을 도출하라.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
색좌표 변환기의 설계 예 색좌표(Color Space) 색의 수학적인 표현 방법 RGB YIQ, YUV, YCbCr CMYK
제 1 장 영상처리 기초.
Entity Relationship Diagram
아두이노 센서의 연결 디지털 및 아날로그 센서값의 특징 디지털 센서 핀 구조 및 연결하기 아날로그 센서 핀 구조 및 연결하기
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
02장 ㅎㅎ 디지털 영상 빛과 색, 시각 컬러 모델 디지털 영상의 생성 디지털 영상의 종류 한빛미디어(주)
#include <stdio.h> int main(void) { float radius; // 원의 반지름
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
그래픽 컬러처리.
컴퓨터 프로그래밍 기초 [Final] 기말고사
디지털영상처리 및 실습 대구보건대학 방사선과.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Error Detection and Correction
멀티미디어 시스템 (아날로그 이미지,신호를 디지털로 변환 방법) 이름 : 김대진 학번 :
4.1 색채 과학 4.2 영상에서의 칼라 모델들 4.3 동영상에서의 칼라 모델들
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
컴퓨터 프로그래밍 : 실습3 2장 데이터와 식.
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
색의 인식 ~ 빛(light): 전자기파(electromagnetic wave)
11장. 1차원 배열.
13. 연산자 오버로딩.
(생각열기) 옷가게에서 옷을 살 때와 옥가게 밖으로 나와 서 옷을 볼 때 옷 색이 달라져 보이는 이유는?
Method & library.
JA A V W. 03.
영상처리 실습 인공지능연구실.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
TFT-LCD 구조 동작원리 응용분야.
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
4 넷째마당.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
색체 인식과 영상 장치 빛의 합성과 색체 인식 백색광 ex) 햇빛, 형광등, 백열등
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
Clipping 이진학.
PSD센서 명령어 이해하기 목차 재료준비 및 브레드 보드 배선 구성하기 PSD센서 명령어 이해 및 실습 응용 작품 만들기.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
보 색 COMPLEMENTARY COLOR.
객체기반 SW설계 팀활동지 4.
(생각열기) 축구장의 전광판에 사용되는 LED에서 나오 는 빛의 3원색은 무엇인가?
Window, Viewport Window, Viewport.
에어 PHP 입문.
빛 의 합 성 과 학 1 학년 Ⅱ. 빛 > 2. 빛의 색( 8/8 ) [초기 화면]
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
영상처리 실습 (OpenCV + MFC) Chonbuk National University A.I. Lab.
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법
2일차 영상처리 교육.
3. 모듈 (5장. 모듈).
04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법
영상처리 기초.
2장. 페인트샵을 이용한 영상처리 맛보기 신라대학교 임은경 2주차 - 페인트샵을 이용한 영상처리 맛보기.
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수
학습목표 10색상환에 있는 색 이름을 알고 생활 주변의 대상에서 찾아볼 수 있다..
영역 기반 처리.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
7 생성자 함수.
BoardGame 보드게임 따라가기.
Presentation transcript:

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

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

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

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

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

RGB 컬러 공간과 명암도 영상 변환 RGB 모델은 빛의 삼원색을 이용한 모델이다. 빨간(red), 파랑(blue), 녹색(green)의 세가지 기본 칼라의 조합을 이용해서 칼라를 표현한다. (그림 2.4, 그림 2.5, 그림 2.6, 그림 2.7) RGB 모델은 다음 그림과 같이 R, G, B를 나타내는 3차원 좌표계로 표현됨 좌표점 (0, 0, 0)은 검은색을 나타내며, (1, 1, 1)은 흰색을 나타내며, 검은색과 흰색을 연결하는 대각선은 빨간, 파랑, 녹색의 세 가지 색이 동등한 비율로 혼합된 색으로 흑백영상의 광도를 가짐 각각의 좌표계는 빨간, 파랑, 녹색이 합해지는 비율에 따라 다양한 색이 표현됨 2주차 - 디지털영상처리의개념

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

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

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

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

RGB 컬러 공간과 명암도 영상 변환 클래스에 메소드 추가하기 void CColor::GS_rgb2gray(BYTE ***gray, int method, BYTE **red, BYTE **green, BYTE **blue, int height, int width) BYTE **CColor:::GS_alloc2D(int height, int width) BYTE **CColor::GS_alloc2D(int height, int width, BYTE value) CxImage *CColor::GS_gray2CxImage(BYTE **image, int height, int width) void CColor::GS_free2D(BYTE **image, int length) 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue, int *height, int *width) void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue) 헤더 파일 추가하기 #include <stdio.h> #include <stdlib.h> #include <math.h> 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 구현하기 메모리 할당하는 함수 /** 2차원 메모리 할당 - BYTE */ BYTE** CColor::GS_alloc2D(int height, int width) { return GS_alloc2D(height, width, 0); } BYTE **CColor::GS_alloc2D(int height, int width, BYTE value) BYTE **image; image = (BYTE **)calloc(height, sizeof(BYTE *)); for(int i=0; i<height; i++) 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 { image[i] = (BYTE *)calloc(width, sizeof(BYTE)); } if( value > 0 ) for(i=0; i<height; i++) for(int j=0; j<width; j++) image[i][j] = (BYTE)value; return image; 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 /*명암도 영상을 CxImage 타입으로 변환한다. */ CxImage *CColor::GS_gray2CxImage(BYTE **image, int height, int width) { int bitPixels = 8; // 8이면 명암도 CxImage *cxGray = new CxImage(); cxGray->CreateFromMatrix( image, width, height, bitPixels, width*bitPixels, 0); return cxGray; } 2주차 - 디지털영상처리의개념

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

RGB 컬러 공간과 명암도 영상 변환 /** RGB를 가져온다 */ void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue) { int height, width; GS_getRGB(m_pImage, red, green, blue, &height, &width); } void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue, int *height, int *width) RGBQUAD color; *height = m_pImage->GetHeight(); *width = m_pImage->GetWidth(); 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 *red = (BYTE **)GS_alloc2D( *height, *width ); *green = (BYTE **)GS_alloc2D( *height, *width ); *blue = (BYTE **)GS_alloc2D( *height, *width ); for(int i=0; i<*height; i++) { for(int j=0; j<*width; j++) { color = m_pImage->GetPixelColor(j, i); (*red)[i][j] = color.rgbRed; (*green)[i][j] = color.rgbGreen; (*blue)[i][j] = color.rgbBlue; } 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 RGB컬러 공간을 명암도 영상으로 변환 void Ccolor::GS_rgb2gray(BYTE ***gray, int method, BYTE **red, BYTE **green, BYTE **blue, int height, int width) { if( method < 0 || method > 4 ) return; *gray = (BYTE **)GS_alloc2D( height, width ); for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { switch( method ) { case 1 : (*gray)[i][j] = (BYTE)( red[i][j]*0.2999 + green[i][j]*0.587 + blue[i][j]*0.114 ); break; 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 case 2 : (*gray)[i][j] = (BYTE)( ( red[i][j] + green[i][j] + blue[i][j] )/3.0 ); break; case 3 : (*gray)[i][j] = green[i][j]; case 4 : (*gray)[i][j] = (BYTE)( sqrt( pow(red[i][j],2) + pow(green[i][j],2) + pow(blue[i][j],2))/sqrt(3.0) ); case 5 : (*gray)[i][j] = (BYTE)( red[i][j]*0.212671 + green[i][j]*0.715160 + blue[i][j]*0.071169 ); } 2주차 - 디지털영상처리의개념

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

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

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

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

RGB 컬러 공간과 명암도 영상 변환 함수 구현하기 void CFirstCxImageView::OnCh2Rgb2grayCximage() { // 도큐먼트 클래스에 있는 m_pImage를 가져오기위해 참조 호출한다. CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // GrayScale() 함수 호출 pDoc->m_pImage->GrayScale(); CString str; str.Format("명암도 영상 변환 from %s",pDoc->GetTitle()); pDoc->SetTitle(str); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

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

RGB 컬러 공간과 명암도 영상 변환 함수 구현하기 void CFirstCxImageView::OnCh2Rgb2grayGs() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); BYTE **red; BYTE **green; BYTE **blue; BYTE **gray; int height = 0; int width = 0; int method = 1; CColor cColor; // RGB를 가져온다. cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 // RGB to Gray cColor.GS_rgb2gray(&gray, 1, red, green, blue, height, width); CxImage *newG = cColor.GS_gray2CxImage(gray, height, width); pDoc->CopyClipBoard(newG); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); cColor.GS_rgb2gray(&gray, 2, red, green, blue, height, width); newG = cColor.GS_gray2CxImage(gray, height, width); cColor.GS_rgb2gray(&gray, 3, red, green, blue, height, width); 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 명암도 영상 변환 cColor.GS_rgb2gray(&gray, 4, red, green, blue, height, width); newG = cColor.GS_gray2CxImage(gray, height, width); pDoc->CopyClipBoard(newG); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); cColor.GS_rgb2gray(&gray, 5, red, green, blue, height, width); cColor.GS_free2D( red, height ); cColor.GS_free2D( green, height ); cColor.GS_free2D( blue, height ); cColor.GS_free2D( gray, height ); Invalidate( FALSE ); } 2주차 - 디지털영상처리의개념

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

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

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

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

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

RGB 컬러 공간과 각 채널 분리 구현하기 void CFirstCxImageView::OnCh2Split2rgbCximage() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (pDoc->m_pImage==NULL) return; CxImage *newr = new CxImage(); CxImage *newg = new CxImage(); CxImage *newb = new CxImage(); pDoc->m_pImage->SplitRGB(newr,newg,newb);// RGB 분리 pDoc->CopyClipBoard(newr); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); 2주차 - 디지털영상처리의개념

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

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

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

RGB 컬러 공간과 각 채널 분리 구현하기 void CFirstCxImageView::OnCh2Split2rgbGs() { CFirstCxImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if( pDoc->m_pImage == NULL ) return; CColor cColor; BYTE **red; BYTE **green; BYTE **blue; int height = 0; int width = 0; // RGB를 가져온다. cColor.GS_getRGB( pDoc->m_pImage, &red, &green, &blue, &height, &width ); 2주차 - 디지털영상처리의개념

RGB 컬러 공간과 각 채널 분리 CxImage *newr = cColor.GS_gray2CxImage(red, height, width); pDoc->CopyClipBoard(newr); ((CFirstCxImageApp *)AfxGetApp())->OnEditPaste(); CxImage *newg = cColor.GS_gray2CxImage(green, height, width); pDoc->CopyClipBoard(newg); CxImage *newb = cColor.GS_gray2CxImage(blue, height, width); pDoc->CopyClipBoard(newb); 2주차 - 디지털영상처리의개념

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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; 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 */ *r = (1.0-s)/3.0; 2주차 - 디지털영상처리의개념

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CMY(K) 컬러 공간 CMY  RGB 컬러 공간 변환하기 위해 필요한 클래스 void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue, int *height, int *width); void CColor::GS_getRGB(CxImage *m_pImage, BYTE ***red, BYTE ***green, BYTE ***blue); CxImage *GS_color2CxImage(BYTE **image1,BYTE **image2, BYTE **image3, int height, int width); void GS_free2D(BYTE **image, int length); void GS_rgb2cmy(BYTE ***cyan, BYTE ***magenta, BYTE ***yellow, BYTE **red, BYTE **green, BYTE **blue, int height, int width); 구현되어 있음 void GS_cmy2rgb(BYTE **red, BYTE **green, BYTE **blue, BYTE **cyan, BYTE **magenta, BYTE **yellow, int height, int width); 2주차 - 디지털영상처리의개념

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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