Algorithms / Gaussian blur / 모자이크 / Python

Onam Kwon·2022년 4월 4일
0

Algorithms

목록 보기
6/24

▼원본▼

▼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만큼의 범위를 포함하는 정사각형 내에 들어가는 모든 픽셀의 평균 색을 구한다.

profile
뜨거운 백엔드 개발자

0개의 댓글