IDL/New Graphics

바코드 형태의 이미지의 표출 및 응용 [2]

이상우_IDL 2025. 11. 17. 15:55
728x90

IDL에서 바코드(Barcode)의 형태를 띈 이미지를 구현하고 표출하는 방법을 지난 회차 게시물에서 소개한 바 있습니다. 오늘은 이러한 기법을 응용하는 예제를 살펴보기로 합니다. 먼저 다음과 같이 1차원적인 패턴의 데이터를 가정하고 기본적인 표출까지 진행해봅시다.

 

x = FINDGEN(241)
y = 1.7*SIN(x*!PI/25.0)*EXP(-0.01*x)

win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, COLOR='dark cyan', THICK=2, $
  XRANGE=[0, 240], XTICKINTERVAL=60, $
  FONT_SIZE=11, MARGIN=[0.1, 0.1, 0.1, 0.2], /CURRENT)

 

여기서는 감쇄형 사인(Sine) 곡선의 형태를 갖는 1차원 데이터를 생성하여 예제로 사용하고자 합니다. 일단 표출된 데이터의 모습은 다음 그림과 같습니다. 나중을 위하여 위쪽에 여백을 좀 더 두었습니다.

 

 

이제 이러한 데이터에 대하여 y의 값이 0.2보다 큰 부분들을 탐색하고 그 결과를 그림의 상단에 바코드 형태의 이미지로 표시해보는 작업을 진행해보고자 합니다. 이를 위하여 먼저 다음과 같이 WHERE 함수를 사용하여 조건에 부합되는 경우들을 탐색합니다.

 

ww = WHERE(y GT 0.2, count)

PRINT, count

 

이렇게 하면 변수 count의 값이 82로 출력됩니다. 즉 241개의 데이터 포인트들 중 0.2보다 크다는 조건을 만족하는 것들이 82개라는 의미입니다. 따라서 이러한 탐색 결과를 바탕으로 바코드 형태의 이미지 배열을 다음과 같이 생성합니다.

 

dx = INTARR(N_ELEMENTS(x))
dx[ww] = 1
img = dx#REPLICATE(1, 50)
HELP, img
PRINT, MIN(img), MAX(img)

 

이 과정은 이전 회차 게시물에서 했던 작업과 유사합니다. 즉 여기서 생성된 img는 241x50의 형태를 갖는 2차원 배열이 되는데, 앞서 y의 값이 0.2보다 크다는 조건을 만족하는 부분의 값들은 1이 되고 그렇지 않은 부분의 값들은 0이 될 것입니다. 그 다음은 배열 img를 플롯의 상단에 이미지의 형태로 표시합니다. 이 때 적절한 컬러테이블도 함께 생성하여 활용하면 됩니다. 그 과정은 다음과 같이 처리합니다.

 

ct = COLORTABLE(['white', 'crimson'])
i = IMAGE(img, RGB_TABLE=ct, POSITION=[0.1, 0.84, 0.9, 0.92], $

  ASPECT_RATIO=0, /CURRENT)

 

이 과정 역시 이전 회차 게시물에서 했던 작업과 비슷합니다. 여기까지 모두 실행하면 그 결과는 다음 그림과 같습니다.

 

 

이와 같이 플롯의 상단에 이미지를 별도로 표시하는 방식 외에도 아예 플롯 안쪽에 이미지를 중첩하는 방식도 생각해볼 수 있습니다. 이를 위해서는 앞서 IMAGE 함수로 이미지를 표시하는 과정에 있어서 이미지의 위치 및 투명도를 적절히 조정해주면 됩니다. 또한 어차피 이제는 플롯의 상단이 아닌 플롯 안쪽에 이미지를 표시할 것이므로 플롯 상단에 여백을 많이 둘 필요는 없게 됩니다. 따라서 PLOT 함수가 사용된 내용에서 여백만 다시 조정하고 바로 이어서 IMAGE 함수의 내용도 적절히 수정하면 되는데, 이러한 변화들을 반영한 전체적인 내용은 다음과 같습시다.

 

p = PLOT(x, y, COLOR='dark cyan', THICK=2, $
  XRANGE=[0, 240], XTICKINTERVAL=60, $
  FONT_SIZE=11, MARGIN=0.1, /CURRENT)
ww = WHERE(y GT 0.2, count)

dx = INTARR(N_ELEMENTS(x))
dx[ww] = 1
img = dx#REPLICATE(1, 50)
ct = COLORTABLE(['white', 'crimson'])
hline = POLYLINE([0, 240], [0.2, 0.2], LINESTYLE=1, /DATA)
i = IMAGE(img, RGB_TABLE=ct, POSITION=[0.1, 0.1, 0.9, 0.9], $
  TRANSPARENCY=70, ASPECT_RATIO=0, /CURRENT)

 

그리고 여기서는 POLYLINE 함수를 사용하여 기준값인 0.2에 대한 기준선도 함께 표시되도록 해보았습니다. 위의 내용을 실행하여 얻은 그림은 다음과 같습니다.

 

 

이와 같이 1차원 플롯에 대하여 특정한 조건을 만족하는 부분과 그렇지 않은 부분을 구분하는 바코드 형태의 이미지를 중첩하는 방식을 살펴보았습니다. 어쨌든 지난 회차 게시물에서 소개했던 바코드 형태의 이미지를 표시하는 기법을 이러한 방식으로도 활용할 수 있다는 것을 참조해두시면 좋을 것 같습니다.

 

 

* 이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.

LIST