IDL/Image Processing

IDL에서의 라돈 변환(Radon Transform) 사용법

이상우_idl 2021. 4. 7. 17:38
728x90
반응형

라돈 변환(Radon Transform)은 이미지 처리 기법들 중 하나로서, 원래는 의료나 지질학 등의 분야에서 단층촬영(Tomography) 데이터를 2차원 이미지로 변환하는데 사용되기 시작했다고 합니다. 원론적으로는 2차원 이미지와 같은 공간 도메인(Spatial Domain) 데이터를 라돈 도메인(Radon Domain) 데이터로 변환하거나 또는 그 반대로 라돈 도메인의 데이터를 공간 도메인의 데이터로 역변환(Backprojection)하는 경우들이 있습니다. 앞서 언급한 단층 촬영 데이터 자체는 이미 라돈 도메인의 데이터이기 때문에 이를 2차원 이미지라는 공간 도메인 데이터로 역변환을 해야 우리가 볼 수 있는 가시화된 이미지가 됩니다. 하지만 그러한 용도 외에도 2차원 이미지 상에서 특정한 모양이나 패턴을 찾아내고자 할 경우, 이미지 데이터에 대하여 라돈 변환과 역변환 기법을 적용하면서 약간의 추가적인 처리 과정들을 중간중간에 가미하는 방법을 사용하기도 합니다.

 

물론 IDL에서도 이러한 작업을 할 수 있습니다. 바로 RADON 함수가 그러한 역할을 합니다. 오늘은 이 RADON 함수를 이용하여 라돈 변환 작업을 수행하는 방법에 관하여 간단한 예제와 함께 소개해보도록 하겠습니다. IDL 도움말에서 이 RADON 함수에 관한 내용을 찾아보면 기본적인 원리에 대하여 수식들과 그림을 통하여 나름 자세히 설명되어 있습니다. 여기 소개된 그림만 보면 다음과 같습니다.

 

 

제가 라본 변환의 원리에 관하여 여기서 자세히 설명을 하기는 힘듭니다. 하지만 그냥 기본적인 내용만 언급한다면, 위 그림에서와 같이 2차원 이미지 상의 원점(이미지 내의 한가운데 지점)으로부터 특정한 각도 및 거리만큼 떨어진 위치로 연결되는 선과 수직을 이루는 선을 따라서 이미지의 화소값들을 선적분(Line Integral)한 적분값을 계산하는 것입니다. 선적분이라고 해서 별 대단한 것은 아니고 그냥 선 상의 화소값들을 모두 합친다는 의미입니다. 이러한 선적분을 모든 각도 및 거리들에 대하여 수행하고 그 결과를 위 그림 우측과 같은 라돈 도메인 상에 표시합니다. 위 그림을 보면 라돈 도메인에서는 X축이 각도 값들에 해당되고 Y축이 거리 값들에 해당됩니다. 선적분의 값이 높으면 라돈 도메인에서의 그 좌표값도 높게 나타납니다. 사실 라돈 도메인도 일종의 2차원 공간이므로 가시적으로는 마치 이미지처럼 보이게 되는데, 이 안에서 값이 높은 점(Point)이 된다는 것입니다. 선적분의 값이 크다는 것은 원래의 이미지 상에서 충분한 거리에 걸쳐 나름 높은 값이 유지되는 형체가 있다는 의미가 되며, 이러한 특성을 라돈 변환에 의하여 직접 확인할 수 있다 정도로 이해하면 될 것 같습니다. 만약 라돈 변환에 관한 더 자세한 이론이 궁금하시다면 웹상의 검색 등을 통하여 직접 확인해보실 것을 권장합니다.

 

그러면 복잡한 설명은 일단 이 정도로 해두고 예제를 한번 살펴보겠습니다. 라돈 변환에 대한 직관적인 설명을 위해서는 아무래도 실전 이미지보다는 적절하게 생성된 가상 이미지를 사용하는 것이 좋을 것 같습니다. 따라서 다음과 같은 과정에 의하여 가상의 2차원 이미지 데이터를 생성합니다.

 

x = (LINDGEN(256, 256) MOD 256) - 127.5

y = (LINDGEN(256, 256)/256) - 127.5

radius = 0.5*SQRT(x^2 + y^2)

img = FLOAT(radius LT 50)

img = img + RANDOMU(seed, 256, 256)*3

HELP, img

PRINT, MIN(img), MAX(img)

sz = SIZE(img, /DIM)

 

여기서는 전반적으로 잡음(noise)이 존재하는 가운데 원형의 형체가 어렴풋이 보이는 모습을 보이는 2차원 이미지 데이터를 256x256의 구조를 갖는 img라는 배열로 생성한 것입니다. HELP와 PRINT 명령에 의하여 출력된 내용을 보면 다음과 같습니다.

 

IMG             FLOAT     = Array[256, 256]

  0.000137994      3.99991

 

배열 img를 생성하는 과정에서 RANDOMU 함수를 사용하여 난수값들이 포함되었기 때문에, 위의 예제 코드를 실행할 때마다 출력된 값들은 매번 달라질 수 있습니다. 하지만 대략적으로 0~4의 범위를 갖는 실수값들로 구성된 배열임을 알 수 있습니다. 그러면 이 배열을 다음과 같이 이미지로 표출해봅시다.

 

win0 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)

im0 = IMAGE(img, MARGIN=0, /CURRENT)

 

그 모습은 다음 그림과 같습니다.

 

 

앞서 언급했던 것과 같이 전반적으로 잡음과 같은 자잘한 패턴들과 함께 중심부에 어렴풋이 원형의 형체가 보입니다. 그러면 이러한 원본 데이터를 대상으로 라돈 변환을 시도해봅시다. 사실 그 과정 자체는 다음과 같이 RADON 함수를 사용하여 꽤 간단하게 처리할 수 있습니다.

 

result = RADON(img, RHO=rho, THETA=theta)

HELP, result

PRINT, MIN(result), MAX(result)

HELP, rho, theta

PRINT, MIN(rho), MAX(rho)

PRINT, MIN(theta), MAX(theta)

 

여기서 RADON 함수의 내용을 보면, 대상 배열인 img가 인수로 투입되었고 그 외에도 RHO, THETA 키워드가 사용되고 있습니다. 이 키워드들은 input의 역할이 아니라 output의 역할을 합니다. 즉 위의 내용에서는 이 키워드들을 통하여 rho, theta라는 항목들을 돌려받은 것입니다. 결국 위의 내용이 실행되면 라돈 변환의 결과 데이터인 result를 비롯하여 rho, theta까지 3종의 항목들을 output으로 얻게 됩니다. HELP와 PRINT 명령에 의하여 출력된 내용은 다음과 같습니다.

 

RESULT          FLOAT     = Array[805, 511]

      0.00000      790.173

RHO             FLOAT     = Array[511]

THETA           FLOAT     = Array[805]

     -180.312      180.312

      0.00000      3.13769

 

즉 라돈 변환의 결과 자체인 result는 805x511의 구조를 갖는 2차원 배열로 얻어졌고 그 값들의 범위는 대략 0~813 정도입니다. 그리고 rho의 경우는 511개의 값들로 구성된 1차원 배열이고 값 범위는 대략 -180.3~180.3 정도입니다. 값들의 갯수가 511개인 이유는 원본 데이터 배열인 img의 구조가 256x256이고 이 때 대각선 방향의 길이가 약 360.6이기 때문입니다. 그리고 theta의 경우는 805개의 값들로 구성된 1차원 배열이고 값 범위는 대략 0~3.14 정도입니다. 사실 이 값들은 라디안(Radian)값들로서 선적분을 하는 선의 각도에 해당됩니다. 즉 도(Degree) 단위로 생각하면 0~180도의 범위 내에서 자잘하게 분할된 각도들 각각에 대하여 선적분이 수행되었다고 보면 됩니다. 어쨌든 이러한 결과를 얻었다면 일단 그 모습을 시각적으로 확인해야 하므로 다음과 같이 이미지의 형태로 표출하되 X, Y축도 추가하는 것이 좋습니다.

 

win1 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)

im1 = IMAGE(result, theta, rho, AXIS_STYLE=2, $

  XTITLE='theta (radian)', YTITLE='R', $

  ASPECT_RATIO=0, MARGIN=0.1, FONT_SIZE=10, /CURRENT)

 

이렇게 표출된 라돈 변환 결과의 모습은 다음과 같습니다.

 

 

이것은 공간 도메인에 있던 원본 이미지 데이터를 라돈 도메인으로 변환한 것이기 때문에, 당연히 원본 데이터 이미지의 모습과는 완전히 다릅니다. 사실 라돈 도메인에서 왜 이런 모습이 되는가에 대해서 이해하려면 라돈 변환에 관한 기본적인 이론에 대한 이해가 필요한데, 여기서는 제가 이러한 내용까지 자세히 언급하기가 좀 힘듭니다. 이 부분에 대해서는 앞서 맨 처음에 제시했던 IDL 도움말의 내용을 참조하거나 아니면 웹상에서 검색 가능한 Radon transform에 관한 내용들을 참조하시기 바랍니다.

 

물론 원본 데이터인 img의 패턴을 고려한다면, 방금 얻은 라돈 변환 결과인 result의 모습에 대한 이해가 어느 정도는 가능합니다. 먼저 이 라돈 변환 결과 그림에서 Y축의 값이 100보다 크거나 -100보다 작은 부분을 보면 전반적으로 매우 어둡습니다. 즉 이 부분의 값들이 전반적으로 매우 낮다는 의미입니다. 그 이유는 rho의 절대값이 큰 부분이 원본 이미지 상에서는 원형의 형체 외곽에 해당되는 부분이고, 이러한 부분에 대하여 얻어진 선적분 값들이 전반적으로 낮을 수 밖에 없기 때문입니다. 반면 라돈 변환 결과 그림에서 Y축의 값이 100보다 작고 -100보다 큰 가운데 부분의 경우는 선적분의 선(Line)들이 원형의 형체 안쪽을 거치기 때문에, 그 형체의 내부를 얼마나 많이 지나느냐에 따른 차이는 있겠지만 전반적으로는 어느 정도 높은 선적분 값들이 산출됩니다. 이러한 부분들이 라돈 변환 결과 그림에서는 흰색에 가깝게 밝게 보이게 됩니다.

 

따라서 원본 이미지 데이터에서 원형의 형체를 띄었던 부분이 라돈 변환 결과 그림에서 어떤 부분에 해당되는가를 따져보는 것이 라돈 변환에 대한 이해에 도움이 될 것 같습니다. 바로 다음 그림에서 붉은 사각형으로 표시된 부분입니다.

 

 

만약 실제로 원본 데이터 상에서 이러한 원형의 형체로 나타나는 부분에 대한 정보를 뽑아내는 것에 주목한다고 하면, 라돈 변환 결과 데이터인 result에서 위의 그림과 같은 붉은색 사각형에 해당되는 부분을 효과적으로 추출하기 위한 뭔가 추가적인 처리를 해주는 것이 필요할 수도 있습니다. 사실 그 방법에는 여러가지가 있을 수 있겠지만, 여기서는 다음과 같이 클리핑(Clipping) 기법을 적용해보기로 하겠습니다.

 

result = result > 200

 

이렇게 하면 result 배열 내에서 200보다 작은 값들을 모두 200으로 통일시켜버리게 됩니다. 이러한 처리를 거친 result의 모습을 보기 위하여 다음과 같이 별도의 그래픽 창에 동일한 요령으로 result를 표출해봅시다.

 

win2 = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)

im2 = IMAGE(result, theta, rho, AXIS_STYLE=2, $

  XTITLE='theta (radian)', YTITLE='R', $

  ASPECT_RATIO=0, MARGIN=0.1, FONT_SIZE=10, /CURRENT)

 

그 모습은 다음과 같습니다.

 

 

지금의 모습과 바로 이전의 모습을 비교해보면, result에 대하여 어떤 처리가 적용된 것인지 확인할 수 있습니다. 이와 같은 처리를 result에 대하여 적용하면, 200보다 작은 값들을 모두 200으로 통일시킴으로써 200보다 작았던 원래 값들에 대한 정보를 없애버리는 셈입니다. 왜냐하면 result 배열의 값들 각각이 바로 선적분 값들인데, 선적분 값들이 일정 기준 이하이면 주로 잡음에 해당되는 부위에 대한 값들이나 마찬가지이기 때문에 그러한 정보들은 불필요한 것으로 간주하고 그 영향을 제거하기 위하여 이와 같이 클리핑 처리를 해버린 것입니다. 이렇게 하면 앞서 라돈 변환 결과 그림 상에 붉은색 사각형으로 표시했던 부분만을 좀 더 강조하는 효과를 얻을 수 있습니다. 물론 클리핑 과정에서 사용한 200이란 값은 제가 판단하여 사용한 값을 뿐이며 분석자의 판단에 따라 얼마든지 다른 값이 될 수도 있습니다. 어쨌든 여기서는 관심의 대상이 되는 부분을 강조하기 위하여 클리핑 기법을 사용하였지만, 그 외에도 예를 들어서 rho의 절대값이 100보다 큰 부분에 대하여 아예 인위적으로 0으로 처리를 해버리는 방법 등 여러가지 대안들을 고려해볼 수 있습니다. 즉 이러한 중간 처리에 있어서 어떤 방법을 사용할 것이냐에 대해서는 사실 정답은 없습니다. 분석자의 판단에 따라 적절한 처리를 해주면 됩니다.

 

어쨌든 라돈 변환 결과에 대하여 이와 같이 클리핑 기법에 의한 중간 처리 과정을 한번 거쳤으므로, 이제는 그 처리 결과에 대하여 역변환(Backprojection)을 해주려고 합니다. 역변환을 하면 라돈 도메인에서 공간 도메인으로 복귀하게 되지만, 라돈 도메인 상태에서 방금과 같이 클리핑 처리를 한번 해줬기 때문에, 그 상태에서 역변환된 결과는 당연히 변환 이전의 원본 데이터와는 달라지게 됩니다. 우선 역변환의 과정은 다음과 같습니다.

 

backproject = RADON(result, /BACKPROJECT, RHO=rho, THETA=theta, $

  NX=sz[0], NY=sz[1])

HELP, backproject

PRINT, MIN(backproject), MAX(backproject)

 

이와 같이 RADON 함수를 사용하면서 /BACKPRJOECT 키워드를 함께 사용하면 됩니다. 그리고 앞서 라돈 영역으로의 변환 과정에서 얻었던 rho, theta는 그대로 사용해야 합니다. 또한 역변환의 결과인 backproject 배열의 구조가 원본 이미지와 동일하도록 하기 위하여 NX, NY 키워드들도 함께 사용하였습니다. HELP 및 PRINT 명령에 의하여 출력된 내용은 다음과 같습니다.

 

BACKPROJECT     FLOAT     = Array[256, 256]

      1172.27      2000.94

 

그리고 역변환의 결과인 backproject 배열의 모습을 다음과 같은 과정에 의하여 표출해봅시다.

 

win3 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)

im3 = IMAGE(backproject, MARGIN=0, /CURRENT)

 

표출된 모습은 다음 그림과 같습니다.

 

 

이 모습을 보면 원본 이미지에서 보이던 자잘한 잡음들은 상당 부분 제거되고 큼직한 형체만 남아 있는 것을 확인할 수 있습니다. 물론 이 상태가 최종적인 결과가 되지 못할 수도 있습니다. 만약 원형의 형체 부분을 좀 더 명확하게 식별하고자 한다면, 이 결과에서 특정한 화소값을 기준으로 마스킹(Masking) 기법을 적용하는 것까지도 필요할 수도 있습니다. 예를 들면 다음과 같은 방식입니다.

 

bmask = backproject GT 1560

 

여기서는 backproject 배열에 대하여 1560이라는 값을 기준으로 마스킹 처리를 하였습니다. 그러면 화소값이 1560보다 큰 부분은 1로 그리고 그렇지 않은 나머지 부분은 0으로 화소값들이 처리된 결과를 bmask라는 배열로 얻게 됩니다. 이제 다음과 같이 별도의 그래픽 창을 띄워서 bmask를 표출해봅시다.

 

win4 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)

im4 = IMAGE(bmask, MAX_VALUE=1, MARGIN=0, /CURRENT)

 

그 결과는 다음 그림과 같습니다.

 

 

이렇게 하면 원본 이미지 상에서 보였던 원형의 형체들을 뚜렷하게 구분할 수 있게 됩니다. 이러한 마스킹 자료를 원본 이미지와 함께 사용하면 뭔가 더 추가적인 작업들을 할 수 있게 될 것입니다.

 

지금까지 가상의 예제 데이터를 이용하여 라돈 변환 및 역변환에 관하여 살펴보았습니다. 사실 이 사례는 매우 간단명료한 경우에 해당되고, 실제로는 더 복잡하고 골치아픈 예제들도 많습니다. 하지만 여기서는 제가 가급적이면 간단명료한 예제를 통하여 기본적인 방법을 소개하는 것에 주안점을 두었다고 보시면 됩니다. 이 기법을 적용할 수 있는 범위는 더 넓습니다. 그리고 큰 틀에서는 라돈 변환 및 역변환 기법을 주로 사용한다고 해도, 그 사이사이에 다른 기법들을 적용한 처리 과정이 필요한 경우도 많습니다. 따라서 이러한 기법을 기반으로 실전 데이터를 처리하게 될 경우에는 오늘 소개한 내용보다도 작업이 훨씬 더 복잡해질 가능성이 크다는 점을 염두에 두시기 바랍니다.

 

그리고 라돈(Radon) 변환과 꽤 비슷하면서도 그 목적이 약간 다른 허프(Hough) 변환이라는 기법도 있습니다. 이와 관련해서는 차후에 내용이 준비가 되는대로 이어서 소개해보도록 하겠습니다.

반응형