【OpenCV】画像に枠をつける【複数ファイルを一括で処理】

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

送られてきた画像をWEBページに貼りたいんだけど、
外枠が無いからわかりずらい…。
OpenCVで画像に枠をつけることはできないの?

今の自分
今の自分

なるほど…。
では今回は、「OpenCVで画像に枠をつける方法」
できるだけわかりやすく解説いたします。
また、「複数のファイルを一括で処理する方法」
も紹介いたしますので、最後まで読んでいってください。

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

OpenCVで画像に枠をつける方法

「copyMakeBorder」を使います。
まずは1枚の画像に枠をつけてみましょう。

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

全コード

import cv2

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

output_img = cv2.copyMakeBorder(input_img, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[0, 0, 0])

cv2.imwrite('C:/Utatane/output_img.jpg', output_img)
output_img = cv2.copyMakeBorder(input_img, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[0, 0, 0])

実行結果

事前準備

  • OpenCVのインストール

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

pip install opencv-python

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

解説

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

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

画像に枠をつける

output_img = cv2.copyMakeBorder(input_img, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[0, 0, 0])

上記一文にて、画像に枠をつけることができます。
少し長いため、1つ1つ解説していきます。

まず新しい名前の変数を書いたら、「=(イコール)」を書きます。
変数の名前を付ける際、注意すべきところがあります。下記記事をご参考ください。

イコールの後ろに「cv2.copyMakeBorder()」を書きます。
()内には大きく分けて4つの引数を指定します。

  1. 枠をつける画像
  2. 枠線の幅
  3. 枠線のタイプ
  4. 枠線の色

【枠をつける画像】
読み込んだ元画像が入った変数(今回は「input_img」)を指定します。

【枠線の幅】
幅は4種類「上側,下側,左側,右側」の順番で指定します。
しかしながら、枠線の幅はすべて同じにすることがほとんどですので、順番は特に気にしなくて大丈夫です。
同じ幅を4回記述してください。
今回はすべて「5px」にしています。

【枠線のタイプ】
「cv2.BORDER_CONSTANT」を指定してください。
これは、「画像の外側に指定の枠をつける」という解釈でOKです。

【枠線の色】
光の3原色で指定します。
対応する色は、[B(青), G(緑), R(赤)]となります。[R, G, B]ではないのでご注意ください。
赤枠にしたいなら[0, 0, 255]と記述します。
今回は黒の枠をつけるため[0, 0, 0]を記述しています。

【枠をつける際の注意点】

下図をご覧ください。
元の画像は600×600pxですが、枠をつけた画像は610×610pxになっています。
画像の外側に枠線が追加され、その分大きくなりますのでご注意ください。

スポンサードリンク

複数の画像に枠をつける方法(フォルダ内一括処理)

冒頭の会話のように、フォルダにある全ての画像に枠をつけることもできます。
下記コードは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.copyMakeBorder(input_img, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[0, 0, 0])
        cv2.imwrite(os.path.join('C:/Utatane/output', filename), output_img)

ざっくりと解説いたします。

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

<コード6行目~最後>
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をコピーしました