Algorithms / Gaussian blur / 모자이크

▼원본▼

▼LV.6▼

▼blur.py▼

from imageio import imread, imsave
from PIL import Image
import sys

def update_progress(progress):
    print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(progress * 50), progress*100), end="", flush=True)

def average(img, x, y, blurfactor):
    # Each function itself return the each pixel's average rgb value.
    # More blur factor is higher level of blur effect.
    width = img.shape[1]
    height = img.shape[0]
    rtotal = gtotal = btotal = 0
    for y2 in range(y - blurfactor, y + blurfactor+1):
        for x2 in range(x - blurfactor, x + blurfactor+1):
            if (y2 not in range(height)) or (x2 not in range(width)):
                continue
            else: 
                r, g, b = (int(img[y2,x2,0]), int(img[y2,x2,1]), int(img[y2,x2,2]))
                (rtotal,gtotal,btotal) = (rtotal+r,gtotal+g,btotal+b)
    (rAverage,gAverage,bAverage) = (rtotal//((blurfactor*2+1)**2)), (gtotal//((blurfactor*2+1)**2)), (btotal//((blurfactor*2+1)**2))
    return (rAverage, gAverage, bAverage)

def blur(blurfactor):
    # Default file name is 'cat.jpg'.
    img = imread('cat.jpg')
    width = img.shape[1]
    height = img.shape[0]
    img2 = Image.new("RGB", (width, height), (0,0,0))
    for y in range(height):    
        for x in range(width):
            r, g, b = average(img, x, y, blurfactor)
            img2.putpixel((x,y), (r,g,b))
            progress = (y)/(height-blurfactor)
            update_progress(progress)
    update_progress(1)
    img2.save('blur.jpg')
    img2.show()

def main():
    blur(int(sys.argv[1]))

if __name__ == '__main__':
    main()

터미널에서 [blurfactor]를 숫자로 대체해서 실행하면 작동한다.
숫자가 높아질수록 시간이 더 오래걸린다.
같은 경로에 cat.jpg라는 이름을 가진 파일이 있어야 하며 프로그램이 다 돌아간 후엔 blur.jpg로 새롭게 저장된다.
▼사용법▼

python blur.py [blurfactor]

▼LV.6 예시▼

python blur.py 6

처음에 blurfactor라는 정수를 입력받는다. 입력받는 이유는 사진의 픽셀 모두를 돌아가면서 주변 픽셀의 평균색을 구한 후 현재 픽셀에 넣는 방식으로 모자이크를 처리하는데 이때 blurfactor라는 변수가 주변을 검색하는 범위의 척도로 사용된다.
blur함수에서 픽셀 하나하나가 반복문에 의해 순차적으로 매번 average함수를 실행시키는데 이때 이 함수가 blurfactor의 범위에서 평균색 값을 구하는 역할을 한다.
average함수는 현재 픽셀을 기준으로 위, 아래 blurfactor만큼의 범위를 포함하는 정사각형 내에 들어가는 모든 픽셀의 평균 색을 구한다.

좋은 웹페이지 즐겨찾기