2015년 2월 20일 금요일

OpenCV - 콘트라스트와 밝기 적용하기

콘트라스트와 밝기는 아래 수식으로 표현된다.
g(x) = \alpha f(x) + \beta

알파는 0보다 큰 콘트라스트 값이다. 베타는 밝기값이다. 는 입력이미지이고 는 출력이미지이다. 정확하게는 아래와 같이 표현할 수 있다.

g(i,j) = \alpha \cdot f(i,j) + \beta

여기에서 i는 이미지에서 x축을 의미하고 j는 y축을 의미한다. 이 함수의 샘플코드는 아래와 같다.


#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

double alpha; /*< Simple contrast control */
int beta;  /*< Simple brightness control */

int main( int argc, char** argv )
{
   /// Read image given by user
   Mat image = imread( argv[1] );
   Mat new_image = Mat::zeros( image.size(), image.type() );

   /// Initialize values
   std::cout<<" Basic Linear Transforms "<<std::endl;
   std::cout<<"-------------------------"<<std::endl;
   std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
   std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;

   /// Do the operation new_image(i,j) = alpha*image(i,j) + beta
   for( int y = 0; y < image.rows; y++ ) {
       for( int x = 0; x < image.cols; x++ ) {
           for( int c = 0; c < 3; c++ ) {
               new_image.at<Vec3b>(y,x)[c] =
               saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
           }
       }
   }

   /// Create Windows
   namedWindow("Original Image", 1);
   namedWindow("New Image", 1);

   /// Show stuff
   imshow("Original Image", image);
   imshow("New Image", new_image);

   /// Wait until user press some key
   waitKey();
   return 0;
}



gray scale이미지일때는 채널(RGB)이 없으므로 아래와 같이 변경되어야 한다.

   for( int y = 0; y < image.rows; y++ ) {
       for( int x = 0; x < image.cols; x++ ) {
           new_image.at<uchar>(y,x) =
           saturate_cast<uchar>( alpha*( image.at<uchar>(y,x) ) + beta );
       }
   }


saturate_cast함수는 대상수치가 지정된 데이터형의 최소값 밑으로 내려간 경우 데이터형의 최소값을 돌려 주고 최대값을 넘어 간 경우 최대값을 돌려 주는 함수다. 즉, 보통 데이터 형이 바뀌면서 표현할 수 있는 비트가 줄어 드는 경우 상위비트를 버리고 하위비트만을 취하면서 이상한 값을 돌려 주는 문제가 발생하는데 saturate_cast는 이런 문제를 해결하기 위한 것이다.


참고링크

http://docs.opencv.org/trunk/doc/tutorials/core/basic_linear_transform/basic_linear_transform.html

OpenCV - 기본적인 이미지 처리 함수


Include에 사용된 파일
실행시에 필요한 DLL파일
#include <opencv2/core/core.hpp>
OpenCV\build\x86\vc11\bin\opencv_core248.dll
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
OpenCV\build\x86\vc11\bin\opencv_imgproc248.dll
#include <opencv2/highgui/highgui.hpp>
OpenCV\build\x86\vc11\bin\opencv_highgui248.dll


OpenCV의 namespace

    using namespace cv;

이미지파일을 읽는 방법

    Mat image;
    image = imread(argv[1], IMREAD_COLOR); // Read the file

imread함수는 첫번째 지정된 파일을 두번째 지정된 형식으로 읽어 들인다. 이때 색상은 RGB순서가 아니고 BGR순서로 저장된다.


특정 범위에 있는 색상을 바꾸는 방법

    // Red를 Green으로 바꾸는 예
    Vec3b upper = Vec3b(0, 0, 255); //B, G, R
    Vec3b lower = Vec3b(0, 0, 255);
    Vec3b with = Vec3b(0, 255, 0);
    Mat mask;

    inRange(image, lower, upper, mask);
    image.setTo(with, mask);

inRange함수는 image에 있는 색상 중 lower이상이고 upper이하인 색상에 대한 마스크를 만들어 mask에 저장해서 돌려 준다. 이때 RGB 세개를 한꺼번에 비교하는 것이 아니라 R이 범위에 들어가는지, G가 범위에 들어 가는지, B가 범위에 들어 가는지 각각 따로 비교해서 모두 범위에 들어 가는 것만 mask대상이 된다.


Mat.setTo함수는 이미지에 있는 색상 중에서 mask로 지정된 부분에 있는 색상을 with로 대체한다.

컬러 이미지를 그레이로 바꾸는 방법

    Mat mat_gray;
    cv::cvtColor(image, mat_gray, CV_BGR2GRAY);

cvtColor함수는 첫번째 인수로 지정된 이미지를 세번째 인수형식으로 바꾼 이미지를 두번째 인수로 돌려 준다.

이미지 크기를 바꾸는 방법

    double factor = 3.0;
    Mat mat_sized;
    int width = (int)(mat_gray.size().width * factor);
    int height =  (int)(mat_gray.size().height * factor);
    cv::resize(mat_gray, mat_sized, Size(width, height));
resize함수는 첫번째 인수로 지정된 이미지를 세번째 크기로 바꾼 이미지를 두번째 인수로 돌려 준다.

이미지파일 저장

    cv::imwrite( filename, mat_sized);


OpenCV - Visual Studio 2012 설정하는 방법

OpenCV는 영상 또는 그래픽처리에 필요한 각종 알고리즘을 구현한 라이브러리로서 C++, C, Python과 Java용 인터페이스를 갖고 있고 Windows, Linux, Mac OS, iOS와 Android를 지원한다.

Windows용 라이브러리 설치하는 방법

1. Windows용 OpenCV를 다운로드 한 후 압축을 푼다.

2. OpenCV폴더용 시스템변수를 만든다.

setx -m OPENCV_DIR D:\OpenCV\Build\x86\vc10     (Visual Studio 2010 - 32 bit Windows)
setx -m OPENCV_DIR D:\OpenCV\Build\x64\vc10     (Visual Studio 2010 - 64 bit Windows)

setx -m OPENCV_DIR D:\OpenCV\Build\x86\vc11     (Visual Studio 2012 - 32 bit Windows)
setx -m OPENCV_DIR D:\OpenCV\Build\x64\vc11     (Visual Studio 2012 - 64 bit Windows)

Visual Studio 2012 설정하는데는 두가지가 필요하다.

  • 컴파일에게 라이브러리가 어떻게 구성되어 있는지 알려 주어야 한다.
  • 링커에게 사용된 함수와 데이터를 어디에서 가져 와야 하는지 알려 주어야 한다.
1. C/C++ ‣ Additional Include Directories지정 ... $(OPENCV_DIR)\..\..\include


2. Linker  General ‣ Additional Library Directories지정 ... $(OPENCV_DIR)\lib


3. Linker ‣ Input ‣ Additional Dependencies지정


opencv_core248.lib

opencv_imgproc248.lib
opencv_highgui248.lib
opencv_ml248.lib
opencv_video248.lib
opencv_features2d248.lib
opencv_calib3d248.lib
opencv_objdetect248.lib
opencv_contrib248.lib
opencv_legacy248.lib
opencv_flann248.lib

파일이름 형식 ... opencv_(모듈이름)(버전번호)(d=디버그용일때).lib






Capture2Text - OCR 인터페이스

OCR(Optical Character Recognition)은 인쇄된 글자 또는 손으로 쓴 글자를 읽어 들이는 기술이다. 이를 위해 일단 이미지파일로 만든 후 이 이미지파일을 텍스트로 전환하는 두 단계로 진행될 것 같다. 그런데 컴퓨터 모니터에 쓰여져 있는 글자는 어떻게 읽을 수 있을까?

읽을려고 하는 대상이 윈도우즈상에서 텍스트로 표시된 것이라면 스크린텍스트를 읽어 내는 툴을 사용하면 된다. 하지만 텍스트로 표시된 것이 아니라 그림으로 그려진 것이라면 어떻게 할 것인가. 일단 화면상에 표시된 내용을 이미지로 저장한다. 그 후 OCR 도구를 사용하면 될 것이다. Capture2Text는 이 두 단계를 엮어 주는 툴이다.



Capture2Text는 다음과 같은 순서로 실행된다.

1. 지정된 화면을 이미지 파일로 만든다.

Output\screen_capture.bmp

2. 인식율을 높이기 위해 leptonica_util.exe를 이용해서 이미지파일 크기를 두배로 키우고 흑백 이미지파일로 바꾼다.

Utils\leptonica_util\leptonica_util.exe Output\screen_capture.bmp Output\screen_capture_scaled.bmp 3

3. OCR도구인 tesseract.exe를 이용해서 이미지를 텍스트로 바꾼 후 인식된 텍스트를 클립보드에 복사한다.

Utils\tesseract\tesseract.exe Output/screen_capture_scaled.bmp Output/ocr -l eng -psm 3

-l eng : 영문모드
-psm 3 : 페이지 자동 인식모드

2015년 2월 16일 월요일

유명(幽明)을 달리하다.

아내의 큰 오빠인 형님이 유명(幽明)을 달리했다. 유명이란 말이 어두운 것과 밝은 것을 말한다고 하니 결국 밝은 것과 멀어진 것이 되었다. 혹은 평상시의 믿음대로 더 밝은 곳으로 갔는지도 모르겠다.

몇 해동안 이런 저런 이유로 만나지 못했다. 그러다 지난 금요일 오후에 뇌경색으로 쓰러졌다는 전화 연락을 받았다. 나는 장인어른을 보질 못했다. 아내가 어렸을때 장인어른이 돌아 가셨기 때문이다. 그리고 아내는 형님을 아버지처럼 여기고 자라났다. 쓰러졌다고 말하면서 흐느끼는 전화 속 목소리에서 그 충격을 그대로 느낄 수 있었다. 화요일부터 연락이 안되었는데 목요일 저녁이 되에서야 뇌졸중인 상태로 발견 되었다 한다. 병원에서는 이런 상태에서 살아 있는 것이 기적적이라고 하면서 며칠간 상태를 지켜보다가 집중치료실로 옮겨도 되겠다고 했단다.



토요일 아침 10시 면회시간에 맞춰 중환자실에 있는 형님을 보러 갔다. 입에 호스를 연결하고 겨우 몸 하나가 들어 갈 만한 조그만 이동식 침대에 누워 있다. 침대 윗쪽은 15도 정도 올려져 있고 침대가 짧아서 그런지 목은 뒤로 젖혀져 있는 모양세다. 왼쪽 손가락에는 혈압 재는 기계가 연결되어 있고 오른쪽 손에는 주사관이 연결되어 있다. 왼쪽발은 침대끝에 삐져 나온 침대보에 싸여 있고 오른쪽발은 담요 밖으로 나와 있다.

담요는 얇은 천으로 되어 있는데 두겹으로 접혀 있다. 저걸 펴면 온몸을 감쌀 수 있을 정도의 크기인데 반으로 접혀져 있으니 간신히 가슴아래부터 발목 위까지만 덮어 놓은 상태다.

눈은 감고 있고 숨 쉬는 가슴은 억지로 심호흡을 하듯 숨을 가쁘게 몰아 쉬고 있다. 어디서 본듯한 모습이다. 나중에 생각해보니 죽음을 소재로한 다큐에서 본 어떤 사람의 마지막 모습과 유사했다.

상태가 어떤지 궁금해서 CT는 찍었는지 아주머니께 물었더니 그렇단다. 그럼 CT사진은 보았는지 의사한테 설명은 들었는지를 물었더니 그런 것을 보아도 잘 모르니 보면 뭐하냐고 한다. 그도 그럴 것도 같다. 하지만 나중에 되돌아 보니 이런 상황을 처음 격는 가족은 지금 당황해서 무엇을 해야 하는지 모르고 있었던 것이다. 그러나 병원은 다르지 않는가. 그들에게는 이런 일이 일상이고 가족들이 무엇을 해야 하는지 잘 알고 있을 터이다. 그러면 환자의 상태를 정확히 알려 주고 어떤 가능성이 있는지 그리고 지금 가족들이 무엇을 준비해야 하는지 알려 주어야 한다. 그런데 CT사진은 물론이고 자세한 설명도 듣지 못했다는 것이 나로서는 이해가 되지 않는다.

내가 왔다고 옆에서 말을 하니 말은 하지 못하고 고개만 끄덕인다. 자세히 보니 왼쪽 팔다리는 마비된 듯 전혀 움직임이 없고 오른쪽은 팔다리는 조금씩 움직이고 있다. 오른쪽 다리가 불편한지 다리를 구부려 올린다. 짧은 담요때문에 옆으로 무릎까지 보인다. 무릎 주변에 발긋 발긋한 것이 보이는 것이 마치 찰과상에 난 것처럼 보인다. 뇌경색환자에게 놓는 혈전용해제를 맞는 것이 아닌가 하는 생각이 잠시 든다. 주변에서 이런 저런 말을 하니 고개를 끄덕이며 반응을 보인다.

침대가 좀 좁은 것 아닌가 싶었는데 오른쪽에 있는 보통 환자용 침대에 있다가 CT촬영을 위해 작은 이동식 침대로 옮겼다고 한다.

물을 찾는 듯한 신음소리에 물을 말하는 것이냐고 물어 보니 고개를 끄떡인다. 기도로 물이 흘러 들어가면 위험해서 물은 주지 못한다고 한다. 간호원한테 거즈로 입을 좀 닦아 달라고 하니 CT촬영후에 해 주겠단다.  왜 CT촬영후에 해 주어야 하는지 모르지만 여기가 중환자실이고 여기 있는 의료진이 전문가이니 왜 그래야 하는지 따지고 묻기가 쉽지 않다. 그냥 그 말을 따르는 수 밖에 다른 수가 없다. CT촬영 끝날때까지 좀 참으라고 말하니 다시 고개를 끄덕인다.

한 여의사가 와서 혈액검사 결과가 좋지 않으니 신장투석을 하는 것이 좋겠다고 한다. 그 과정에 감염이나 호흡곤란등 부작용이 나타날 수 있지만 의료진이 모니터링을 할 것이니 큰 문제는 없을 것이라고 한다.

면회시간 30분이 거의 끝나갈 무렵 여의사 한명과 간호사로 보이는 남자 한명이 침대를 이동하기 시작한다. CT촬영실까지 함께 갔다. CT촬영실 바로 앞에서 잠시 대기하는 동안 다시 담요가 짧은 것이 맘에 걸린다. 이걸 펴서 덮어주면 좋겠다고 동행한 여의사에게 말했더니 안에 들어 가면 어차피 걷어 내니 그럴 필요 없단다. 그러고 보니 이 의사 한 손에는 테이크아웃 커피가 들려 있다. 아내가 담요를 하나 더 달라고 해서 가져왔다. 또 절반이 접힌 상태로 덮어 주려고 한다. 아내가 가로채서 활짝펴서 온몸을 감쌓주니 이제 훨씬 따뜻해 보인다.

여전히 숨이 가쁘고 이따금 코를 고는 듯한 소리를 낸다. 잠을 자는 것이라고 한다. 하지만 옆에서 이야기하는 것에 금방 반응하는 것으로 보아서 자는 것이 아니고 아마도 기력이 떨어져 목에 힘을 제대로 주지 못해서 거친 숨소리가 나는 것이 아닌가 싶다.

CT촬영시간이 되었는지 침대는 CT촬영실로 들어 갔다. 그 사이 아내는 화장실에 갔다. 아주머니께 형님이 어떤 주사를 맞고 있는지 물으니 잘 모르겠단다. 머리에 상처가 있었다고 들었다고 했더니 머리의 상처는 외상은 아니고 내부출혈이 외부로 흘러 나온 것이라고 한다.

10분정도 지나자 CT촬영실에서 나온다. 보통 CT촬영에는 시간이 많이 걸리지 않으니 촬영이 끝났나 싶었는데 알고 보니 다른 중환자가 촬영중이여서 나중에 촬영해야 한다고 한다. CT촬영실에서 돌아 오는 길에 현재 맞고 있는 주사가 무슨 주사인지 여의사한테 물어 보았더니 인턴이여서 잘 모르겠단다. 중환자를 이동할때는 환자상태를 잘 아는 의사가 동행해야 하는 것 아닌가 싶다. 그래야 긴급한 상황이 발생하면 제대로 대처할 것 아닌가.

요즘 모든 것이 컴퓨터로 연결되어 있지 않은가. CT촬영도 예약을 해서 운영하는 것으로 알고 있다. 그렇다면 중환자를 최소한 30분이상 (얼마나 더 그랬는지 모르지만) 좁은 침대위에 눞여 놓고 있다가 CT촬영실까지 들어 가서 눈으로 직접 보지 않아도 컴퓨터 모니터 들여다 보면 아니 CT촬영실에 전화라도 좀 해 보면 언제 가야 하는지 금방 알 수 있는 일일 것이다. 환자상태도 제대로 모르는 인턴에게 CT를 찍어 오라고 시키고 이 인턴은 일단 환자를 이동용 침대에 옮겨 놓고 다른 일 좀 보다가 와서 침대를 끌고 CT촬영실에 가서 보니 아직 아니네 하고 돌아 올 일은 아닐 것이다.

다시 중환자실로 들어 가는 형님을 뒤로하고 발길을 돌렸다. 아내는 형님이 회복되는데 시간이 많이 걸릴 것으로 보고 있었지만 내가 보기에는 회복되기 쉽지 않아 보였다.

오후에 고향에서 처형이 올라 오고 저녁 7시 면회시간에 맞춰 아내와 함께 둘이서 집을 나섰다. 저녁 11시경 TV를 보고 있는데 집으로 전화가 왔다. 병원에서 말하기를 오늘 밤을 넘기기 힘들다고 한단다. 그래서 고향에서 가족과 형제들이 모두 올라 오고 있단다. 신장투석을 하는 중에 혈압이 떨어져서 혈압을 올릴려고 했는데 부정맥이 있어서 심폐소생술까지 했다는 것이다.

일요일 아침 10시경에 다시 병원을 찾았다. 대기실에는 고향에서 올라 온 가족들이 모두 모여 있었다. 모두들 이미 보고 왔으니 나도 보고 오란다. 말을 건네라고 하는데 무슨 말을 건네야 하는 거냐고 하니 작별인사를 하란다. 가 보니 어제보다 더 많은 튜브가 입과 목에 붙어 있고 주사약이 포도송이처럼 주렁 주렁 매달려 있는 키 높은 스탠드가 침대맡에 놓여 있다. 의식은 전혀 없었지만 호흡은 편하게 쉬고 있었다. 사람의 청각은 최후의 순간까지 살아 있다고 했던가. 귀에 대고 그동안 수고하셨고 편히 가시라고 했다. 그리고 나도 모르게 그랬다. 나중에 또 뵙자고... 사후세계가 있는 걸까? 난 잘 모르겠다. 있을 것 같지는 않지만 없다는 것을 증명할 수도 없으니...

잠시 머물러 있다보니 어제와는 다른 여의사가 와서 가족이 다 왔는지 묻는다. 현재 심장은 강력한 약으로 기계적으로 뛰고 있다고 한다. 그리고 모든 가족이 다 보면 주사약을 제거하는 것으로 이미 가족들과 합의를 본 듯 하다.

그리고 병실밖으로 나오니 무거운 침묵만이 흐른다. 좀 있다 이야기를 들어 보니 이미 장례식장이나 장지까지 이야기가 된 상태다. 그리고 12시경 모두가 지켜보는 앞에서 주사약이 제거되고 영면에 들었다. 이 모습을 보고 장모님과 가족 몇몇이 오열을 한다. 장모님을 비롯해서 형제들 대부분은 형님의 마지막 얼굴만 보았을 뿐이다. 그나마 의식이 있을 때 말을 건넨 사람은 나를 비롯해서 불과 몇사람 되지 않는다. 만약 병원측에서 환자의 정확한 상태를 알려 주었다면 신장투석을 하기 전에 의식이 있을 때 말이라도 건넬 수 있었을 것이다.

시신을 운구할 엠블런스 도착이 늦어지자 두세명의 가족만 남기고 나머지는 장례식장으로 이동했다. 상조회 팀장이 와서 계약된 상품에 대해 설명하고 조금 있으니 조문객들이 오기 시작한다.

월요일 아침 9시에 입관식이 시작 되었다. 나도 이제 이런 것을 볼 때가 되었구나 하는 생각이 든다. 알콜을 묻힌 천으로 몸을 닦아 내고 한지로 팔과 발을 감싼 후 버선과 장갑을 끼운다. 바지저고리를 입히고 노란빛 나는 두루마기를 입히고 난 후 마지막으로 얼굴을 보라고 하자 이곳 저곳에서 오열이 터진다.



오후가 되자 조문객이 또 밀려 온다. 옆 병실을 보니 복도 좌우로 근조조화가 빼곡히 서있다. 내가 죽으면 몇개나 저런 조화가 서 있을까. 이미 죽었는데 그게 무슨 의미가 있겠는가. 이런 것의 의미는 산 사람들에게나 있는 것이다. 내가 죽으면 유엔사무총장, 오바마 대통령, 클린턴대동령, 대한민국대통령, 국무총리, 법무장관 이름등으로 근조조화를 사다가 세워 놓으라고 하니 재미있어 한다. 농담으로 한 소리인데 정말 그렇게 해 주겠단다.

오랜만에 보는 친척들 이야기가 여기 저기에서 피어 난다. 가족 형제들은 토요일 저녁에 상경해서 잠도 제대로 자지 못했다. 하물며 밥은 제때에 먹을 수 있었겠는가. 갑자기 닥친 이별과 슬픔과 충격에 모두들 치쳐 있을 것이다. 돌아서서는 다시 눈물을 흘리겠지만 이제 슬픈 기색보다는 피곤한 기색이 더 뚜렷하다. 다른 장례식장 분위기도 비슷해 보인다. 조문객들이 모여서 고인의 이야기로 몇마디를 하겠는가. 저마다 자기들 사는 이야기를 하는 것일 게다. 일종의 사교 모임과 비슷해 보인다. 회비를 내고 모여서 근황을 이야기 하고 들으면서 시간을 보내다 간다. 그리고 그 회비는 장소 대여비, 음식비, 기타 비용등으로 들어 간다. 죽은 사람이 이런 기회를 만들어 준다. 누구나 한번은 죽게 되어 있으니 이런 장례문화가 바뀌지 않는 한 사람은 죽어도 장례사업은 죽지 않을 것이다.



어차피 계속될 장례문화라면 장례식장이라도 좀 바뀌었으면 좋겠다. 무엇보다도 온돌방에 앉아 있기가 너무 힘들다. 입식으로 바뀌면 어떨까. 그리고 오랜만에 만난 사람들과 이야기를 하는 것도 좋지만 그보다는 고인에 대한 추억을 공유하는 시간도 좀 있었으면 좋겠다는 생각도 든다.

화요일 아침 7시에 발인예배가 끝나고 7시 30분에 선산으로 가는 버스에 몸을 실었다.



중간에 화장터에 들렀다. 조카들이 10시 30분 리무진에서 관을 운구해 대기중인 이동용 카트에 옮겨 실었다. 안내원이 나와 화장로로 인도한다. 영정사진과 위패가 그 뒤를 따른다. 카트에 실린 관과 유족과 친척이 차례로 줄지어서 간다. 화장로 문이 열리고 관이 들어 간 후 문이 닫힌다.  이제 기다리는 일만 남았다. 기다리는 동안 식사를 마쳤다. 화장 시간표를 보니 일반 화장은 모두 오전에 배치되어 있고 기타 유골화장등은 오후에 배치되어 있다. 그 것도 대부분 10시 30분에 집중되어 있는 것으로 보아서 아마도 기다리는 동안 식당에서 식사를 하라고 시간을 그렇게 정한 것으로 보인다.

11시 40분경 골분을 받는 곳으로 갔다. 철재 선반 위에 화장 후 남은 것으로 보이는 흰색 유골이 꽤 많이 보인다. 방진마스크를 쓴 화장터 직원이 유골을 쓸어 담아 뒷방으로 가져 간다. 잠시 후 유골을 분쇄하는 듯한 둔탁한 소리가 두세번 들린다. 그리고 골분을 담은 통을 들고 나타나더니 유골함에 한지로 된 봉투를 먼저 넣고 그 안에 골분을 담고 흰천으로 싸서 유족에게 건네 준다.

화장로 번호표로 유족을 확인을 하는 것 같았는데 다른 화장로와 바뀌어도 알 방법이 없어 보인다. 화장로에서 유골이 남은 선반을 꺼내 오는 것이나 화장로 번호와 대조하는 것이 모두 직원들이 하는 일이고 이 직원들은 언제든 실수를 할 수 있는 보통사람들이기 때문이다. 그런데 설사 바뀐다 해도 사람 뼈 성분이 그렇게 많이 다를까 싶기는 하다.

젊을 때는 죽은 뒤에 화장 한다는 것을 도저히 받아 들일 수 없었다. 종교적인 믿음때문에 화장하는 것을 이해 못하는 것은 아니였다. 하지만 그런 믿음이 없는 나로서는 우선 내가그런 불길속에 넣어 진다는 것이 싫었다. 그리고 다 태우고 남은 재로 무슨 무덤을 만든단 말인가. 더우기 그 것을 유골함에 넣어서 납골당에 진열되듯 안치되는 것은 더더욱 이해하기 힘들었다. 시신이 온전히 묻힌 무덤 앞에 설때만이 고인이 그 자리에 있다고 느껴질 것이라는 생각때문에 다른 방법을 용납하기 어려웠다.

하지만 고인을 떠올리는 것은 산자가 해야 할 일이다. 재를 묻어 놓고도 그 자리에 서서 고인이 생각난다면 그렇게 하면 될 일이다. 몸을 온전히 묻어 놓으면 무엇하나. 아무도 찾는 이가 없다면 무슨 의미가 있겠는가. 그러느니 화장하는 것이 백번 나은 일이다. 화장을 하게 되면 완전히 빛으로, 열기로, 에너지로 이 우주로 다시 돌아 가는 것이다. 그리고 남는 재는 땅으로 돌아 가는 것이 아니겠는가.

나를 사랑해 주셨던 할머니가 생각난다. 할머니를 찾아 뵙지 못한지도 오래 되었다. 할아버지 산소 옆에 묘를 만들면서 비석을 세우지 못했다. 그 후에 작은 할머니 묘가 이장되어 오면서 이제 셋 중 어느 묘가 할머니 묘인지 기억도 가물 가물해 졌다. 한 때는 할아버지와 할머니 그리고 아버지 묘를 정리해서 한군데로 모을 생각을 했다. 그리고 그 옆에 내가 자리하면 좋겠다고 생각했다. 하지만 삶이 바쁘고 모든 것이 생각대로 되지 않으면서 그런 것이 모두 부질 없어 보이고 쓸데없는 생각이라는 것을 알았다.



유족이 유골함을 들고 선산으로 향했다. 불과 몇달전에 형님이 직접 정리하신 선산이라고 한다. 전통식 묘지가 5기 정도 들어 갈 만한 공간이다. 조상묘에 있는 유골을 화장해서 매장하고 그 위에 평평한 비석을 세운 모양이다. 이렇게 해 놓으니 묘가 50기가 들어 가고도 남을 만한 공간으로 바뀌었다. 위쪽에는 제단도 만들어 놓았다.

준비된 비석 바로 위에 유골을 묻기 위해서 땅을 파는데 추운 날씨때문에 땅이 얼어서 잘 파지지 않는다. 몇 사람이 번갈이 가면서 땅을 파서 유골을 묻을 만한 공간을 만들었다. 유골함에서 한지에 쌓인 유골을 꺼내서 구덩이에 놓고 미리 준비한 황토로 덮는다. 전통식 매장절차라면 아마도 제사가 진행되었을 것으로 생각되지만 고인의 신앙에 따라 하관예배가 진행되었다.



다른 길로 들어 선 사람과의 시간은 이제 가슴에 묻고 모두 다시 일상으로 돌아 갈 시간이다. 때때로 가슴에 묻은 시간들이 튀어 나와 남은 사람들을 힘들게 하겠지만 그런 시간들이 망각속으로 사라질 때까지 기다리는 수 밖에 별 다른 수가 있겠는가.