Pythonで作りたいものを作る!クリックで局所的にぼかすツール(No.0002)

写真を投稿するときに、部分的にぼかしたいときがあるかとおもいます。

前回作ったローカルガンマツールを、ちょっと加工するだけでオリジナルのぼかすツールがつくれました。

import cv2
import os, tkinter, tkinter.filedialog

####以下は画像ファイルを選ぶ場合
def f_opengui():
  root = tkinter.Tk()
  root.withdraw()
  fTyp = [("","*")]
  iDir = os.path.abspath(os.path.dirname(__file__))
  file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
  return file

img=cv2.imread(f_opengui(),1)
img2=img
img0=img

ym=len(img)
xm=len(img[0])
zm=len(img[0,0])
print(xm,ym,zm)

cval=int(5)#平均化処理の繰り返し回数
rr=int(20) #rr=int(input("範囲 rr= "))

#マウスが押されたときに行うことを関数化
def mouse_event(event, x, y, flags, paramn):
    if event == cv2.EVENT_LBUTTONUP:
        #特定の領域だけ処理をする設定
        for xx in range(xm):
            for yy in range(ym):
                for zz in range(zm):
                    if rr**2>((xx-x)**2+(yy-y)**2):
                        #クリック周辺画素の平均とする
                        #openCVに、ガウシアンフィルタや平均化フィルタがあるが、面全体なので今回は使わない
                        dd=int(0)#ddをIntで定義
                        for xval in range(3):#わかりやすく3×3の平均化とした
                            for yval in range(3):
                                dd=dd+(img[yy+yval-1,xx+xval-1,zz])
                        dd=int(dd/9)

                        if dd<0:
                            img2[yy,xx,zz]=0
                        elif dd>255:
                            img2[yy,xx,zz]=255
                        else:
                            img2[yy,xx,zz]=dd
                zz=0
            yy=0
img2=img #編集物入れ物

#元ファイルを表示
cv2.imshow('Base',img2)
cv2.waitKey(1)   

#マウスイベント
cv2.namedWindow("window_ans", cv2.WINDOW_AUTOSIZE) #
cv2.setMouseCallback("window_ans", mouse_event) #

#「q」が押されるまでループ
while True:
    #画像の表示
    cv2.imshow("window_ans", img2) 
    #キー入力
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cv2.imwrite('c:/temp/0002bokashi.bmp',img2)
cv2.destroyAllWindows()
cv2.waitKey(0)

window_ansに出た画像をクリックするだけで画像のぼかし加工ができます。

最後に画像上で”q”キーを押すと、保存して終了します。

加工前

加工後 (左目の周りだけぼかしてみました)

以上、局所的にぼかすツールでした。このコードの

                        dd=int(0)#ddをIntで定義
                        for xval in range(3):#わかりやすく3×3の平均化とした
                            for yval in range(3):
                                dd=dd+(img[yy+yval-1,xx+xval-1,zz])
                        dd=int(dd/9)

ここの部分を変えれば、局所的に何かを変えるツールは比較的簡単に作れます。

オススメの本↓。

コメント

タイトルとURLをコピーしました