IDL/Image Processing

감마 보정 (Gamma Correction) [2]

이상우_IDL 2026. 1. 15. 14:49
728x90

지난 회차 게시물에서는 IDL에서 이미지 데이터에 대하여 감마 보정(Gamma Correction) 기법을 적용하는 방법과 예제를 소개한 바 있습니다. 오늘은 앞서 소개되었던 방법을 그대로 응용하여 감마 보정 기법을 다른 예제 이미지 데이터에 적용해보기로 하겠습니다. 예제로 사용할 이미지 파일은 다음과 같습니다.

 

my_photo1.jpg
0.15MB

 

이 파일로부터 이미지 데이터를 읽고 감마 보정을 해보기로 합니다. 일단 이미지 데이터를 읽는 작업부터 다음과 같이 시작합니다.

 

READ_JPEG, 'my_photo1.jpg', data, /GRAYSCALE

HELP, data

 

사실 원본 이미지는 컬러이긴 하지만 여기서는 처리 작업의 편의를 위하여 READ_JPEG 명령을 GRAYSCALE 키워드와 함께 사용하여 RGB가 아닌 단색광 이미지 데이터로 읽었습니다. 그러면 data 배열은 734x979의 형태를 갖는 2차원 배열이 됩니다. 그리고 이 배열은 바이트형 배열로서 화소값들의 범위는 0~255가 됩니다. 이제부터 진행할 작업은 지난 회차 게시물의 내용과 맥락은 동일합니다. 즉 가로 방향으로 길쭉한 그래픽 창을 띄워서 방금 얻은 2차원 배열에 대한 이미지를 왼쪽에 띄우고 잠시후 감마 보정을 적용한 결과 이미지를 오른쪽에 띄우고자 합니다. 먼저 그래픽 창의 생성 및 이미지 표출까지의 과정은 다음과 같습니다.

 

ct = COLORTABLE(0)

win = WINDOW(DIMENSIONS=[1200, 600], /NO_TOOLBAR)
i1 = IMAGE(data, RGB_TABLE=ct, ASPECT_RATIO=0, $

  POSITION=[0.05, 0.15, 0.45, 0.92], /CURRENT, TITLE='Original')

 

여기서는 흑백 계열 색상으로 구성된 디폴트 컬러테이블을 사용하여 이미지를 표출하고 하단에 컬러바까지 표시하였습니다. 일단 여기까지의 내용을 실행하면 표출 결과는 다음 그림과 같습니다.

 

 

표출된 원본 이미지를 보면 밝은 스탠드 불빛 앞의 피사체가 어둡게 보이는 상태입니다. 그래서 어둡게 보이는 부분의 명암을 강조하여 그 형체가 더 잘 식별되도록 하기 위하여 감마 보정 기법을 적용해보고자 합니다. 지난 회차 게시물의 내용에 의하면 원본 이미지에서 화소값이 낮은 부분들의 명암을 강조하고 가독성을 높이기 위해서는 감마의 값을 1보다 작게 해주면 된다고 언급한 바 있습니다. 그래서 여기서는 감마의 값을 0.4로 설정하여 감마 보정을 적용하고 그 결과를 그래픽 창의 오른쪽에 표출해보고자 합니다. 이를 위하여 다음과 같은 과정을 추가합시다.

 

gm = 0.4

GAMMA_CT_SWLEE, gm, ct
i2 = IMAGE(data, RGB_TABLE=ct, ASPECT_RATIO=0, $

  POSITION=[0.55, 0.15, 0.95, 0.92], /CURRENT, $

  TITLE='Gamma Corrected with '+STRING(gm, FORMAT='(F0.1)'))
cb2 = COLORBAR(TARGET=i2, POSITION=[0.6, 0.05, 0.9, 0.09], /BORDER)

 

여기서는 지난 회차 게시물에 첨부되어 있던 GAMMA_CT_SWLEE 명령을 사용하여 감마 보정을 수행하였음을 유의해야 합니다. 이 내용까지 실행하면 그 결과는 다음 그림과 같습니다.

 

 

이 그림을 보면 역광으로 인하여 화소값이 낮고 그 형체가 식별이 잘 안되었던 부분이 감마 보정을 거침으로써 전반적인 형체들의 식별이 더 용이해졌음을 확인할 수 있습니다. 그런데 이와 같이 이미지에서 특정한 화소값 범위의 형체들에 대한 식별이 용이하도록 하기 위하여 클리핑(Clipping) 기법을 적용하는 경우도 있습니다. 클리핑 기법에 관해서는 예전에 관련 게시물을 통하여 소개를 한 바 있습니다. 따라서 위의 원본 이미지에 대해서도 어두운 부분의 형체 식별을 위하여 클리핑 기법을 적용하고 그 결과를 별도의 그래픽 창에 표출해보도록 하겠습니다. 그 과정은 다음과 같이 처리해봅니다.

 

win_c = WINDOW(DIMENSIONS=[500, 600], /NO_TOOLBAR)
i_c = IMAGE(data<80, RGB_TABLE=0, ASPECT_RATIO=0, $
  POSITION=[0.05, 0.15, 0.95, 0.92], /CURRENT, TITLE='Clipped')
cb_c = COLORBAR(POSITION=[0.2, 0.05, 0.8, 0.09], /BORDER)

 

여기서는 원본 이미지 배열인 data에 대하여 클리핑 기법을 적용하여 화소값이 80 이하인 화소들에 대하여 바이트스케일링이 적용되도록 하고 80 이상인 화소들에 대해서는 모두 80으로 통일되도록 처리하였습니다. 그리고 원래 사용하던 컬러테이블 데이터인 ct는 감마 보정에 의하여 이미 변형되었기 때문에 0번 컬러테이블을 원형 그대로 사용하기 위하여 RGB_TABLE 속성을 0으로 설정하였음을 유의할 필요가 있습니다. 이와 같이 클리핑 처리에 의하여 표출된 결과를 보면 다음 그림과 같습니다.

 

 

이와 같이 클리핑 기법으로 얻은 결과 이미지를 보면 원본 이미지에서 어두워서 잘 안보이던 형체들이 잘 식별됩니다. 이러한 점에 있어서는 앞서 감마 보정을 적용한 결과와 거의 유사합니다. 다만 결정적인 차이점이 있습니다. 클리핑 기법이 적용된 결과 이미지를 보면 화소값이 비교적 밝았던 부분들은 이제는 그 형체가 거의 잘 안보입니다. 즉 화소값이 80보다 컸던 부분들의 형체는 완전히 죽어버린 상태입니다. 이것은 클리핑 기법의 특성 자체가 특정 범위의 화소들만 바이트스케일링으로 강조하는 반면 그 이외의 범위인 화소들은 사실상 버리는 것과 마찬가지이기 때문입니다. 그런데 맨 처음에 감마 보정 기법을 적용하여 얻었던 결과 이미지를 보면 어두웠던 부분들의 형체들이 작 식별될 뿐만 아니라 밝았던 부분들도 그 형체가 여전히 살아있습니다. 따라서 감마 보정과 클리핑은 그 목적이 비슷할 수도 있지만 그 결과에 있어서는 차이점이 분명히 있다는 점을 염두에 두어야 합니다. 이것은 어느 기법이 더 낫고 못하고의 문제는 아니고, 각 기법의 특성 및 처리 대상 이미지의 특성을 함께 감안하여 더 적절한 기법을 유저가 선택해야 하는 문제라고 보면 좋을 것 같습니다.

 

 

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

LIST