【OpenCV】画像にぼかしを入れる【全体・一部・複数一括処理】

スポンサードリンク
Python
過去の自分
過去の自分

WEBサイトでクイズをやることになったんだけど、
画像の正解部分を隠すようにぼかしを入れたい…。
OpenCVで画像にぼかしを入れることはできるの?

今の自分
今の自分

できますよ!
では今回は、「OpenCVで画像にぼかしを入れる方法」
できるだけわかりやすく解説いたします。
また、「画像の一部にぼかしを入れる方法」
「複数の画像を一括で処理する方法」も紹介いたしますので、
ぜひ最後まで読んでいってください。

著者情報
スポンサードリンク

OpenCVで画像にぼかしを入れる方法

「blur」を使います。
まずは画像の全体にぼかしを入れてみましょう。

ひとまず全コードと実行結果をお見せします。
解説は後ほど行います。

全コード

import cv2

input_img = cv2.imread('C:/Utatane/input_img.jpg')

output_img = cv2.blur(input_img, (30, 30))

cv2.imwrite('C:/Utatane/output_img.jpg', output_img)
output_img = cv2.blur(input_img, (30, 30))

実行結果

実行結果

事前準備

  • OpenCVのインストール

画像を加工したり編集したりするには「OpenCV」のインストールが必要です。
OpenCVを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。

pip install opencv-python

※OpenCVを使用したことがある場合は、このインストール作業は不要です。

解説

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

インポートや画像の読み込み・保存方法の解説は、下記記事をご参考ください。

画像にぼかしを入れる

output_img = cv2.blur(input_img, (30, 30))

上記一文にて、画像全体にぼかしを入れることができます。

まず新しい名前の変数を書いたら、「=(イコール)」を書きます。

変数名をつける際には注意すべきことがあります。下記記事をご参考ください。

イコールの後に、「cv2.blur()」を書きます。
()内には、「読み込んだ画像が入った変数」「カーネルサイズ」を書いたら完了です。

【カーネルサイズとは】
ぼかず度合いを示す数値だと思ってください。
今回は(30, 30)に設定しました。数値が大きくなるほどぼかしも大きくなります。

カーネルサイズの比較

【カーネルサイズの役割】
カーネルサイズの(30, 30)ですが、2種類の数値があることがわかります。
これは、(左右方向のぼかし, 上下方向のぼかし)という役割があります。
数値を変えると以下のようなぼかしが出来あがります。

カーネルサイズ左右と上下の比較

左右方向だけなど、片方だけぼかしを設定することで、ブレを表現できたりもします。

カーネルサイズを記述する際は、2重カッコになっていることにご注意ください。

これで画像にぼかしを入れることができます。
他のぼかし方もありますので紹介いたします。

その他のぼかし方

ガウシアンぼかし

output_img = cv2.GaussianBlur(input_img, (31, 31), 10)
ガウシアンぼかしの見本

自然なぼかしに仕上がります。
ガウシアンぼかしのカーネルサイズ(31, 31)は奇数でなければなりませんのでご注意ください。
最後の「10」は「標準偏差」といって、ぼかしの強さを表します。
どちらも数値が大きくなるほどぼかしが大きく・強くなります。


メディアンぼかし

output_img = cv2.medianBlur(input_img, 21)
メディアンぼかしの見本

ぼかしたというより、色あせたといった感じでしょうか。
こちらのカーネルサイズも奇数でなければなりません。

スポンサードリンク

画像の一部にぼかしを入れる方法

下図のように、画像の一部分だけにぼかしを入れることもできます。

一部分にぼかしを入れた見本

コードとざっくりとした処理は以下の通りです。

import cv2

input_img = cv2.imread('C:/Utatane/input_img.jpg')

output_img = input_img.copy()

x, y, w, h = 120, 350, 230, 150

cut_img = input_img[y:y+h, x:x+w]

bokashi_img = cv2.blur(cut_img, (30, 30))

output_img[y:y+h, x:x+w] = bokashi_img

cv2.imwrite('C:/Utatane/output_img.jpg', output_img)

<コードの5行目~13行目>
5行目:元データをコピー(バックアップをとる)
7行目:切り抜く部分を設定
9行目:ぼかしを入れたい部分を切り抜く
11行目:切り抜いた部分のみにぼかしを入れる
13行目:ぼかし状態の部分を元画像の元の位置に重ねる

画像の一部にぼかしを入れる説明画像
スポンサードリンク

複数の画像にぼかしを入れる(一括処理)

フォルダにある全ての画像にぼかしを入れることもできます。
下記コードはfor文を使ってフォルダ内にある全ての画像にぼかしを入れた例です。

import cv2
import os

os.makedirs('C:/Utatane/output', exist_ok=True)

for filename in os.listdir('C:/Utatane'):
    if filename.endswith('.jpg') :
        input_img = cv2.imread(os.path.join('C:/Utatane', filename))
        output_img = cv2.blur(input_img, (30, 30))
        cv2.imwrite(os.path.join('C:/Utatane/output', filename), output_img)

こちらもざっくりと解説いたします。

<コード4行目>
出力するフォルダを作成

<コード6行目~最後>【for文でファイルが無くなるまでループ】
6行目:取り込みフォルダ内のファイルを取り込み
7行目:拡張子が「jpg」なら以下の操作を行う
8行目:取り込みフォルダのパスとファイル名を連結(フルパスに)して取り込み
9行目:画像にぼかしを入れる
10行目:出力フォルダパスとファイル名を連結(フルパスに)して出力

スポンサードリンク

うまく動作しない場合の対処法

画像の読み込みができない

画像ファイルが存在しない場合や、ファイルが破損している場合などは画像の読み込みができません。

画像を読み込み・保存する方法の記事を参考に、再度確認してください。

画像が保存されない

存在しないフォルダを指定した場合、画像は保存されません。

画像を読み込み・保存する方法の記事を参考に、再度確認してください。

エラーが出る

No module named ‘cv2’

これは、OpenCVがインストールできていない場合に出るエラーです。
事前準備の項を参考に、OpenCVのインストールを完了させてください。

OpenCV(4.10.0) ~ img.empty() ~

画像の読み込みが正常に行えていない可能性があります。
画像を読み込み・保存する方法の記事を参考に、画像のパスや形式を確認してください。

○○ is not defined

今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。

詳しい解説は、下記記事をご参考ください。

その他のエラー

その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。

スポンサードリンク

最後に

OpenCVで画像にぼかしを入れる方法を解説いたしました。

当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

挫折せずにPythonを独学で学習する方法は特におすすめです。

最後までお読みいただき、ありがとうございました。がんばってください!

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