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の範囲を含む正方形内の全画素の平均色を求める.