a/an을 사용해야 하는 상황, the를 사용해야 하는 상황, 둘 다 사용하지 말아야 하는 상황을 분간하는 것은 쉽지 않다. 외국 친구들에게 물어봐도 이것에 대해 명확한 공식처럼 알려주지 못한다. 아마 수많은 반복학습을 통해 체득해왔기 때문일 것이다. 우리는 영어가 모국어가 아니기 때문에, 이것에 대해 익히려면 수많은 반복학습이 필요하다. 아래 정리한 내용이 어느 정도 가이드라인이 될 것이다. 



▶ a/an이 사용되는 상황


1) 처음 언급될 때

ex) When we were on vacation, we stayed at a hotel. Sometimes we ate at the hotel, and sometimes we went on a restaurant. (처음 호텔을 언급할 때는 a가 붙었고, 다시 그 호텔을 언급할 때는 the가 붙었다. 그리고 언급된 적 없는 식당이 언급될 때는 a가 붙었다.)


2) 어떤 것의 종류, 유형을 말할 때

ex) The sun is a star. (태양은 별의 한 종류)

ex) The hotel we stayed at was a very nice hotel. (머물렀던 호텔의 종류는 매우 좋은 호텔)




▶ the가 사용되는 상황


1) 이미 언급된 것을 말할 때

ex) When we were on vacation, we stayed at a hotel. Sometimes we ate at the hotel, and sometimes we went on a restaurant. (처음 호텔을 언급할 때는 a가 붙었고, 다시 그 호텔을 언급할 때는 the가 붙었다. 그리고 언급된 적 없는 식당이 언급될 때는 a가 붙었다.)


2) 어떤 구체적인 것을 생각하고 있을 때

ex) Tim sat down on a chair. (아마도 방에 있는 많은 의자들 중에 하나)

ex) Tim sat down on the chair nearest the door. (특정한 의자)


3) 상황상 의미하는 대상이 분명할 때

ex) Can you turn off the light, please? 전등 좀 꺼줄 수 있어요? (누가 들어도 방의 전등을 가리키는 것이 분명함으로 the가 앞에 붙었다.)

ex) I'd like to speak to the manager, please. 매니저랑 이야기 좀 하고 싶어요. (누가 들어도 그 가게의 매니저를 의미하는 것이 분명함으로 the가 앞에 붙었다.)


4) 단 하나뿐인 것을 말할 때

ex) What is the longest river in the world? (단 하나뿐인 세계, 단 하나뿐인 가장 긴 강)

ex) The Earth goes around the sun, and the moon goes around the Earth. (단 하나뿐인 지구, 태양, 달)


5) the sky, the sea, the ocean, the ground, the country, the environment

sky, sea, ocean, ground, country(시골), environment 등 앞에는 항상 the가 붙는다. 

ex) We looked up at all the stars in the sky. 

ex) We must do more to protect the environment. 


6) space

우주에 있는 공간을 나타낼 때는 the를 붙이지 않는다. 반면 그냥 공간을 의미할 때는 the를 붙인다. 

ex) Would you like to travel in outer space?

ex) I tried to park my car, but the space was too small. 


7) the same

same 앞에는 항상 the가 붙는다. 

ex) Your sweater is the same color as mine. 

ex) Lisa and I arrived at the same time. 


8) the movies, the theater

movies와 theater 앞에는 the가 붙는다. the가 붙지만 필수적으로 어떤 구체적인 영화관이나 극장을 의미하는 것은 아니다. 

ex) I go to the movies a lot. 나는 영화관에 자주 간다. 


9) the radio

radio 앞에는 the가 붙는다. 반면 television 또는 TV 앞에는 the가 붙지 않는다. 

ex) I listen to the radio a lot.

ex) I watch television a lot. 


radio를 듣는 것과 관련된 것이 아니라, 단순히 라디오라는 기계를 의미할 때는 a를 붙인다. 

ex) 

A: Do you often listen to the radio

B: No. In fact, I don't have a radio


10) breakfast, lunch, dinner

식사의 이름에는 일반적으로 the를 붙이지 않는다. 

ex) What did you have for breakfast?

ex) What time is dinner?


그러나 만약 breakfast, lunch, dinner에 형용사가 붙는다면 a를 붙여줘야 한다. 

ex) We had a very nice lunch


11) 명사 + 숫자

명사 + 숫자 앞에는 the를 사용하지 않는다. 

ex) Our plane leaves from Gate 10.

ex) Do you have these shoes in size 9?

ex) Room 126, page 126, question 3, Platform 6

12) school, prison/jail, college, class, church

이러한 장소들에 대해 일반적으로 생각할 때에는 the를 사용하지 않고, 구체적이고 특정한 장소를 생각할 때는 the를 붙인다. 

ex) When I finish high school, I want to go to college. (학생으로서 고등학교, 대학교를 의미할 때는 the를 붙이지 않는다.)

ex) Dan is a student at the college where I used to work. (특정 대학을 의미)


ex) Mrs. Kelly goes to church every Sunday. 캘리는 매주 일요일에 교회에 간다. (교회에 예배드리러 갈 때는 the를 붙이지 않는다.)

ex) Some workmen went to the church to repair the roof. 몇몇 작업공들은 지붕을 수리하러 교회에 갔다. (종교적인 목적을 갖고 교회를 가는 것이 아닐 때는 the를 붙인다.)


13) bed, work, home

bed, work, home 앞에는 the를 붙이지 않는다.

ex) It's time to go to bed now. 

ex) Ann didn't go to work yesterday. 앤은 어제 직장에 가지 않았다.

ex) It's late. Let's go home


단 침대에 자러 가는 것을 의미할 때가 아니라 하나의 가구를 의미할 때는 the가 붙는다. 

ex) I sat down on the bed.  


13) 전반적인 의미로 사물들과 사람들에 대해 이야기 할 때는 the를 붙이지 않음, 반면 구체적인 사물들과 사물들에 대해 이야기 할 때는 the를 붙인다. 
ex) I'm afraid of dogs

ex) My favorite sport is football

ex) My favorite subject at school was history.

ex) Children learn from playing. (일반적인 의미로 아이들)

ex) We couldn't live without music. (일반적인 의미로 음악) 

ex) Sugar isn't very good for you. (일반적인 의미로 설탕)


ex) We took the children to the zoo. (특정 아이들, 아마도 여기선 화자의 아이들)

ex) The movie wasn't very good, but I liked the music. (영화 속의 그 음악) 

ex) Can you pass the sugar, please? (특정한 설탕, 아마도 테이블 위에 있는 설탕)


14) the + 단수 가산 명사

the + 단수 가산 명사는 동물, 기계, 악기 등의 종류를 말하기 위해 사용된다. 

ex) The giraffe is the tallest of all animals. 기린은 모든 동물 중에서 가장 키가 크다. (기린이라는 동물의 종류를 나타냄. 특정 기린을 나타내는 것이 아님.)

ex) Can you play the guitar

ex) The bicycle is an excellent means of transportation. 


15) the + 형용사

ex) the young 젊은 사람들

ex) the rich 부유한 사람들

ex) the sick 아픈 사람들


16) the + 국적

국가이름이 -ch, -sh, -ese로 끝나는 경우 그 나라 사람들을 의미한다. 

ex) the French 프랑스 사람들

ex) the English 영국 사람들

ex) the Chinese 중국 사람들


17) 사람 이름, 대륙, 나라, 섬, 도시, 마을, 산 이름

단수형인 사람 이름 앞에는 the를 붙이지 않는다. 또한 단수형인 대륙, 나라, 섬, 도시, 마을, 산 등의 이름 앞에도 보통 the를 붙이지 않는다. 단 이름에 Republic, Kingdom, States가 들어가면 the를 붙인다. 

ex) Africa, Asia, France, Texas, Vancouver Island, New York, Everest

ex) the United Kingdom, the Dominican Republic, the United States of America

ex) We visited Canada and the United States. 


사람 이름과 대륙, 나라, 섬, 도시, 마을, 산 등의 이름이 복수형이라면 the를 붙여준다. 

ex) the Johnsons 존슨의 가족

ex) the Netherlands, the Philippines, the United States

ex) the Andes, the Alps

ex) The highest mountain in the Andes is Mount Aconcagua. (Andes는 장소 이름인데 복수형이므로 the를 붙여주는 반면, Mount가 산 이름 앞에 있을 때는 the를 붙이지 않는다.)


18) Mr./Mrs./Captain/Doctor 등 + 이름

이름 앞에 Mr.와 Doctor 같은 것이 올 때는 the를 앞에 붙이지 않는다. 
ex) Mr. Johnson, Doctor Johnson, President Johnson
ex) We called the doctor.
ex) We called Doctor Johnson

19) Mount + 산 이름, Lake + 호수 이름

산이나 호수 이름 앞에 Mount 또는 Lake가 올 때는 the를 앞에 쓰지 않는다. 

ex) Mount Everest, Lake Victoria

ex) They live near the lake. 

ex) They live near Lake Superior. 


20) 대양, 바다, 강, 만, 운하, 사막

대양, 바다, 강, 만, 운하 등(물과 관련된 지명들)의 이름 앞에는 the를 붙여준다. 또한 사막의 이름 앞에도 the를 붙인다. 

ex) the Indian Ocean 인도양, the Gulf of Mexico 멕시코만, the Amazon 아마존강, the Panama Canal 파나마운하

ex) the Sahara 사하라 사막, the Gobi Desert 고비 사막


21) the north, the southeast, northern, southeastern

north, south, west등의 앞에는 the가 붙고, northern, southeastern과 결합된 명사 앞에는 the가 붙지 않는다. 

ex) Sweden is in northern Europe; Spain is in the south


한편 north, south 등은 어떤 지역 이름 앞에 붙을 때는 the를 붙이지 않는다. 

ex) North America, South Africa, southeast Texas 


22) 도시의 거리, 도로, 광장, 공원 이름

대부분의 도시의 거리, 도로, 광장, 공원 등의 이름에는 the를 붙이지 않는다. 

ex) Fifth Avenue, Central Park, Times Square


23) 공공 건물이나 기관의 이름

공공 건물이나 기관의 이름이 두개의 단어로 이뤄져 있는데 첫번째 이름이 지명이거나 사람의 이름인 경우에는 the를 붙이지 않는다. 

ex) Kennedy Airport, Cambridge University, Lincoln Center, Penn Station

ex) Buckingham Palace (the가 붙지 않는다. 버킹검이라는 인물 이름이 첫번째 단어이기 때문에)

ex) the Royal Palace (the가 붙는다. 첫번째 단어인 Royal이 지명 이름도 아니고 인물의 이름도 아니기 때문이다.) 


24) 대부분의 일반 건물들의 이름

대부분의 일반 건물들의 이름에는 the가 붙는다. 

ex) the Sheraton Hotel, the Delhi Restaurant, the Holiday Inn, the Guggenheim Museum, the National Gallery, the White House, the Brooklyn Bridge, the Empire State Building


또한 이름에 of를 가진 것들은 보통 the를 붙인다. 

ex) the Bank of England, the Museum of Modern Art, the Great Wall of China, the Tower of London

ex) the University of Michigan (이름에 of가 들어갔으므로 앞에 the가 붙었다.) 

ex) Michigan State University


이름에 's가 들어있다면 the를 붙이지 않는다. 

ex) McDonald's, Macy's, St. John's Church, St. Patrick's Cathedral


25) 신문, 조직, 단체의 이름

대부분의 신문, 조직, 단체의 이름에는 the를 붙인다. 

ex) the Washington Post, the Financial Times

ex) the European Union, the BBC, the Red Cross


26) 회사, 항공사 등의 이름

회사, 항공사 등의 이름에는 보통 the를 붙이지 않는다.

ex) Sony, Delta Air Lines, Coca-Cola, Apple Computer, Cambridge University Press




Posted by 톈진난만

댓글을 달아 주세요

  1. BlogIcon Utopista 2018.04.13 17:42 신고  댓글주소  수정/삭제  댓글쓰기

    오우..
    여기 매일 와서 공부하면 될것 같아요...
    학원 갈 필요 없네요...^^

  2. BlogIcon Utopista 2018.04.13 18:08 신고  댓글주소  수정/삭제  댓글쓰기

    제가 더 감사하죠..
    이런 양질의 교제를...ㅎㅎㅎ

    • BlogIcon 톈진난만 2018.04.13 18:22 신고  댓글주소  수정/삭제

      아고.. 그런 칭찬을 받을만한 퀄리티의 글이 아닌데..ㅜ 저도 a/an과 the의 적절한 사용법에 대해 더 깊이 있게 이해하도록 좀 더 공부해서 업그레이드시켜야겠어요!

▶ 영상 재매핑 처리


오늘은 영상의 화소를 옮겨 영상의 모습을 변경하는 방법에 대해 공부해보자. 화소의 값을 바꾸지 않고 화소의 위치를 새로운 위치에 재매핑 할 것이다. 두 가지를 해볼 것인데 하나는 영상에 물결 효과를 넣는 것이고, 또 다른 하나는 영상을 좌우반전시키는 것이다. 


1. 원본 영상 읽기 및 띄우기

2. 원본 영상에 물결 효과 넣기 - cv::remap 함수

3. 원본 영상을 좌우반전시키기 - cv::remap 함수


코드는 아래와 같다. 


#include <iostream>

#include <opencv2\core.hpp>

#include <opencv2\highgui.hpp>

#include <opencv2\imgproc.hpp> //cv::remap 함수 사용을 위해 필요


void wave(const cv::Mat &image, cv::Mat &result); // 물결 효과 함수

void flip(const cv::Mat &image, cv::Mat &result); // 좌우반전 함수


int main()

{

cv::Mat before = cv::imread("cathedral.jpg");

cv::imshow("before", before);

cv::Mat after1;

after1.create(before.rows, before.cols, before.type());


wave(before, after1); // 물결 효과

cv::imshow("after1", after1);


cv::Mat after2;

after2.create(before.rows, before.cols, before.type());


flip(before, after2); // 좌우반전

cv::imshow("after2", after2);


cv::waitKey(0);

    return 0;

}


void wave(const cv::Mat &image, cv::Mat &result) // 물결 효과 함수

{

// 맵 역할

cv::Mat srcX(image.rows, image.cols, CV_32F);

cv::Mat srcY(image.rows, image.cols, CV_32F);


  // 매핑 생성

for (int i = 0; i < image.rows; i++)

{

for (int j = 0; j < image.cols; j++)

{

// 화소 (i, j)의 새로운 위치

srcX.at<float>(i, j) = j; // 열은 그대로 유지

srcY.at<float>(i, j) = i + 10 * sin(j / 10.0); // 원래 있는 i행의 화소를 바로 사인 곡선에 따라 옮김

}

}


// 매핑 적용

cv::remap(image, result, srcX, srcY, cv::INTER_LINEAR);


}


void flip(const cv::Mat &image, cv::Mat &result) // 좌우 반전 함수

{

// 맵 역할

cv::Mat srcX(image.rows, image.cols, CV_32F);

cv::Mat srcY(image.rows, image.cols, CV_32F);


  // 매핑 생성

for (int i = 0; i < image.rows; i++)

{

for (int j = 0; j < image.cols; j++)

{

// 화소 (i, j)의 새로운 위치

srcX.at<float>(i, j) = image.cols-j-1; // 열은 좌우가 바뀜 ex) 1번째 열은 마지막 열로, 2번째 열은 (마지막-1)열로,..., 마지막 열은 1번째 열로.

srcY.at<float>(i, j) = i; // 행은 그대로 유지

}

}


// 매핑 적용

cv::remap(image, result, srcX, srcY, cv::INTER_LINEAR);

}



원본 이미지와 결과 이미지들을 살펴보자. 원본 이미지, 물결 효과가 첨가된 이미지, 좌우반전된 이미지 순이다. 




▶ 좀 더 알고 넘어갈 것들


1) cv::remap 함수


cv::remap 함수를 사용하기 위해서는 재매핑처리를 위한 x맵과 y맵을 먼저 정의해야 한다. (참고로 cv::remap 함수를 사용하기 위해서는 


#include <opencv2\imgproc.hpp>


가 헤더 부분에 선언되어 있어야 한다.) 물결 효과보다는 좌우반전의 경우가 좀 더 간단하니 좌우반전의 코드 부분으로 재매핑처리에 대해서 이해해보자. 


// 맵 역할

cv::Mat srcX(image.rows, image.cols, CV_32F);

cv::Mat srcY(image.rows, image.cols, CV_32F);


// 매핑 생성

for (int i = 0; i < image.rows; i++)

{

for (int j = 0; j < image.cols; j++)

{

// 화소 (i, j)의 새로운 위치

srcX.at<float>(i, j) = image.cols-j-1; // 열은 좌우가 바뀜.

srcY.at<float>(i, j) = i; // 행은 그대로 유지

}

}


좌우반전을 위해 행들은 그대로 유지시키고 열들만 변경시켜준다. 첫번째 열은 마지막 열로, 두번째 열은 마지막 하나 전 열로,..., 마지막 열은 첫번째 열로. 


x맵과 y맵을 정의한 후에는 매핑을 적용해준다. 


// 매핑 적용

cv::remap(image, result, srcX, srcY, cv::INTER_LINEAR);


이전 포스팅 http://bskyvision.com/291에서도 영상의 좌우반전을 소개했었다. 이때는 opencv 라이브러리 내의 cv::flip 함수를 사용했었다. 



2) 물결 효과


이미지에 물결 효과를 어떻게 줬는지 좀 더 살펴보자. 


// 매핑 생성

for (int i = 0; i < image.rows; i++)

{

for (int j = 0; j < image.cols; j++)

{

// 화소 (i, j)의 새로운 위치

srcX.at<float>(i, j) = j; // 열은 그대로 유지

srcY.at<float>(i, j) = i + 10 * sin(j / 10.0); // 원래 있는 i행의 화소를 바로 사인 곡선에 따라 옮김

}

}


우선 열들은 그대로 유지한다. 그리고 행들은 사인 함수를 이용해서 j의 값에 따라 위 아래로 변동이 있게 만들어 준다. 현재 행의 위치에서 사인 함수 앞에 곱해져 있는 10픽셀 만큼 위 아래로 왔다갔다 하게 될 것이다. 



<참고자료>

[1] 로버트 라가니에 지음, 이문호 옮김, "OpenCV를 활용한 컴퓨터 비전 프로그래밍 3/e", 에이콘

Posted by 톈진난만

댓글을 달아 주세요

▶ 두 개의 영상 가중합 하기



영상끼리 더해주거나 빼주거나 곱해주거나 나누어주는 것이 가능하다. 오늘은 두 영상을 가중합하는 것을 해보도록 하겠다. 화창한 이미지에 비 이미지를 더해서 마치 비가 오는 것처럼 만들 것이다. 


1. 두 개의 영상 읽기

2. 영상 가중합- cv::addWeighted 함수

3. 또 다른 방식으로 영상 가중합

4. BGR중에 G, 초록 채널에만 영상 가중합(초록비 내리게 함)- cv::split 함수, cv::merge 함수


코드는 아래와 같다.


#include <iostream>

#include <opencv2\highgui.hpp>

#include <opencv2\core.hpp>

#include <opencv2/imgproc.hpp> // cv::cvtColor 함수를 사용하기 위해 필요. 


int main()

{

/* 2개의 컬러 이미지 가중합 */

cv::Mat img1 = cv::imread("marco.jpg");

cv::imshow("img1", img1);

cv::Mat img2 = cv::imread("rain.jpg");

cv::imshow("img2", img2);

cv::Mat result;

cv::addWeighted(img1, 0.7, img2, 0.9, 0.0, result); // result = 0.7 * img1 + 0.9 * img2 + 0.0

cv::imshow("Result", result);


/* 다른 방식으로 2개의 컬러 이미지 가중합 */

cv::Mat result1;

result1 = 0.7*img1 + 0.9*img2;

cv::imshow("Result1", result1);



/* 초록 채널에만 2개의 이미지 가중합 */

cv::Mat img2_gray;

cv::Mat result2;

cv::cvtColor(img2, img2_gray, CV_BGR2GRAY); // 컬러 영상이던 img2를 그레이 영상으로 변환. 


std::vector<cv::Mat> planes; // 3개 영상의 벡터 생성

cv::split(img1, planes); // 3채널인 단일 영상을 3개의 1채널 영상으로 분리

planes[1] += img2_gray; // 초록 채널에 더하기

cv::merge(planes, result2); // 3개의 1채널 영상을 3채널인 단일 영상으로 병합

cv::imshow("Result2", result2);



cv::waitKey(0);

    return 0;

}


구현된 결과 전시된 이미지들은 아래와 같다. 




화창했던 크로아티아 자그레브의 마르코 성당이 비가 내리는 모습으로 바뀌었다. 그리고 마지막 이미지를 보면 비의 색이 초록색임을 알 수 있다. 



▶ 좀 더 알고 넘어갈 것들


1) 영상 가중합


가중합을 두 가지의 방식으로 구현했다. 하나는 cv::addWeighted 함수를 사용한 것이고, 하나는 좀 더 직관적으로 result = 0.7*img1 + 0.9*img2와 같은 방식으로 가중합했다.


 cv::addWeighted(img1, 0.7, img2, 0.9, 0.0, result); // result = 0.7 * img1 + 0.9 * img2 + 0.0


result1 = 0.7*img1 + 0.9*img2;



2) 컬러 이미지를 그레이 이미지로 전환하기


컬러 이미지를 그레이 이미지로 전환하기 위해 cv::cvtColor 함수를 활용했다. 이 함수를 사용하기 위해서는 해더에 아래와 같이 선언해줘야 한다.


#include <opencv2/imgproc.hpp>


컬러 영상을 그레이로 변환하기 위해 간단히 아래와 같이 코딩하면 된다. 


cv::cvtColor(img2, img2_gray, CV_BGR2GRAY); 


cv::cvtColor 함수는 RGB 영상을 그레이영상으로 변환해주는 것 뿐만 아니라, HSV, LUV, LAB 등의 색 공간으로도 변환해 줄 수 있다. 


3) cv::split 함수와 cv::merge 함수


cv::split 함수는 3채널인 영상을 3개의 1채널 영상으로 분리해준다. 위 예제에서는 마르코 성당 이미지를 3개의 1채널 영상으로 분리해줬다(B채널, G채널, R채널). 분리한 이유는 G채널에만 비 영상을 더해 주기 위함이다. 3채널 비 영상을 1채널 그레이 영상을 전환한 다음에 성당 이미지의 G채널에만 더해준다. 결과적으로 비가 지나간 자리는 초록색이 된다. 그리고 cv::merge 함수를 이용해서 분리된 3개의 채널을 다시 하나의 3채널 컬러 영상을 생성한다. 


/* 초록 채널에만 2개의 이미지 가중합 */

cv::Mat img2_gray;

cv::Mat result2;

cv::cvtColor(img2, img2_gray, CV_BGR2GRAY); // 컬러 영상이던 img2를 그레이 영상으로 변환. 


std::vector<cv::Mat> planes; // 3개 영상의 벡터 생성

cv::split(img1, planes); // 3채널인 단일 영상을 3개의 1채널 영상으로 분리

planes[1] += img2_gray; // 초록 채널에 더하기

cv::merge(planes, result2); // 3개의 1채널 영상을 3채널인 단일 영상으로 병합



<참고자료>

[1] 로버트 라가니에 지음, 이문호 옮김, "OpenCV를 활용한 컴퓨터 비전 프로그래밍 3/e", 에이콘

Posted by 톈진난만

댓글을 달아 주세요

▶ 영상 선명하게 만들기


사진을 찍다보면 살짝 흔들리거나 초점이 잘 안 맞아서 뿌연 영상이 찍힐 때가 종종 있다. 이런 영상을 선명하게 만드는 기법 중에 가장 간단한 것은 영상에 라플라시안 커널로 필터링해주는 것이다. 그러면 밝기값이 센 픽셀은 더 세게, 약한 픽셀은 더 약하게 해줌으로 결과적으로 엣지가 더 두드러지게 된다. cv::filter2D 함수를 이용하면 쉽게 필터링할 수 있지만, 좀 더 영상의 구조와 특징을 이해하기 위해서 책에서 소개한 방식으로 코딩했다. 


1. 영상 읽기 및 띄우기

2. 선명화 된 영상 저장할 공간 마련 - create 메소드

3. 선명화 연산 - sharpen 함수

4. 선명화된 영상 띄우기


아래 코드를 한번 복붙해서 실행한 후에 코드에 대해 이해해가는 것을 추천한다. 


#include <iostream>

#include <opencv2\highgui.hpp>

#include <opencv2\core.hpp>


void sharpen(const cv::Mat &image, cv::Mat &result);


int main()

{

cv::Mat before = cv::imread("robot.jpg");

cv::imshow("Before", before);


cv::Mat after;

after.create(before.rows, before.cols, before.type()); 


sharpen(before, after);


cv::imshow("After", after);

cv::waitKey(0);


        return 0;

}


void sharpen(const cv::Mat &image, cv::Mat &result)

{

int nchannels = image.channels(); // 채널 개수 얻기, 컬러 영상이므로 여기서는 3.


// 모든 행 대상 (처음과 마지막 제외)

for (int j = 1; j < image.rows - 1; j++)

{

const uchar* previous = image.ptr<const uchar>(j - 1); // 이전 행 주소

const uchar* current = image.ptr<const uchar>(j); // 현재 행 주소

const uchar* next = image.ptr<const uchar>(j + 1); // 다음 행 주소


uchar* output = result.ptr<uchar>(j); // 결과 이미지의 현재 행 주소


for (int i = nchannels; i < (image.cols - 1)*nchannels ; i++) // int i = 3; i < 397*3; i++, 왜 3부터 시작할까? 그리고 왜 397*3-1까지만 할까? 아래 설명 참고. 

{

// 선명화 연산자 적용

*output++ = cv::saturate_cast<uchar>(5 * current[i] - current[i - nchannels] - current[i + nchannels] - previous[i] - next[i]); // *output++의 의미는? saturate_cast의 역할은? 아래 설명 참고. 

}

}


//처리하지 않는 화소를 검정색으로 설정

result.row(0).setTo(cv::Scalar(0, 0, 0));

result.row(result.rows - 1).setTo(cv::Scalar(0, 0, 0));

result.col(0).setTo(cv::Scalar(0, 0, 0));

result.col(result.cols - 1).setTo(cv::Scalar(0, 0, 0));

}


원본 영상과 결과 영상은 아래와 같다. 


원본 및 결과 이미지


원본 이미지와 결과 이미지를 비교해보면 한결 선명해진 것을 확인할 수 있다.  




▶ 좀 더 알고 넘어갈 것들


1) sharpen 함수


정의한 sharpen 함수에 대해 설명하겠다. 일단 첫번째 for 문을 보면, 첫번째 행과 마지막 행을 제외하고 작업한다. 왜냐하면 윗 행과 아래 행이 존재할 때만 선명화 작업을 해줄 수 있기 떄문이다(이 방식으로는). 그리고 두번째 for문은 열과 관련된 것인데, 첫번째 열과 마지막 열을 제외하고 작업한다. 마찬가지로 왼쪽 열과 오른쪽 열이 존재할 때만 선명화 작업을 해줄 수 있기 때문이다.  


for (int i = nchannels; i < (image.cols - 1)*nchannels ; i++)


이 부분은 좀 더 설명이 필요할 것 같다. nchannels 부터 (image.cols-1)*nchannels - 1까지 반복한다는 것인데, 여기서 nchannels는 3이고, image.cols는 398이므로 다시 적으면, 3부터 397*3-1까지 반복한다는 것이다. 왜 3부터일까? 그 이유는 첫번째 열에 b, g, r 세 개의 픽셀값들이 0번째, 1번째, 2번째 요소에 존재하기 떄문이다. 397*3 -1 까지인 이유는 마지막 열의 b, g, r 세 개의 픽셀값들을 제외하기 위함이다. 


이렇게 연산을 해줄 범위를 설정한 후에 선명화 연산자를 적용한다. 


*output++ = cv::saturate_cast<uchar>(5 * current[i] - current[i - nchannels] - current[i + nchannels] - previous[i] - next[i]);


일단 cv::saturate_cast<uchar>는 허용된 화소값의 범위를 벗어나지 않게 해주는 친구다. 만약 255 이상이면 255가 되게, 0이하면 0이 되게 해줌으로 허용된 화소값 내에 머무르게 한다.  


5*current[i] - current[i - nchannels] - current[i + nchnnels] - previous[i] - next[i]가 선명화 작업의 핵심인데 일단 현재 픽셀의 값에 5를 곱한 후 상하좌우에 있는 픽셀의 값들을 빼준다. 만약 5개 픽셀의 값이 모두 동일하다면 아무 변화가 없을 것이다. 반면 현재 픽셀의 값이 주변 픽셀의 값보다 크다면 그것은 더 부각될 것이고, 작다면 더 작아질 것이다. 결과적으로 엣지가 부각된다. 


*output++에 대해서 마지막으로 설명하겠다. output에는 결과 이미지의 현재 행의 주소가 저장되어 있는데, *연산자로 그 주소 안에 있는 값을 불러온다. 현재 행의 첫번째 열의 b 채널값을 불러올 것이다. 그리고 ++연산자로 인해 루프가 한번 돌았을 때는 첫번째 열의 g 채널값을 불러올 것이다. 이런 식으로 하나하나 접근해서 선명화 작업 결과를 저장한다. 



2) row 메소드와 col 메소드, 그리고 setTo 메소드


row 메소드는 하나의 행을, col 메소드는 하나의 열을 관심영역으로 지정한다.  


result.row(0).setTo(cv::Scalar(0, 0, 0));


위 코드는 result 영상의 0번째 행은 검정색으로 설정하겠다는 것이다. setTo 메소드는 행렬의 모든 요소에 설정해준 값을 할당한다. 




<참고자료>

[1] 로버트 라가니에 지음, 이문호 옮김, "OpenCV를 활용한 컴퓨터 비전 프로그래밍 3/e", 에이콘


Posted by 톈진난만

댓글을 달아 주세요

글자전쟁
김진명 지음
새움


독후감

김진명 작가의 책을 읽다보면 이런 생각이 들 때가 많다. '과연 어디까지가 팩트일까?' 그는 현존하는 인물들과 현실, 역사를 토대로 소설을 쓰기 때문이다. 글자전쟁의 한 인물인 소설가 전준우가 바로 김진명 작가 자신의 분신과 같다. 

문단에서는 그를 허구라는 장치를 사용하지만 드러난 사실보다 더 깊은 수면 아래의 진실을 캐낸다는 뜻으로 '팩트 서처'라는 별명으로 불리고 있었다. 

과연 김진명 작가가 글자전쟁을 통해 밝히고 싶은 진실은 무엇이었을까? 바로 '한자를 누가 처음 만들었는가?'이다. 전세계 많은 사람들이 한자가 중국의 것이라고 믿고 있다. 한자를 사용하는 나라는 중국, 한국, 일본 등 여러나라이지만. 중국인들은 한국과 일본 사람들이 자신들이 개발한 한자를 빌려가서 사용히고 있다고 주장하고 있다.

그러나 이 책에서 제기하는 문제는 한자를 처음 만든 민족은 한족이 아니라는 것이다. 한자는 한족의 나라에서 처음 만들어진 것이 아니라, 동이족의 나라였던 은나라에서 만들어진 것이다. 1899년에 중국 산동성에서 은나라의 수도였던 은허가 발견되었는데, 그곳에서 나온 고고학적 유물들을 통해 은나라가 동이족의 후손임이 확인되었다. 또한 발견된 갑골문을 통해 이미 5000개가 넘는 한자가 은나라에서 사용되고 있었다는 것이 밝혀졌다. 그래서 '한자'를 '은자'라고 말하는 것이 더 정확하다고 볼 수 있다.
 
우리는 은나라의 주인이었던 동이족에 주목할 필요가 있다. 동이족은 동쪽에 큰 활을 사용하는 사람들이란 뜻으로 우리 한민족을 뜻하는 것이다. 동이족이 은자를 처음 개발했고, 이후에 한족 나라인 주나라가 동이족 나라인 은나라를 멸망시킨 후에는 주나라도 은자를 사용했다. 아마 오랜 시간동안 한족들은 자체적으로 은자를 발전시켜갔을 것이다. 그러면서 은자 대신에 한자라는 이름도 붙였을 것이고.

현대 중국을 대표하는 문호이자 저널리스트인 임어당(1895~1976)과 우리나라의 안호상 문교부 장관이 나눈 대화를 살펴보자. 

안호상 장관: "당신네 중국인들이 한자를 만들어 머리 아파 죽겠소. 왜 그렇게 복잡한 문자를 만들어 우리 한국인들까지도 한문혼용이냐, 한글전용이냐로 이렇게 골치 썩이며 대립하게 만드는 거요?"
임어당: "한자는 당신네 동이족이 만든 건데 무슨 소리를 하는 겁니까?"

씁쓸하지만 안 장관의 생각이 우리 대부분이 갖고 있는 생각을 반영하는 것 같다. 전세계 수많은 사람들이 사용하는 '한자', 아니 '은자'가 중국인이 아니라 우리의 조상들의 고민과 노력으로 개발된 것이라니! 자부심을 가질만한 사실이다. 한자와 한글 모두 소중한 우리의 문화유산이다. 그렇다고 한자가 우리 한국인만의 것이라고 주장하는 것은 아니다. 동이족이 처음 만들었어도, 역사상 한자를 사용해온 많은 나라들이 점차적으로 발전시켜왔을 것이기 때문이다. 그러므로 한자는 한국의, 중국의 것만이 아닌, 한자를 사용해온 수많은 나라의 것이다.

중국의 많은 고고학자들은 이미 이 사실을 알고 있다. 그러나 나는 이 책을 읽기 전까지 몰랐고, 지금도 수많은 대한민국 사람들은 모르고 있다. 중국의 동북공정과 같은 부단한 역사왜곡의 결과이기도 할 것이고, 또한 우리의 무관심 때문이기도 할 것이다. 정신 바짝 차리고 있어야한다. 진리, 진실을 사수하기 위해 몸부림쳐야 한다. 이러다간 우리의 소중한 문화유산과 정체성을 다 빼앗겨 버린다. 가짜라도, 허위사실이라도 계속 듣게 되어 익숙해지면, 그것은 어느새 우리 생각 속에 진짜로 둔갑한다. 쪽수와 열심이 많은 쪽이 득세하는 세상이다. 중국과 일본의 비양심적인 학자들은 지금껏 열심히 역사를 왜곡해왔다. 그들의 열심은 지금 꽤 열매(?)를 맺고 있다. 독도분쟁, 동해의 명칭 문제, 동북공정 등을 그들이 괜히 하고 있는 것이 아니다. 

중국에서 석사를 하면 석사 1년차 때 중국문화 수업을 필수로 듣는다. 그 수업에서 사용하는 교재에서는 한자를 고대 중국인이 만든 것이라고 자랑스럽게 소개하고 있다. 진정 한자를 개발한 은나라의 구성원이 한족이 아니라 동이족이라는 말은 찾아볼 수 없다. 진실을 은폐하는 것이다. 그 수업을 듣는 수많은 외국인들은 '한자가 중국인의 조상들이 개발해서 이렇게 발전해 온 것이구나'하며 자기도 모르게 받아들이게 된다. 그러면서 은연 중에 중국인에 대한 존경이 생긴다. 이것이 바로 중국의 전략이다. 이것이 바로 그들이 역사 왜곡을 통해 얻고자 하는 것이다. 중화사상, 중국이 세계의 중심이라는 것을 전파하고자 하는 것이다.  

글자전쟁에서 김진명 작가가 하고 싶었던 이야기는 한자를 우리의 조상이 처음 만들어 사용했다는 사실과 중국의 역사왜곡에 대한 고발도 있겠지만, 궁극적으로는 우리 대한민국 국민의 역사의식을 계몽하는 것에 있지 않나 싶다. 아래 링크 건 글은 김진명 작가가 쓴 글인데, 글자전쟁을 간략하게 요약했다고도 볼 수 있는 글이다. 이 링크를 클릭하기 전에 이 책을 먼저 꼭 읽어보기를 강력히 추천한다. 

김진명의 '대한민국 7대 미스터리' 5화



Posted by 톈진난만

댓글을 달아 주세요

아프니까 청춘이다
김난도 지음
쌤앤파커스


독후감

올해 나이 31, 결혼한 대학원생. 지금껏 이룬 것이 별로 없다는 생각이 때론 마음을 심란하게 만들곤 한다. 나는 지금 제대로 가고 있는 것일까? 또래 친구들에 비해 뒤쳐지고 있는 것은 아닐까? 당장 좀 더 수익을 많이 얻을 수 있는 일에 뛰어들어야 하는 것은 아닌가? 하지만 꽃마다 피는 계절이 다르듯 우리의 인생도 저마다 꽃을 피울 때가 다르다는 저자의 말이 새삼 위로가 된다. 
 
매화, 벚꽃, 해바라기, 국화, 동백
(중략)
가장 훌륭한 꽃은 없다. 저마다 훌륭하다. 나름의 이유가 있어 제가 피어날 철에 만개하는 것이다. 
(중략)
청춘들은 대부분 가장 일찍 꽃을 피우는 매화가 되려고만 한다.

나의 전성기는 머지않아 분명히 찾아올 것이다. 아름다움을 찬란하게 발휘할 그 날을 곧 맞이할 것이다. 그러니 조급해하지 말자. 

많은 사람들이 자신의 삶에 로또 당첨과 같은 기적이 이뤄지기를 기대한다. 우리 삶에 있을지 모르는 한두번의 대박 기회를 잡아야한다고 말한다. 그러나 기적은 천천히 이루어지는 것이라는 사실. 기적은 한걸음, 한걸음 용기있게 내디는 발걸음에 이루어진다는 사실.

인생의 성공이란 커다란 한 번의 성취가 아니라, 매일매일의 작은 승부로 직조하는 것이다. 

기적에 한걸음 한걸음 다가가기 위해서, 무언가를 이루기 위해서는 확고한 목표, 적절한 방법론, 성실한 실천이 모두 있어야하는데 이 모든 것의 균형을 맞춰주는 것이 바로 자기성찰이라는 내용은 참으로 머리를 시원케했다. 그동안 머리 속에 어느정도 개념은 있었지만 깔끔하게 정리되어 있지 않아 혼란스럽던 것들이 제자리를 찾은 느낌이라고 할까? 뉴런들 사이에 시냅스들이 쫙 연결된 화학적 쾌감이라고나 할까? 

나는 진정한 성취란 확고한 목표, 적절한 방법론, 성실한 실천의 세 가지가 어우러졌을 때 비로소 가능하다고 생각한다.
(중략)
늘 이 셋의 균형을 맞추기 위해서는 끊임없이 스스로를 돌아봐야 한다. 이 삼각형의 중심점에 자기성찰이 있는 것이다.

무협지를 즐겨 읽지는 않지만 개인적으로 좋아하는 단어가 있다. 그것은 바로 '내공'이란 단어다. 오랜 훈련과 땀과 피와 눈물의 시간 끝에 갖게 되는 바로 그것. 저자에게서 바로 그 '내공'을 느낄 수 있었다. 소비자학을 연구하는 학자로서의 실력, 학생들을 향한 진심어린 관심과 사랑, 인생에 대한 고민, 자신에 대한 성찰. 그 중에서도 나는 저자의 탁월한 문장력에 감탄했다. 김난도 교수님의 글은 참 설득력이 있다. 이미 알고 있는 내용이라 할지라도 마음과 몸을 움직이게 만든다. 나도 이런 글을 쓰고 싶다. 글을 잘 쓰기 위해 저자가 제안한 우리말 사전을 만들어봐야겠다. 우리말 사전이라는 것은 좋은 표현, 활용하지 못했던 사자성어, 속담, 단어 등을 정리해놓은 메모장이다. 공대생이라고 글을 잘 못써도 된다는 생각은 구시대적인 것이다. 글쓰는 실력은 결코 저절로 늘지 않는다는 저자의 말을 마음에 새기자.

개인적으로 이 책을 통해 간접적으로 알게 되어 기쁘다. 이 책을 우리 집 책꽂이에 있게 하셔서 김난도 교수님이라는 또 한명의 인생 선배, 멘토를 얻게 해주신 내 인생의 가장 큰 멘토이신 부모님께 감사드린다. 



▶ 인상 깊은 구절들


P23
경남 거창고등학교, 직업 선택의 십계명
  • 월급이 적은 쪽을 택하라.
  • 내가 원하는 곳이 아니라, 나를 필요로 하는 곳을 택하라.
  • 승진의 기회가 거의 없는 곳을 택하라.
  • 모든 조건이 갖춰진 곳을 피하고 처음부터 시작해야 하는 황무지를 택하라.
  • 앞다투어 모여드는 곳에는 절대 가지 마라. 아무도 가지 않은 곳으로 가라.
  • 장래성이 전혀 없다고 생각되는 곳으로 가라.
  • 사회적 존경을 바라볼 수 없는 곳으로 가라.
  • 한가운데가 아니라 가장자리로 가라.
  • 부모나 아내나 약혼자가 결사반대하는 곳이면 틀림없다. 의심치 말고 가라.
  • 왕관이 아니라 단두대가 기다리고 있는 곳으로 가라.

P28
열망은 힘이 세다. 세상의 잣대가 아니라, 자신의 가치와 열정과 보람을 기준으로 삶을 살 수 있게 하기 때문이다.  

P32 
매화, 벚꽃, 해바라기, 국화, 동백
(중략)
가장 훌륭한 꽃은 없다. 저마다 훌륭하다. 나름의 이유가 있어 제가 피어날 철에 만개하는 것이다.
(중략)
청춘들은 대부분 가장 일찍 꽃을 피우는 매화가 되려고만 한다.

P35
너무 일찍 출세하면 나태해지고 오만해지기 쉽다. 나태하므로 더 이상의 발전이 없고, 오만하므로 적이 많아진다.

P72
나는 진정한 성취란 확고한 목표, 적절한 방법론, 성실한 실천의 세 가지가 어우러졌을 때 비로소 가능하다고 생각한다.
(중략)
늘 이 셋의 균형을 맞추기 위해서는 끊임없이 스스로를 돌아봐야 한다. 이 삼각형의 중심점에 자기성찰이 있는 것이다. 

P106
인간관계란 좋은 파트너를 선택하는 일이 아니라, 좋은 파트너가 되는 일이다.

P130
혼자서 머리 싸매고 이런저런 상념 속에 스스로를 가두지 말고, 다양한 정보를 찾아 나서라. 좋은 결정은 항상 좋은 정보에서 나온다. 사람을 많이 만나고 폭넓게 책을 읽어라. 친구들과 몰려다니며 같은 어둠 속에서 헤매지 말고, 앞서 삶의 길을 걷고 있는 선배와 스승들과 깊은 얘기를 나누어라.

P162
그대, 부대껴야 한다. 수시로 오프행사에 기웃거리고 얼굴을 내밀어야 한다. 스펙에 도움이 되는 클럽이 아니라, 사람 냄새가 물씬 나는 모임에 가입해야 한다. 

P186
책 한 권 쓸 수 있을 만큼의 작가 같은 글솜씨를 가지라고 말하는 것은 아니지만, 그렇다고 키보드를 두드린다고 모두 글이 되는 것은 아니라는 사실쯤은 알아야 한다. 적어도 조리 있게 자신의 생각을 표현해서 다른 사람을 설득시킬 수 있는 글은 쓸 줄 알아야 한다. 그대가 무슨 일을 하든 말이다.

P197
인생의 성공이란 커다란 한 번의 성취가 아니라, 매일매일의 작은 승부로 직조하는 것이다.

P238
"너희는 공부만 열심히 해. 나머지는 엄마가 다 알아서 해줄게."
사실 엄마가 자식에게 가르쳐야 할 가장 중요한 것이란 공부를 제외한 다른 모든 능력들인데, 엄마들은 오히려 그 능력을 거세시키고 있다. 이게 다 너를 위한 것''이라면서.

P258
지식만 높일 것이 아니라 인생의 지혜도 함께 높여야 한다.

P275
요즘처럼 치열한 경쟁을 뚫기 위해서는 그저 그런 스펙이 아니라 확실한 자기 브랜드가 있어야 한다. 브랜드의 핵심은 '하나의 초점'이다. 그대가 가장 잘하는 것, 그 한 가지에 집중해 그대만의 이야기를 들려주어라.
이러한 전략을 사용하려면 전제되어야 하는 것이 있다. 자신이 무엇을 제일 잘하는지 빨리 깨달아야 한다.

P294
규모가 크건 작건 회사에서 이런저런 경험을 쌓으면서 얼마나 다양한 업무처리의 경력을 쌓았는지를 보여주는 것이 더 효율적이다.

P302
"엄마가 있어 좋다. 나를 예뻐해주셔서. 냉장고가 있어 좋다. 나에게 먹을 것을 주어서. 강아지가 있어 좋다. 나랑 놀아주어서. 아빠는 왜 있는지 모르겠다."

P317
배는 항구에서 더 안전하지만, 그것이 배의 존재 이유는 아니라고 했어. 배는 폭풍우를 견디며 바다에 있을 때 비로소 가치 있는 거야. 



Posted by 톈진난만

댓글을 달아 주세요

오늘은 제 부모님이 주인으로 계시는 로뎀나무 원룸을 소개하려고 합니다. ㅎㅎ 저도 타지에서 대학교 다니면서 자취 이곳저곳에서 정말 많이 해봤는데요, 원룸을 찾을 때 중요하게 고려해야할 것이 방의 퀼리티와 함께 집주인의 성품(?)이더라구요. 그런 면에서 둘 다 완벽하게 만족시켜줄 수 있는 곳이 바로 로뎀나무 원룸입니다! (아들의 입장에서 쓰는 것이라 다소 주관적일 수는 있지만요.ㅎㅎ)


로뎀나무는 세명대 정문에서 도보 2분 거리에 위치하고 있습니다. 최부자순대 바로 뒷집입니다. 가까운 곳에 CU와 GS 편의점도 있습니다. 자취 할 때는 편의점이 가까이에 있는 것도 꽤 중요하죠. ㅎㅎ 


주소: 충북 제천시 대학로 13길 2-7 



▶ 옵션


에어컨, TV, 드럼세탁기, 냉장고, 인덕션, 전자렌지, 더블 사이즈 침대, 책상, 책꽂이, 신발장, 붙박이장, wifi, 넓은 주차장


한마디로 풀옵션입니다.^^ 신축 원룸이라 방과 가전 모두 깨끗합니다. ㅎㅎ 



▶ 원룸 사진


로뎀나무 외부


복도


복도


싱크대, 인덕션, 드럼 세탁기, 찬장


더블 사이즈 침대


전자레인지, 냉장고, 옷장, 티비, 책상


에어컨


특사이즈 신발장

화장실



문의


어머니: 010-2350-5351

아버지: 010-8879-5351


자세한 사항에 관한 문의는 위 연락처로 전화주시거나 문자 주시면 됩니다. ^^ 

Posted by 톈진난만

댓글을 달아 주세요

▶ 영상 내 컬러 개수 감소시키기


컬러 영상의 경우 각 픽셀당 세개의 색으로 표현된다. R, G, B 모두 256개의 값을 가지고 있으므로 총 256 * 256 * 256 = 16,777,216개의 색을 표현할 수 있다. 1600만개가 넘는 수다. 때로는 분석 복잡도를 줄이기 위해서 컬러 개수를 감소시키는 것이 좋다. 컬러를 감소시키는 방법에는 여러가지가 있을 수 있지만 가장 직관적이면서도 간단한 방법을 공부해보려고 한다. 


R, G, B 각 차원당 256개(0~255)인 것을 128개, 64개, 32개, 16개 등으로 줄이기 위한 가장 간단한 방법은 비슷한 밝기세기들을 하나로 취급하는 것이다. 예를 들어 32개로 줄인다고 하면, 0~7에 해당하는 세기는 전부 다 중간세기값에 해당하는 4로, 8~15는 12로, 16~23은 20으로 바꾼다. 이런 식으로 모든 차원에 대해서 감소시키면, 256 * 256 * 256 = 약1600만개였던 컬러개수가 32 * 32 * 32 = 32,768개로 약 3만개로 줄어든다. 그만큼 분석 복잡도가 많이 줄어든다. 이것을 코드로 구현한 것은 아래와 같다. 



#include <iostream>

#include <opencv2/core.hpp>

#include <opencv2/highgui.hpp>


void colorReduce(const cv::Mat &image, cv::Mat &result, int div); 


int main()

{

cv::Mat image = cv::imread("tianjin.jpg");


cv::Mat result;


result.create(image.rows, image.cols, image.type());


colorReduce(image, result, 8); % 채널당 밝기레벨을 32개로 줄임, 256/8 = 32


cv::imshow("before", image);

cv::imshow("after", result);


cv::waitKey(0);


    return 0;

}


void colorReduce(const cv::Mat &image, cv::Mat &result, int div)

{

int nl = image.rows; // 행 개수


std::cout << image.channels() << std::endl; // 이미지의 채널 수 확인, 컬러 영상인 경우 3, 흑백 영상인 경우 1. 


// 각 행의 원소 총 개수

int nc = image.cols * image.channels();


for (int j = 0; j < nl; j++)

{

// j행의 주소 얻기

const uchar* data_in = image.ptr<uchar>(j);

uchar* data_out = result.ptr<uchar>(j);


for (int i = 0; i < nc; i++)

{

// 각 화소 처리

data_out[i] = data_in[i] / div * div + div / 2;

}

}

}




코드 구현결과 약 1600만개의 컬러개수로 표현되었던 이미지가 3만개의 컬러개수로 표현되었다. 외관상 큰 차이를 알아차리기 어렵다. 



원본이미지


div = 8일 때 결과이미지



만약 채널당 컬러개수를 좀더 감소시켜서 4개가 되게 하면, 4 * 4 * 4 = 64개의 컬러로 영상이 표현된다. 쉽게 말해 1300만개의 크래용 대신 64개의 크래용으로 그림을 그린다는 것이다. 아래 결과이미지를 보면 이번에는 원본이미지와 꽤 차이가 있음을 알 수 있다. 좀 더 만화틱해졌다고나 할까. 


colorReduce(image, result, 64); % 채널당 밝기 레벨을 4개로 줄임, 256/64 = 4


div = 64일 때 결과이미지



좀 더 극단적으로 채널당 밝기레벨을 2개로 감소시켜보자. 0부터 127은 모두 64로, 128부터 255는 모두 192으로 매핑된다. 컬러개수는 1300만개였던 것이 2 * 2 * 2 = 8개가 된다. 카메라로 찍은 사진이 마치 손으로 그린 그림과 같아졌다. 


colorReduce(image, result, 128); % 채널당 밝기 레벨을 2개로 줄임, 256/128 = 2


div = 128일 때 결과이미지




▶ 좀 더 알고 넘어갈 것들


1) 컬러 감소 공식


컬러를 감소시키기 위한 코드를 좀 더 자세히 살펴보자. 


data_out[i] = data_in[i] / div * div + div / 2;


입력 영상의 각 채널의 밝기값들을 div로 나눠주는데 div가 정수값이기 때문에 나머지들은 잃게 된다. 그리고 div를 곱해준 후 div/2를 더해준다. 따라서 div가 8인 경우 0부터 7은 모두 4의 값을 갖게 되고, 8부터 15는 모두 12의 값을 갖게 된다. 


0-7 => 4

8-15 => 12

16-23 => 20

...

248-255 => 252


결과적으로 이미지를 표현하기 위해 사용되는 컬러의 갯수가 줄어든다. 



2) const 참조


함수 내에서 참조자를 통한 값의 변경을 진행하지 않을 경우, 참조자를 const로 선언한다. 이렇게 하면 함수의 몸체를 보지 않고 함수의 원형만 봐도 값의 변경이 일어나지 않음을 알 수 있다는 장점이 있다. 



3) create 메소드


create 메소드는 새로운 크기와 타입으로 영상을 다시 할당해야 할 때 사용한다.


result.create(image.rows, image.cols, image.type());


result 영상의 크기와 타입을 원본이미지의 크기와 타입으로 할당해주었다. 컬러 감소시킨 영상을 넣어주기 위함이다.  




<참고자료>

[1] 로버트 라가니에 지음, 이문호 옮김, "OpenCV를 활용한 컴퓨터 비전 프로그래밍 3/e", 에이콘

Posted by 톈진난만

댓글을 달아 주세요

본문


사도행전 18:1-11

1 그 후에 바울이 아덴을 떠나 고린도에 이르러

2 아굴라라 하는 본도에서 난 유대인 한 사람을 만나니 글라우디오가 모든 유대인을 명하여 로마에서 떠나라 한 고로 그가 그 아내 브리스길라와 함께 이달리야로부터 새로 온지라 바울이 그들에게 가매

3 생업이 같으므로 함께 살며 일을 하니 그 생업은 천막을 만드는 것이더라

4 안식일마다 바울이 회당에서 강론하고 유대인과 헬라인을 권면하니라

5 실라와 디모데가 마게도냐로부터 내려오매 바울이 하나님의 말씀에 붙잡혀 유대인들에게 예수는 그리스도라 밝히 증언하니

6 그들이 대적하여 비방하거늘 바울이 옷을 털면서 이르되 너희 피가 너희 머리로 돌아갈 것이요 나는 깨끗하니라 이 후에는 이방인에게로 가리라 하고

7 거기서 옮겨 하나님을 경외하는 디도 유스도라 하는 사람의 집에 들어가니 그 집은 회당 옆이라

8 또 회당장 그리스보가 온 집안과 더불어 주를 믿으며 수많은 고린도 사람도 듣고 믿어 세례를 받더라

9 밤에 주께서 환상 가운데 바울에게 말씀하시되 두려워하지 말며 침묵하지 말고 말하라

10 내가 너화 함께 있으매 어떤 사람도 너를 대적하여 해롭게 할 자가 없을 것이니 이는 이 성중에 내 백성이 많음이라 하시더라

11 일 년 육 개월을 머물며 그들 가운데서 하나님의 말씀을 가르치니라



▶ 묵상


하나님은 아굴라와 브리스길라를 동역자로 바울에게 붙여주셨다. 나는 아굴라와 브리스길라와 같은 동역자가 있는가? 또한 나는 누군가에게 아굴라와 브리스길라가 되어주고 있는가? 


2박 3일간의 부산여행을 통해서 하나님께서 나에게 허락하신 동역자들과 교제하며 즐거운 시간들을 보낼 수 있었음에 너무나 감사했다. 영빈, 정기형 가정을 허락하심에 감사! 토요일에 오후에 인천에서 있을 하연이와 중근이와의 만남도 기대한다. 또한 그 누구보다도 나를 위해서 기도해주시는 가족들, 친척들로 인해 주님께 감사드린다. 


"내가 이 친구에게 복음을 전하면 나를 이상하게 생각하지 않을까? 전하면 과연 믿을까? 관계가 멀어지지는 않을까?" 이런 생각들이 종종 들 때가 있다. 또 실제적으로 직장에서 불이익을 당할 수도 있다. 그래서 복음전하기를 주저한다. 그러나 예수님을 믿지 않을 때의 그 결과를 알기에 전해야한다. "두려워하지 말며 침묵하지 말고 말하라"는 9절 말씀을 기억하자. 

Posted by 톈진난만

댓글을 달아 주세요

▶ 본문


사도행전 16:6-18

6 성령이 아시아에서 말씀을 전하지 못하게 하시거늘 그들이 브루기아와 갈라디아 땅으로 다녀가

7 무시아 앞에 이르러 비두니아로 가고 애쓰되 예수의 영이 허락하지 아니하시는지라

8 무시아를 지나 드로아로 내려갔는데

9 밤에 환상이 바울에게 보이니 마게도냐 사람 하나가 서서 그에게 청하여 이르되 마게도냐로 건너 와서 우리를 도우라 하거늘

10 바울이 그 환상을 보았을 때 우리가 곧 마게도냐로 떠나기를 힘쓰니 이는 하나님이 저 사람들에게 복음을 전하라고 우리를 부르신 줄로 인정함이러라

11 우리가 드로아에서 배로 떠나 사모드라게로 직행하여 이튿날 네아볼리로 가고

12 거기서 빌립보에 이르니 이는 마게도냐 지방의 첫 성이요 또 로마의 식민지라 이 성에서 수일을 유하다가

13 안식일에 우리가 기도할 곳이 있을까 하여 문밖 창가에 나가 거기 앉아서 모인 여자들에게 말하는데

14 두아디라 시에 있는 자색 옷감 장사로서 하니님을 섬기는 루디아라 하는 한 여자가 말을 듣고 있을 때 주께서 그 마음을 열어 바울의 말을 따르게 하신지라

15 그와 그 집이 다 세례를 받고 우리에게 청하여 이르되 만일 나를 주 믿는 자로 알거든 내 집에 들어와 유하라 하고 강권하며 머물게 하니라

16 우리가 기도하는 곳에 가다가 점치는 귀신 들린 여종 하나를 만나니 점으로 그 주인들에게 큰 이익을 주는 자라

17 그가 바울과 우리를 따라와 소리 질러 이르되 이 사람들은 지극히 높은 하나님의 종으로서 구원의 길을 너희에게 전하라 자라 하며 

18 이같이 여러 날을 하는지라 바울이 심히 괴로워하며 돌이켜 그 귀신에게 이르되 예수 그리스도의 이름으로 내가 네게 명하노니 그에게서 나오라 하니 귀신이 즉시 나오니라



▶ 묵상


아시아에서 전도하고 싶었던 바울 일행은 성령의 막으심으로 인해 유럽으로 향하게 된다. 


성령님은 우리의 발걸음을 인도하시는 분이시다. 우리가 하고자 하는 일이, 우리가 가고자 하는 길이 막힐 때 잘 분별해야할 것이다. 다시 도전할 것인지 아니면 하나님이 이것을 막으시는 것은 아닌지. 


합력하여 선을 이루시고, 우리를 선한 길로 인도하시는 하나님에 대한 신뢰가 있다면 너무 낙심할 필요가 없다. 바울 일행이 순종하여 유럽으로 갔기 때문에 유럽의 많은 도시에 복음이 전파되고, 결국에는 유럽을 통해 전세계 곳곳에 복음이 전파되었다. 


박사를 신청하는 과정 중에 있는데 주님의 인도하심을 잘 따라가자. 나의 생각만 앞세우지 말고, 하나님의 말씀과 동역자들을 통해 주시는 조언들과 상황적인 인도하심들을 잘 보며 결정하자. 

Posted by 톈진난만

댓글을 달아 주세요



티스토리 툴바