수학에서 기본 개념을 이해한다는 것

수학 이야기 2013. 3. 13. 21:22

수학에서 기본개념이 중요하다 공식보다 원리가 중요하다고들 합니다.


왜 중요할까요.


예를 들어, 한 사람은 어떤 문제에 대한 기본 개념과 원리는 잘 알지만 막상 문제 풀이법은 잘 모릅니다. 다른 한 사람은 개념이나 원리는 잘 모르지만 주어진 문제는 잘 풀수 있습니다.


조금 극단적인 예이긴 하지만 앞 사람의 경우가 낫다는 것은 다들 동감하리라 생각합니다.


세상에는 주어진 문제를 풀 수 있는 사람은 많습니다. 하지만 어떤 문제를 관통하는 원리나 개념을 창조적으로 활용할 수 있는 사람은 많지 않습니다. 사실 문제 풀이법은 잘 몰라도 됩니다. 문제가 뭐라는 것만 알면 요즘은 인터넷을 찾아보면 왠만한 문제는 모두 해결할 수 있으며 계산기나 컴퓨터로 할 수 있는 일이 대부분입니다. 예를 들어, 표준편차를 어떻게 구하는지 아는건 그다지 중요치 않습니다. 표준편차가 무엇이고 어떻게 활용되는지만 알고 있으면 됩니다.


수학 문제만의 얘기는 아닙니다. 사회적, 과학적 문제나 현상들에 대해 깊이 생각하고 이해하려 하다 보면 남들이 하지 못한 새로운 것들을 할 수 있을 것이라 생각합니다.


저도 바쁘다 보면 대충 풀이법만 익히고 넘어가는 경우가 종종 있습니다. 시험 전날 특히 이렇죠^^. 급하다고 넘어가지 말고 수학이든 무엇이든 시간을 가지고 바라보는, 좀더 사색하는 시간을 가지면 어떨까 해서 몇자 적어보았습니다.


by 다크 프로그래머

OpenCV 핸드북 (cheatsheet)

프로그래밍/opencv 2013. 2. 27. 18:47

제가 개인적 참고용으로 만든 opencv 함수들 사용법 목록입니다. 간단한 함수라 하더라도 함수이름이나 사용법이 잘 기억나지 않을 때가 종종 있습니다. 한 부 출력해 놓고 이럴 때 보면 꽤 유용합니다.


1. 이미지 읽기 & 저장

2. 이미지 생성, 복사, 형변환, 색상변환, roi 설정

3. 행렬 원소접근 및 생성초기화

4. 영상 크기변경 및 상하좌우 반전

5. 이미지에 그리기 (drawing)

6. 이미지 디스플레이하기 (display)

7. 웹캠 연결하기

8. avi 비디오 파일 읽어오기

9. avi 비디오 녹화하기

10. 창에 Trackbar 붙이기



1. 이미지 읽기 & 저장

Mat img_color = imread("sample.jpg"); // color load

Mat img_gray = imread("sample.jpg", 0);    // gray load

Mat img_16bit = imread("sample.jpg", cv::IMREAD_ANYDEPTH);  // 원본 depth로 읽기

imwrite("fname.jpg", img);


2. 이미지 생성, 복사, 형변환, 색상변환, roi 설정

int w = 320;// width

int h = 240;// height


// 생성

Mat img(h,w,CV_8UC1);//1채널 unsigned char

Mat img(h,w,CV_8UC3);//3채널 unsigned char

Mat img = Mat::zeros(h,w,CV_32FC1);//1채널 float

Mat img = Mat::ones(h,w,CV_64FC3);//3채널 double


unsigned char * img_buffer;// 이미지버퍼 포인터

Mat img(h, w, CV_8UC3, img_buffer);//메모리 공유


// 타입 만들기

CV_MAKETYPE(CV_32F, 3);    // CV_32FC3


// 원소 초기화

Mat img(h,w,CV_8UC1);

img = Scalar(3); // img 모든 원소값 3으로 초기화


// 참조, 복사

Mat img2 = img; // 메모리 공유

Mat img2 = img.clone(); // 별도 메모리

Mat img2; img.copyTo(img2);//별도 메모리


// 형변환 복사

Mat img1(h,w,CV_32FC1);

Mat img2;

img1.convertTo(img2, CV_8U);


// gray-color 변환

cvtColor(color, gray, CV_BGR2GRAY);

cvtColor(gray, color, CV_GRAY2BGR);


// roi 설정

Rect roi;

Mat sub_img = img(roi);//메모리공유

Mat sub_img = img(roi).clone();//별도메모리


3. 행렬 원소접근 및 생성초기화

Mat A = (Mat_<int>(3,1) << 1, 2, 3);

Mat B = (Mat_<double>(3,2) << 1, 1, 2, 2, 3, 3); // 첫 번째 행부터 채워짐

A.at<int>(2,0) = 3; // .at<type>(y, x)

B.at<double>(2,1) = -0.1;


Mat C(h, w, CV_8UC3);

C.at<Vec3b>(y, x)[0]; // blue

C.at<Vec3b>(y, x)[1]; // green 

C.at<Vec3b>(y, x)[2]; // red


4. 영상 크기변경 및 상하좌우 반전

// 크기 변경

Mat dst;

resize(img, dst, Size(new_w,new_h));

resize(img, dst, Size(), 0.5, 0.5);//scalex, scaley


// 영상 반전(flip)

flip(img, dst, 0);// vertical flip

flip(img, dst, 1);// horizontal flip

flip(img, dst, -1);// vertial & horizontal flip


5. 이미지에 그리기 (drawing)

Rect rc(x,y,w,h);

Scalar color(B,G,R);

int thickness=1; // line thickness


line(img, Point(x1,y1), Point(x2,y2), color, thickness);


rectangle(img, rc, color, thickness);

rectangle(img, rc.tl(), rc.br(), color, thickness);

rectangle(img, rc, color, CV_FILLED); // filled rectangle


Point center(rc.x+rc.width/2, rc.y+rc.height/2);

Size radius(rc.width/2, rc.height/2);

double rot_deg = 0; // rotation of ellipse

double s_deg = 0; // start angle of arc

double e_deg = 360; // end angle of arc

ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,thickness);

ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,CV_FILLED);


int circle_radius = 10;

circle(img, center, circle_radius, color, thickness);

circle(img, center, circle_radius, color, CV_FILLED);


putText(img, "text", Point(x,y), FONT_HERSHEY_SIMPLEX, 1., color, thickness);

putText(img, "text", Point(x,y), FONT_HERSHEY_DUPLEX, 1., color, thickness);


6. 이미지 디스플레이하기 (display)

namedWindow("name"); // auto resized

namedWindow("name",CV_WINDOW_NORMAL); // manual resize


imshow("name", img);

char ch = waitKey(); // 무한 대기

char ch = waitKey(10); // 10 msec 대기

if(ch == 27) ... // ESC key

if(ch == 32) ... // SPACE key


destroyWindow("name");

destroyAllWindows();


7. 웹캠 연결하기

VideoCapture vc(0);

if (!vc.isOpened()) return; // 연결실패

vc.set(CV_CAP_PROP_FRAME_WIDTH, 640);

vc.set(CV_CAP_PROP_FRAME_HEIGHT, 480);


Mat img;

while(1){

vc >> img;

if(img.empty()) break;

imshow("cam",img);

if(waitKey(10)==27) break; //ESC

}

destroyAllWindows();


8. avi 비디오 파일 읽어오기

VideoCapture vc("sample.avi");

if (!vc.isOpened()) return; // 불러오기 실패


Mat img;

while(1){

vc >> img;

if(img.empty()) break;

imshow("video",img);

if(waitKey(10)==27) break; //ESC

}

destroyAllWindows();

9. avi 비디오 녹화하기

double fps = 15;

int fourcc = CV_FOURCC('X','V','I','D'); // codec (opencv3.0이하)

int fourcc = VideoWriter::fourcc('X','V','I','D'); // opencv3.0이상


bool isColor = true;


VideoWriter *video = new VideoWriter;

if(!video->open("result.avi", fourcc, fps, Size(img_w, img_h), isColor)){

delete video;

return;

}


Mat img;

while(1){

// ...

*video << img;

// ...

}

delete video;


※ 코덱 목록: http://www.fourcc.org/codecs.php


10. 창에 Trackbar 붙이기

int threshold = 10;

cv::namedWindow("display");

cv::createTrackbar("thr:", "display", &threshold, 1000);


11. 다운로드


OpenCV핸드북v1.txt



참고로 영상처리 라이브러리인 OpenCV 공식 홈페이지에서 제공하는 cheatsheet라는게 있습니다. opencv 함수 사용법을 요약해 놓은 2페이지짜리 pdf 파일입니다.


by 다크 프로그래머

미분 적분 제대로 알자

수학 이야기 2013. 2. 26. 19:27

미분과 적분, 줄여서 미적분...

미적분이 중요하다고는 하지만 과연 얼마나 많은 이들이 미분 적분의 의미를 제대로 이해하면서 사용하고 있을지 모르겠다.


이 글은 미분 적분에 대한 가장 기본적인 개념에 대한 내용이다. 하지만, 이 글의 내용만 잘 이해하고 알고 있어도 미분 적분은 더 이상 암호학이 아니게 될 것이라 생각한다. 무슨 미분 적분에 대한 문제 풀이법을 설명하려는 게 아니다. 그런 건 차후의 문제이다. 미분 적분이 무엇인지 이해해 보자는 것이고 최소한 이 정도는 알고 문제를 풀자는 것이다.


1. 적분의 이해


적분하면 아마도 다음과 같은 식이 떠오를 것이다.



그럼 이게 무슨 뜻인지 하나 하나 해부해 보도록 하자. 이게 무슨 뜻인지만 다 알아도 사실 적분을 거의 이해한 것이나 마찬가지다.


그 뜻은, "x를 a부터 b까지 변화시키면서 f(x)에 dx를 곱한 것을 전부 합쳐라"라는 의미이다. 결국 다음과 같은 의미이다 (수학적으로 완벽한 수식은 아니다. 단지 개념을 이해하기 위한 것이다).



먼저, 적분기호 는 인티그랄(integral)이라고 읽는데, 잘 보면 영어의 s자를 땡겨 놓은 거랑 비슷하다. 왠지 sum이 떠오르지 않는가? 그렇다. 바로, sum(합치다)의 s를 길게 늘어뜨린 게 적분기호 이다. 참고로, integral의 영어적 의미도 '합치다' 이다.


다음, f(x)dx가 남았는데, f(x)에다가 dx를 곱하라는 말이다. 먼저, f(x)가 의미하는 것을 함수 그래프를 통해 살펴보자


함수값 f(x)는 y = f(x) 그래프에서 x가 x일때의 y값, 즉, 위 그림에서 빨간색 선의 높이(길이)이다.


마지막, dx는 미분에서 나오는 dx랑 같은 말인데, x의 순간적인 변화량이다. dx와 관계된 표현으로 △x ('델타엑스'라고 읽는다)가 있는데 △x는 어떤 구간에서의 x의 변화량을 나타낸다.  만일, x가 x1에서 x2로 값이 변했다면 △x = x2 - x1이다. dx는 △x를 무한히 작은 값으로 보낸 극한에서의 개념이다. 예를 들어, 어떤 직사각형이 있고 이 직사각형의 밑변의 길이가 △x라 하자. 이제 이 직사각형을 세로방향으로 잘라서 둘로 나누자. 그럼 밑변의 길이가 △x/2가 된다. 그런데 이 사각형을 무한히 계속 나눈다면 하나의 기다란 선처럼 될 것이고, 이 선의 밑변의 길이는 0은 아니지만 0에 무한히 가까운 값이 될 것이다. 상상속에서만 존재하는 이 선의 밑변의 길이가 바로 dx이다 (편의상 dx를 길이라고 했지만 dx는 +, - 부호를 갖는 값이다. x가 증가하면 +, 감소하면 -이다. dx의 정확한 표현은 x의 순간변화량이다).


그렇다면, f(x)dx가 의미하는 것은 빨간색 선의 넓이(면적)라는 것이다 (f(x)가 높이, dx가 밑변).


그럼, 이제 다시 원래 적분 식으로 돌아가서 아래 식과 그림을 찬찬히 감상해 보자.





x를 a부터 b까지 변화시키면서 f(x)에다가 dx를 곱해서 합친다...


정적분 식을 보면서 자연스럽게 함수의 면적(그래프 아랫부분 넓이)이 연상된다면 성공이다^^

(만일 그래도 잘 모르겠다면 수학책에서 구분구적법 설명하는 부분을 찬찬히 읽어본 다음에 이 글을 다시 한번 읽어보기 바란다)



혹자는 이런거 굳이 알아서 머하냐 할 수도 있겠다. 천만의 말씀이다. 적분 계산하는 공식만 열심히 외워서 적분 계산만 잘하면 뭐할 것인가? 무슨 뜻인지도 모르고 어디에 써먹는지도 모른다면 말이다.


예를 들어, 위 그림에 나오는 함수 그래프(a부터 b까지 부분)를 x축을 중심으로 회전시켰을 때 나오는 입체도형의 부피를 구하라는 문제가 있다고 하자.




적분의 개념이 잘 잡혀 있다면 위 회전체의 부피를 다음과 같이 계산할 수 있음을 알 수 있을 것이다.



좀 전에는 빨간색 막대 선들을 합치면 되었지만, 이제는 빨간색 원판들을 합치면 원하는 회전체의 부피가 나온다. 이제는 f(x)가 반지름이 되기 때문에 빨간색 원의 넓이는 πf(x)2이고, 여기에 dx를 곱하면 아주 얇은 원판(원기둥)의 부피가 나온다. 이것들을 a에서 b까지 모두 합하면 회전체의 부피 V가 나오는 것이다.


참고로, 고교수학에 보면 무한급수를 정적분으로 고치는 단원이 있는데(적어도 내가 학교 다닐땐 있었다), 겉보기는 무척 복잡하지만 적분의 개념을 이해하고 찬찬히 보면 당연한 얘기임을 알 수 있다.



2. 미분의 이해


적분의 반대말이 미분이다. 적분이 쌓는 거라면 미분은 미세하게 쪼개는 거다. 등등 미분에 대한 여러 가지 말들이 있지만 미분의 가장 정확한 표현은 순간변화율이다.


그렇다면 순간변화율이 무엇인지만 이해하면 미분도 꿰뚫을 수 있다는 말이 된다.


우선, 변화율이 무엇인지 살펴보자. 변화율을 이해하기 위해서는 먼저 변화율이라는 말이 상대적인 개념이라는 것을 알아야 한다. 예를 들어, 'f의 변화율이 3이다'라는 말은 온전한 표현은 아니다.


왜?


무엇에 대한 변화율인지가 빠졌기 때문이다. 예를 들어, 우리가 알고 있는 속도(력)는 시간에 대한 위치변화(이동거리)의 변화율이고, 중학교 때 배우는 직선의 기울기는 x값에 대한 y값의 변화율이다.

즉, 변화율을 말하려면 변화율의 기준이 되는 놈이 있어야 한다는 말이고 이 기준이 뭐냐에 따라서 변화율 값이 의미하는 바가 완전히 달라진다 (속도에도 초속, 분속, 시속이 있음을 상기하자).


이 시점에서, '어라, 미분은 x로 나누는 것 아닌가?' 하는 분도 있을 것이다. 대답은 NO. 우리가 고등학교에서 배우는 대부분의 미분이 x에 대한 y의 변화율이기 때문에 dy/dx를 그냥 y'으로 쓰고는 암묵적으로 'x에 대한 미분이다'라고 하는 것이지, 미분 자체는 어떤 것도 대상으로 할 수 있다. 예를 들어, 얼굴에 느는 주름살의 개수를 나이로 미분하면 나이대별 노화 진행율이 나온다.


아래 식이 미분을 설명하는 가장 근본적인 식이다. 꼭 암기(?)하자!!!



그럼 이제 고교 수학으로 돌아가서 도형의 변화율을 살펴 보자.




먼저, 왼쪽 그림은 기울기가 2인 직선이다. 기울기가 2라는 말은 dy/dx = 2라는 말로서, y 변화량이 x 변화량의 2배라는 말이다. 즉, x가 1 증가하면 y는 2 증가하고, x가 5 증가할 때 y는 10 증가한다는 말이다.


그런데, 오른쪽 곡선 y = f(x)의 경우는 변화율이 어떻게 될까? 직선처럼 변화율이 항상 일정한 것이 아니라 곡선의 경우는 변화율 자체가 계속 변화한다. 순간 순간의 변화율은 계속 변하지만, 어떤 구간에서의 평균적인 변화율은 정의할 수 있다. 여기서 평균변화율 개념이 나온다. 함수 f(x)의 구간 [a, b]에서의 평균변화율은 다음과 같이 주어진다.



△x는 구간에서의 x의 변화량을 나타낼 때 쓰는 표현으로 적분파트에서 이미 설명하였다. 그냥 우리가 보고 느끼고 수치화할 수 있는 x의 변화량은 △x로 표현하고, 상상속의 극한에서의 순간적인 변화량은 dx로 표현한다고 생각하자. 위 평균변화율 예에서, x는 a에서 b로 변했으므로 x의 변화량 △x는 △x = b - a이다.


이제 미분의 원래 정의인 순간변화율에 대해 얘기할 시점이 되었다.


우리는 위 곡선 예에서 구간의 평균변화율이 아닌 모든 x 점에서의 순간변화율을 구하는 것이 목적이다. 즉, x = a에서의 변화율, x = b에서의 변화율, ... 등과 같이 한 점 한 점에서의 변화율을 구하고 싶은 것이다. 곡선상의 어떤 한 점 부분을 무한히 확대한다고 해 보자. 어떤 곡선도 무한히 확대하다 보면 부분적으로는 직선이 된다. 이 직선의 기울기가 바로 해당 점에서의 순간변화율이다.



위 곡선 예에서 x = a에서의 순간변화율 f'(a)는 다음과 같이 구할 수 있다.



그런데, x = a 한점에서가 아니라 모든 점에서의 순간변화율을 구하고 싶으면 어떻게 하는가?


그냥 x를 특정 값으로 국한시키지 않고 x 자체에 대해 일반적으로 순간변화율을 구하면 된다 (사실 이러한 대수적 개념이 처음에는 쉽지 않지만 수학에서 꼭 익숙해져야할 부분이다. x에 대해 순간변화율을 구한다는 것은 비록 x가 어떤 값이 될 수도 있지만 지금은 하나의 대표값으로서 x라는 값 하나에 대해 순간변화율을 구한다는 말이다).



이상으로 미분에 대한 기본적인 개념은 설명은 다 했다. 이러한 미분(순간변화율)은 어떤 시스템(함수)이 있을 때, 이 시스템이 어떤 변수(요인)에 의해 어떻게 영향을 받는지를 분석하는 가장 핵심적인 도구로 사용된다.



[참고] 미분과 적분의 관계


적분에는 정적분과 부정적분이 있는데 미분과 반대말 관계에 있는 건 정확히 말하면 부정적분이다. 부정적분의 정의가 '미분해서 f(x)가 되는 함수를 f(x)의 부정적분이라 정의한다'이다. 예를 들어, f(x) = 2의 부정적분은 F(x) = 2x + C이다 (C는 임의의 상수). 그러니, 미분과 부정적분은 완전히 서로 역(반대말)관계이다.


반면에 정적분은 미분과는 직접적인 관계는 없으며, 구분구적법과 관계된 말이다. 앞서 1. 적분의 이해에서 설명한 바와 같이, 정적분은 어떤 정해진 구간에서 함수값을 미세하게 나누어 합친 값으로서 적분(積分)의 한자 의미에 보다 가까운 말이다. 부정적분이 하나의 함수인 반면에 정적분은 어떤 수치 또는 값임에 주의하자.


다만, 정적분은 부정적분과 계산상의 연관 관계를 갖는다. 정적분 값을 곧이 곧대로 정의대로 구하지 않고 손쉽게 구하는 한 방법은 먼저 부정적분을 구한 후에 부정적분의 차를 이용해서 정적분 값을 계산하는 것이다. 즉, f(x)의 한 부정적분을 F(x)라 할 때,

와 같이 정적분 값을 부정적분을 이용해서 손쉽게 계산할 수 있다. 이 관계식은 미적분학에 있어서 가장 기본적인 정리 (fundamental theorem) 중 하나이다.


정리해 보면, '미분과 부정적분은 서로 반대말 관계에 있다. 정적분은 미분이나 부정적분과는 별개의 개념으로서 구분구적법, 면적, 부피 등에 관계된 개념이다. 다만, 정적분을 계산하는데 부정적분이 활용된다'이다.



☞ 이상으로 미분 적분의 개념에 대한 나름의 설명을 해 보았습니다. 제가 학교 다닌 지가 하도 옛날 일이라 요즘에는 교과서에 이런 내용들이 다 있을지도 모르겠네요. 요즘같이 바쁜 시대에 이 긴 글을 읽을 사람들이 많지는 않겠지만 조금이라도 도움이 되었길 바랍니다. 글의 재미를 위해 가끔 과격한 표현도 썼습니다 :)


☞ 긴 글을 읽으신 분들을 위한 팁입니다 ^^. 미분, 적분을 포함한 왠만한 거의 모든 수학 공식들은 여기에 다 정리되어 있습니다. => http://www.tug.org/texshowcase/cheat.pdf


☞ 가끔 영어 표현 때문에 들어오는 분들이 있어서 적어봅니다. 미분(differential), 미분학(differential calculus), 미분하는것(differentiation), 미분한결과(derivative), 변화율식{f(a+h)-f(a)}/h(difference quotient), 순간변화율(instantaneous rate of change), 평균변화율(average rate of change), 적분(integral), 적분학(integral calculus), 부정적분/결과(indefinite integral 또는 antiderivative), 정적분/결과(definite integral), 적분하는것(integration)


☞ 제 글은 미분, 적분에 대한 나름의 해석, 이해를 적은 글이기 때문에 일부 수학적 정의와는 차이가 있을 수 있습니다. 아래의 2014/08/20일자 댓글 내용을 참고하시기 바랍니다.


by 다크 프로그래머