본문 바로가기

학습컨텐츠/이미지프로세싱

픽셀 기반 처리 - (1) 밝기, 명암대비 조절


  밝기 조절은 매우 간단하다. 픽셀에 일정한 값을 더하거나 빼는 것으로 밝기 조절이 가능하다.


(그림 11) 고양이 사진


  이 사진은 이 컨텐츠에서 계속 사용할 고양이 사진이다. 어떤 여자 연예인 사진을 쓸까 한참 고민하다가 결국 정하지 못해 고양이 사진을 쓰기로 했다.

  앞서 다룬 eval함수를 이용하여 각 픽셀값에 64를 각각 더하거나 뺀 뒤 저장해 보자. 아래와 같은 이미지를 얻을 수 있다. eval함수는 기특하게도 결과값이 255보다 크거나 0보다 작아져서 범위를 벗어나도 255나 0으로 처리를 해주기 때문에 그런 경우에 대해 별도로 처리할 필요가 없다.

  Image.eval(im, lambda x:x+64).save("brightcat.bmp")와 같은 방법으로 im을 밝게 한 이미지를 파일로 저장할 수 있다. 어둡게 한 이미지도 같은 방법으로 하면 된다.


(그림 12) 밝게, 어둡게 처리한 고양이 사진


  명암대비(contrast)는 수학적으로 어떻게 나타낼 수 있을까? 그 방법을 설명하기 전에 먼저 히스토그램(histogram)에 대해 알아보자.

  비트맵 이미지는 결국 0~255의 값을 가지는 정수들의 '배열'이다. 따라서, 이것을 통계적으로 처리하면 히스토그램을 얻을 수 있다. PIL에서는 히스토그램 생성을 위한 histogram() 함수를 지원한다. 흑백 이미지의 경우 각 밝기에 해당하는 픽셀 수를 원소로 하는 길이 256의 list가 반환되고, 컬러 이미지는 각 성분에 대한 히스토그램을 연결한 길이 768(256*3)의 list를 반환해준다. 흑백으로 변환한 고양이 사진에 대해 히스토그램 연산을 수행하면 다음 결과를 얻는다.


>>> import Image

>>> im=Image.open("cat.bmp")

>>> im.convert("L").histogram()

[990, 941, 862, 938, 916, 919, 943, 968, 897, 822, 827, 726, 640, 606, 567, 559, 506, 438, 407, 364, 349, 326, 292, 230, 277, 251, 263, 258, 234, 260, 274, 253, 318, 287, 263, 274, 255, 272, 231, 255, 216, 202, 224, 235, 232, 234, 217, 220, 192, 202, 158, 200, 174, 182, 204, 218, 228, 248, 263, 279, 245, 252, 298, 309, 300, 323, 335, 308, 365, 353, 362, 379, 385, 432, 445, 465, 493, 486, 490, 517, 495, 524, 568, 587, 595, 585, 621, 643, 694, 724, 682, 698, 664, 741, 823, 834, 911, 957, 1025, 1186, 1275, 1287, 1195, 1284, 1280, 1318, 1378, 1354, 1523, 1574, 1529, 1612, 1638, 1641, 1742, 1785, 1762, 1755, 1857, 1782, 1754, 1734, 1704, 1720, 1669, 1742, 1644, 1592, 1552, 1707, 1695, 1614, 1658, 1605, 1584, 1521, 1365, 1427, 1308, 1164, 1132, 1078, 961, 917, 897, 855, 819, 824, 874, 844, 838, 769, 770, 744, 695, 743, 705, 624, 639, 567, 515, 507, 538, 524, 500, 555, 509, 490, 479, 471, 454, 438, 439, 432, 395, 387, 372, 337, 353, 344, 310, 304, 333, 297, 265, 313, 311, 330, 302, 278, 310, 283, 302, 267, 210, 209, 220, 164, 158, 130, 121, 163, 146, 134, 116, 145, 139, 142, 144, 127, 127, 128, 150, 148, 143, 152, 146, 174, 128, 138, 168, 174, 196, 199, 215, 171, 176, 177, 189, 193, 213, 211, 209, 258, 280, 327, 369, 519, 626, 825, 950, 1153, 1698, 2471, 2596, 2883, 3535, 3121, 2720, 2608, 1797, 841, 1044, 574, 263, 24]


  포토샵에서 Ctrl+L키를 누르면 흑백으로 변환한 이미지의 히스토그램을 시각적으로 확인할 수 있다.

(그림 13) 고양이 사진의 히스토그램을 포토샵으로 확인한 모습


  그럼 앞에서 밝게 처리한 고양이 사진의 경우 히스토그램은 어떻게 나타날까? 밝기가 0이던 픽셀은 64가 되었고, 64이던 픽셀들은 128이 되었을 것이다. 즉, 히스토그램이 가로길이의 1/4만큼 오른쪽으로 이동한 모습일 것이다. 반대로 어둡게 처리한 고양이 사진은 히스토그램이 왼쪽으로 이동해 있을 것임을 추측할 수 있다. 포토샵에서 확인해 보았다.


(그림 14) 밝게, 어둡게 처리한 고양이 사진의 히스토그램


  밝기 조절이 히스토그램을 좌우로 이동시키는 효과를 나타냈다면, 명암대비 조절은 히스토그램을 좌우로 늘어나거나(stretch) 줄어들게(shrink) 하는 효과를 나타낸다. 아래의 간단한 1차함수를 각 픽셀에 적용하면 명암대비 조절의 효과를 확인할 수 있다.

사용자 삽입 이미지


  여기서 128은 늘림 효과의 기준이 되는 색이다. 여기서는 흰색과 검정색의 중간인 128을 사용하면 히스토그램이 가운데를 기준으로 좌우로 늘어나게 된다. 위 식을 계산한 결과가 0보다 작아지면 f(x)를 0으로, 255보다 커지면 f(x)=255로 하면 된다. c는 명암대비 변화의 정도를 조절하는 상수로, 1보다 작으면 명암대비가 작아지게 되고(히스토그램이 줄어들고), 1보다 크면 명암대비가 커지게 된다(히스토그램이 좌우로 늘어난다). 포토샵에서는 명암대비 조절에서 -100~100의 입력 k를 받고 다음과 같이 c를 정해서 이미지에 적용한다.

사용자 삽입 이미지


  k가 100일 때는 너무너무 늘어난 나머지 128미만의 x의 경우 f(x)=0, 128이상은 f(x)=255가 된다. (그림 15)와 (그림 16)은 k에 -50과 +50을 주고 계산한 고양이 사진과 각각의 히스토그램이다. -50을 준 경우 히스토그램의 폭이 절반으로 줄어들었고, +50을 준 경우 히스토그램의 폭이 두 배로 늘어난 것을 확인할 수 있다.


(그림 15) 명암대비 조정 후의 고양이 사진


(그림 16) 명암대비 조정 후의 고양이 사진의 히스토그램