【pytho-oepnCV】画像の複数個所をモザイク化!クリックするだけ!

このページでは、以下の動画のように画像内の指定箇所をクリックして囲うことによって、その指定領域をモザイク化する方法をご紹介していきます。

動画のように一度に複数個所をモザイク化することも可能です。

複数の人間が移っていて、顔部分にモザイクをしたいときなどに非常に便利そうですね。

※動画内の緑線は最終保存画像には残りません。

 

画像ファイルを用意して以降で紹介するサンプルコードを実行するだけでOKですので非常に簡単に実行できます。

 

それではやっていきましょう。

 

※Pythonという無料のプログラミング言語を使用します。

インストール~実行方法までは以下で解説しています。

 

スポンサーリンク

必要なライブラリ一覧

今回はpythonを使って以下のライブラリを使用していきます。

★numpy

★openCV

openCVのインストール方法については以下で解説していますので、参考にしてみてください。

スポンサーリンク

使用するサンプル画像の紹介

今回は以下の画像を使用します。

この画像がプログラム実行フォルダにsample_pic.jpgという名前で保存してあります。

使用するサンプル画像の紹介

あなたもまずは適当な画像を準備しておきましょう。

 

スポンサーリンク

一度に複数個所をモザイク化するサンプルコード

それでは冒頭に紹介した動画の作業を実施してくれるサンプルコードをご紹介します。

import cv2
import numpy as np
#モザイク化する際のぼかし度合(大きいほどぼける)
blur_size=(9,9)
#読み込み画像ファイルを指定
file_name='sample_pic.jpg'
#実際の処理開始
img=cv2.imread(file_name,cv2.IMREAD_COLOR)
x1,y1=0,0
counter=1
img3=np.copy(img)
xy_list=[]
#ぼかし処理をする際のXY座標変換関数
def xy_order(x1,x,y1,y):
    x2=x
    y2=y
    if x1>x2:
        X1=x2
        X2=x1
    else:
        X1=x1
        X2=x2
    if y1>y2:
        Y1=y2
        Y2=y1
    else:
        Y1=y1
        Y2=y2
    return X1,X2,Y1,Y2
#クリック位置をモザイク化する関数
def click_mosaic(event, x, y, flags, params):
    global x1,y1,img2,img3,counter,blur_size,blur_size,xy_list
    if event == cv2.EVENT_LBUTTONDOWN:
        counter=0
        x1=x
        y1=y
    elif event == cv2.EVENT_MOUSEMOVE and counter==0:
        img2=np.copy(img3)
        cv2.rectangle(img2,(x1, y1),(x, y),(0, 255, 0),thickness=1)
        X1,X2,Y1,Y2=xy_order(x1,x,y1,y)
        img2[Y1+1:Y2-1,X1+1:X2-1]=cv2.blur(img2[Y1+1:Y2-1,X1+1:X2-1],blur_size)
        cv2.imshow('window', img2)
    elif event == cv2.EVENT_RBUTTONDOWN:
        counter=1
        X1,X2,Y1,Y2=xy_order(x1,x,y1,y)
        xy_list.append([X1,X2,Y1,Y2])
        img3=img2
#メインの処理
cv2.imshow('window', img)
cv2.setMouseCallback('window', click_mosaic)
cv2.waitKey(0)
cv2.destroyAllWindows()
#クリックで取得した箇所を再度モザイク化して保存
for i in range(len(xy_list)):
    X1,X2,Y1,Y2=xy_list[i][0],xy_list[i][1],xy_list[i][2],xy_list[i][3]
    img[Y1:Y2,X1:X2]=cv2.blur(img[Y1:Y2,X1:X2],blur_size)
cv2.imwrite('new_pic.jpg',img)

 

非常に長いですが、要所でコメントをつけていますので、やっていることはなんとなく理解できるはずです。

 

スポンサーリンク

複数個所をモザイク化するサンプルコードの実行方法

まずは画像を準備した状態で、先ほどのコードを実行してみましょう。

すると指定した画像のwindowが出現するはずです。

この状態で

①画像のモザイクをかけたい領域(始点)を左クリック

②画像のモザイクをかけたい領域(終点)を右クリック

③複数個所にモザイクをかけたい場合は①②を繰り返す

④終了したいときは0をおして終了する

 

すると以下の動画のような処理ができるはずです。

この作業終了後にプログラム実行フォルダを確認いただくと、あなたが指定した場所にモザイク化処理された画像があらたにnew_pic.jpgという名前で保存されています。

 

私の場合は以下の画像が保存されていました。

クリックで指定した複数個所にモザイク化処理した結果

問題なくクリックした場所だけがぼやけていますね。

 

スポンサーリンク

おわりに

というわけで今回はpython-openCVを使って、画像内の複数個所にモザイクをかける方法をご紹介しました。

集合写真などの処理にぜひご活用ください。

 

このように、私のブログでは様々なスキルを紹介しています。

過去記事一覧

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

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