さっき撮った写真をWEBに載せようと思ったんだけど、
無関係の人が写りこんでいた…。
この人にモザイクをかけたいんだけど、OpenCVでできるの?
なるほど…。
では今回は、「OpenCVで画像にモザイクをかける方法」を
できるだけわかりやすく解説いたします。
また、「画像の一部分にモザイクをかける方法」や
「複数の画像に一括でモザイクをかける方法」
なども紹介いたしますので、最後まで読んでいってください。
OpenCVで画像にモザイクをかける方法
画像を極端に縮小した後、拡大して元のサイズに戻すことで、モザイクがかかったような処理にすることができます。
まずは画像全体にモザイクをかけてみましょう。
ひとまず全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import cv2
input_img = cv2.imread('C:/Utatane/input_img.jpg')
height, width = input_img.shape[:2]
new_width = int(width / 15)
new_height = int(height / 15)
small_img = cv2.resize(input_img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
mosaic_img = cv2.resize(small_img, (width, height), interpolation=cv2.INTER_NEAREST)
cv2.imwrite('C:/Utatane/output_img.jpg', mosaic_img)
small_img = cv2.resize(input_img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
mosaic_img = cv2.resize(small_img, (width, height), interpolation=cv2.INTER_NEAREST)
実行結果
事前準備
- OpenCVのインストール
画像を加工したり編集したりするには「OpenCV」のインストールが必要です。
OpenCVを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install opencv-python
※OpenCVを使用したことがある場合は、このインストール作業は不要です。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポートや画像の読み込み・保存方法の解説は、下記記事をご参考ください。
画像にモザイクをかける
height, width = input_img.shape[:2]
new_width = int(width / 15)
new_height = int(height / 15)
small_img = cv2.resize(input_img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
mosaic_img = cv2.resize(small_img, (width, height), interpolation=cv2.INTER_NEAREST)
上記コードにて、画像全体にモザイクをかけることができます。
1つ1つ解説していきます。
height, width = input_img.shape[:2]
コードの5行目で画像のheight(高さ)、width(幅)を取得しています。
元画像は600×600pxのため、height・widthともに「600」が入ります。
new_width = int(width / 15)
new_height = int(height / 15)
コードの7・8行目で縮小後の画像サイズ(new_width・new_height)を準備しています。
new_width・new_heightにはともに「600÷15」で「40」が入ります。
今回は「1/15」に縮小するように設定していますが、お好みで変更してください。
「1/100」など、画像をより小さくするとモザイクは粗く、
「1/5」など、画像を大きめにするとモザイクは細かくなります。
高さ・幅は48pxなど、整数のみ有効です。
48.3のような小数点以下があると動きませんので、int型(整数)に変換しています。
small_img = cv2.resize(input_img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
コードの9行目でひとまず元画像を縮小後のサイズ(40×40px)に縮小させます。
「cv2.resize()」で画像の拡大縮小を行うことができます。
()内に「元画像が入った変数」「縮小後の画像サイズ」「補間方法」を指定します。
補間方法の「interpolation=cv2.INTER_LINEAR」はざっくり説明すると、「画質をなめらかに保ちながら処理する」といった意味合いです。
mosaic_img = cv2.resize(small_img, (width, height), interpolation=cv2.INTER_NEAREST)
コードの10行目で画像を元のサイズに戻しています。
コードの内容はほぼ9行目と同じです。
「interpolation=cv2.INTER_NEAREST」は「画質を粗く処理する」といった意味合いのため、モザイクのような処理になるわけです。
画像の一部にモザイクをかける
下図のように、画像の一部分だけにモザイクをかけることもできます。
コードとざっくりとした処理は以下の通りです。
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]
small_cut_img = cv2.resize(cut_img, (w // 15, h // 15), interpolation=cv2.INTER_LINEAR)
mosaic_cut_img = cv2.resize(small_cut_img, (w, h), interpolation=cv2.INTER_NEAREST)
output_img[y:y+h, x:x+w] = mosaic_cut_img
cv2.imwrite('C:/Utatane/output_img.jpg', output_img)
<コードの5行目~13行目>
5行目:元データをコピー(バックアップをとる)
7行目:切り抜く部分を設定
9行目:モザイクをかけたい部分を切り抜く
11行目:切り抜いた部分のみを縮小
12行目:切り抜いた部分のみを再拡大
14行目:モザイク状態の部分を元画像の元の位置に重ねる
複数の画像に一括でモザイクをかける
フォルダにある全ての画像にモザイクをかけることもできます。
下記コードは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))
height, width = input_img.shape[:2]
new_width = int(width / 15)
new_height = int(height / 15)
small_img = cv2.resize(input_img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
mosaic_img = cv2.resize(small_img, (width, height), interpolation=cv2.INTER_NEAREST)
cv2.imwrite(os.path.join('C:/Utatane/output', filename), mosaic_img)
こちらもざっくりと解説いたします。
<コード4行目>
出力するフォルダを作成
<コード6行目~最後>【for文でファイルが無くなるまでループ】
6行目:取り込みフォルダ内のファイルを取り込み
7行目:拡張子が「jpg」なら以下の操作を行う
8行目:取り込みフォルダのパスとファイル名を連結(フルパスに)して取り込み
9行目:取り込んだ画像のサイズ(高さ・幅)を取得
10行目:縮小後の幅を設定
11行目:縮小後の高さを設定
12行目:画像を縮小
13行目:画像を再拡大
14行目:出力フォルダパスとファイル名を連結(フルパスに)して出力
うまく動作しない場合の対処法
画像の読み込みができない
画像ファイルが存在しない場合や、ファイルが破損している場合などは画像の読み込みができません。
画像を読み込み・保存する方法の記事を参考に、再度確認してください。
画像が保存されない
存在しないフォルダを指定した場合、画像は保存されません。
画像を読み込み・保存する方法の記事を参考に、再度確認してください。
エラーが出る
No module named ‘cv2’
これは、OpenCVがインストールできていない場合に出るエラーです。
事前準備の項を参考に、OpenCVのインストールを完了させてください。
OpenCV(4.10.0) ~ img.empty() ~
画像の読み込みが正常に行えていない可能性があります。
画像を読み込み・保存する方法の記事を参考に、画像のパスや形式を確認してください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
OpenCVで画像にモザイクをかける方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!