写真を投稿するときに、部分的にぼかしたいときがあるかとおもいます。
前回作ったローカルガンマツールを、ちょっと加工するだけでオリジナルのぼかすツールがつくれました。
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)ここの部分を変えれば、局所的に何かを変えるツールは比較的簡単に作れます。
オススメの本↓。


コメント