본문 바로가기

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

영역 기반 처리 - (2) 영상 흐리게 하기


  영상을 흐리게 하는 것(Blurring)은 간단하게 주변 픽셀과의 평균을 구하는 것으로 가능하다. 흐리게 하는 정도에 따라 1/9으로 채워진 3x3 마스크, 1/25로 채워진 5x5 마스크, 1/49로 채워진 7x7마스크 등을 사용할 수 있다. 이 방법을 Box Blur라고 하며, 포토샵의 Filter->Blur->Box Blur를 이용하면 이와 같은 기능을 구현할 수 있다.

  반면 포토샵의 Filter->Blur->Blur 필터는 아래의 회선 마스크를 사용한다.


0

1/8

0

1/8

1/2

1/8

0

1/8

0


  보다 부드러운 흐림 효과를 내기 위해서는 Gaussian Blur가 사용된다. Gaussian Blur는 정규분포를 이용한 회선 마스크를 적용하여 공간적으로 대칭적인 형태의 흐림 효과를 낼 수 있다. 정규분포에는 상당히 복잡한 식이 포함되므로 이 컨텐츠에서는 생략하도록 한다.


(그림 22) 정규분포 그래프


  다음 코드를 고양이 그림에 적용하면 box blur와 같은 효과가 완성된다.


import Image
cat=Image.open("cat.bmp")
blurcat=Image.new("RGB",cat.size)
input=cat.load()
output=blurcat.load()

for i in range(cat.size[0]):
    for j in range(cat.size[1]):
        if i==0 or i==cat.size[0]-1 or j==0 or j==cat.size[1]-1 : #테두리 픽셀의 경우
            output[i,j]=input[i,j]
        else:
            R=G=B=0
            for k in range(-1,2):
                for l in range(-1,2):
                    R+=1.0/9.0 * input[i+k,j+l][0]
                    G+=1.0/9.0 * input[i+k,j+l][1]
                    B+=1.0/9.0 * input[i+k,j+l][2]
            output[i,j]=(R,G,B)

blurcat.save("blurcat.bmp")


  for문을 실행할 때 시간이 상당히 오래 걸리는 것을 볼 수 있다. 일반적으로 PixelAccess 객체를 직접 이용하는 것은 상당히 느리다. 파이썬은 고급 언어이기 때문에, 단순 계산을 연속적으로 하는 이미지 프로세싱을 직접 다루기엔 다소 부적합하다. 그런 점이 PIL과 같은 라이브러리가 필요한 이유이기도 하다.

  PIL에서는 회선 마스크를 만들어주는 함수인 Kernel과 이것을 적용하는 함수인 filter를 제공한다. 다음과 같이 하면 위에 소개된 긴 코드와 똑 같은 효과로 흐린 고양이 이미지를 만들 수 있다.


import Image, ImageFilter
cat=Image.open("cat.bmp")
M=1.0/9.0
boxblur=ImageFilter.Kernel((3,3),(M,M,M,M,M,M,M,M,M)) # 1/9로 이루어진 3x3회선 마스크
cat.filter(boxblur).save("blurcat.bmp") 




[목차] 이미지프로세싱 - 시작
[이전] 영역 기반 처리 - (1) 회선(Convolution) 기법
[다음] 픽셀 기반 처리 - (3) 영상 선명하게 하기