OpenCV

[Python入門] OpenCVで簡単な画像処理をしてみよう!

近年、画像処理やディープラーニングへの関心は非常に高くなってきており、中でも画像処理は、物体認識や画像識別等をする上では欠かせない技術となっています。

すらいむ管理人

みなさんもスマートフォンアプリやPCで、写真加工をした経験があると思います!

本記事では、物体認識や画像認識の基礎となる画像処理のうち、反転やリサイズ、トリミングなどの手法について、プログラムではどのように処理されているのかを解説していきたいと思います!

OpenCVとは

OpenCVは、画像処理を行うたに必要な膨大な関数があらかじめ用意されたライブラリのことです。

このOpenCVを用いることで、複雑な画像処理プログラムを構築することなく数行のコードだけで処理を行うことができます。OpenCVを用いてできる主な処理は以下の通りです。

  • 図形描写
  • フィルタ処理
  • 行列演算処理
  • グラフィックス処理
  • 画像の読み込み、作成、保存、表示
  • 画像の回転・上下反転・左右反転
  • モザイク処理・マスク処理・2枚の画像を合成
  • 物体検出、特徴点検出
  • テンプレートマッチング
  • カメラキャプチャ、動画処理    など……

図形の描写だけでなく、顔や特徴量の検出、動画編集など多岐にわたるライブラリが詰め込まれています!

自分自身でいろいろ触ってみると面白いですよ!

準備

OpenCVのインストール

OpenCVを用いて画像を読み込むためには、cv2モジュールをインストールする必要があります。そのため、コマンドプロンプトに以下のコマンドを入力し、実行してください。少し待ってSuccessfully installedと表示されたらインストール完了です。

pip install opencv-python

画像を読み込む方法

OpenCVを用いて画像を読み込む際には、cv2.imread()を使用します。引数には読み込みたい画像の保存先URLを入力しておきます。

インスタンス名 = cv2.imread ( ” C:¥image.jpg " ) #この場合はCドライブ内のimage.jpgという画像を指定

画像を保存したい場合

OpenCVを用いて画像処理を行った後の画像データを保存したい場合には、cv2.imwrite()を利用します!

画像処理を行った次の行に挿入することで画像を保存することができます。書き方は以下の通りです。第一引数に保存先URL、第二引数に保存したい画像データを指定します。

cv2.imwrite("address",画像名)

以下の記載の場合は、flip1という画像をCドライブ、Imagefile内に ”flip0” という名前のjpg画像を保存するという指定になります。

cv2.imwrite("C:\Imagefile\flip0.jpg",flip1)

画像を反転(フリップ)する方法

初めに、画像を反転(フリップ)する方法を説明していきます。
今回はこちらの画像を反転させてみたいと思います。

flip-image

今回用いるメソッドは以下の通りです!

メソッド名効果
cv2.flip()画像を反転(フリップ)させる
cv2.imwrite()画像を保存する
cv2.imshow()画像を表示させる

cv2.flip()
第一引数には、読み込んだ画像を入れたインスタンスを指定し、第二引数には -1,0,1 のどれかを選択します。 -1,0,1 それぞれを指定した場合の結果は、下記に示しています。

cv2.imwrite()
第一引数には、保存したいファイルの保存先と保存する画像データの名前を指定します。そして第二引数には、反転データが格納されたインスタンスを指定します。

cv2.imshow()
第一引数には、表示画像タイトルを指定し、第二引数には表示させたい画像を指定します。

  flip1=cv2.flip(image,0)
    cv2.imwrite("C:",flip1)
    cv2.imshow("flip1",flip1)

以上のことを踏まえて、画像を反転させるプログラムを実際に見てみましょう!
※実際に動かす際は ¥→半角\ に置き換えてください

import cv2

def main():
    image=cv2.imread("C:\Imagefile\cat-image.jpg")
#反転imwrite:0
    flip1=cv2.flip(image,0)
    cv2.imwrite("C:\Imagefile\flip0.jpg",flip1)
    cv2.imshow("flip1",flip1)
#反転imwrite:1
    flip2=cv2.flip(image,1)
    cv2.imwrite("C:\Imagefile\flip1.jpg",flip2)
    cv2.imshow("flip2",flip2)
#反転imwrite:-1
    flip3 = cv2.flip(image, -1)
    cv2.imwrite("C:\Imagefile\flip-1.jpg",flip3)
    cv2.imshow("flip3", flip3)

    if image is None:
        print("ファイルが見つかりません")
        import sys
        sys.exit()
    cv2.waitKey()
    cv2.destroyAllWindows()

if __name__=="__main__":
    main()

(実行結果:画像下の数字はimwriteの第二引数で指定した値

flip-image2
flip-image3

おすすめ書籍

画像のリサイズ

すらいむ管理人

次は画像のリサイズについて勉強してみましょう!

画像のリサイズをする場合には、cv2.resize() メソッドを用います。ここで第一引数には、リサイズしたい画像を指定し、第二引数にはリサイズ後の画像サイズを指定します。

resize = cv2.resize ( image , ( fx , fy ) )

また、リサイズ手法は2パターンに分けられます。
一つ目はアスペクト比(縦横比)を保持させないでリサイズする方法で、二つ目はアスペクト比を保持させつつリサイズする方法です。

では順番に説明していきます!

アスペクト比(縦横比)を保持させない場合

初めに、アスペクト比を保持させない場合のプログラムを以下に示します。
※実際に動かす際は ¥→半角\ に置き換えてください

import cv2

def main():
    image=cv2.imread("C:\Imagefile\cat-image.jpg")

    resize1 = cv2.resize(image, (150,300))
    cv2.imshow("resize1", resize1)
    resize2 = cv2.resize(image, (250, 200))
    cv2.imshow("resize2", resize2)
    resize3 = cv2.resize(image, (400, 200))
    cv2.imshow("resize3", resize3)

    if image is None:
        print("ファイルが見つかりません")
        import sys
        sys.exit()

    cv2.waitKey()
    cv2.destroyAllWindows()

if __name__=="__main__":
    main()

(実行結果)

resize-image
すらいむ管理人

画像の縦と横のサイズを数値で指定するとアスペクト比が保持されないです!なので画像自体が引き伸ばされたように表示されます!

アスペクト比を保持させつつリサイズする方法

次にアスペクト比を保持させつつリサイズする方法です。プログラムは以下の通りになります。
※実際に動かす際は ¥→半角\ に置き換えてください

import cv2

def main():
    image=cv2.imread("C:\Imagefile\cat-image.jpg")

    scale1=0.5
    scale2=1.5
    height=image.shape[0]
    width=image.shape

    resize1=cv2.resize(image,(int(width*scale1),int(height*scale1)))
    cv2.imshow("resize1",resize1)
    resize2 = cv2.resize(image, (int(width * scale2), int(height * scale2)))
    cv2.imshow("resize2", resize2

    if image is None:
        print("ファイルが見つかりません")
        import sys
        sys.exit()
    cv2.waitKey()
    cv2.destroyAllWindows()
if __name__=="__main__":
    main()

(実行結果)

resize-image4
すらいむ管理人

cv2.resize()の引数として指定する縦と横のサイズそれぞれに同じ値を掛けることでアスペクト比を保持できます!

アスペクト比を保持した場合でのリサイズは、画像が引き伸ばされることなく拡大・縮小されていることが分かります。

画像をトリミングする方法

画像をトリミングするためには、以下のコードを実行します。

インスタンス名 [ x0 : x1 , y0 : y1 ]

ここで、各引数は以下のようになっており指定した範囲以外をトリミングします。

x0横方向の切り出し開始位置(pixcel)
x1横方向の切り出し終了位置(pixcel)
y0縦方向の切り出し開始位置(pixcel)
y1縦方向の切り出し終了位置(pixcel)

実際にトリミングした結果を以下に示します。
※実際に動かす際は ¥→半角\ に置き換えてください

import cv2

def main():
    image=cv2.imread("C:\Imagefile\cat-image.jpg")

    trimming1=image[0:300,0:300]
    cv2.imshow("trimming1",trimming1)
    trimming2 = image[150:450, 150:450]
    cv2.imshow("trimming2", trimming2)

    if image is None:
        print("ファイルが見つかりません")
        import sys
        sys.exit()
    cv2.waitKey()
    cv2.destroyAllWindows()
if __name__=="__main__":
    main()

(実行結果)

resize-image5
すらいむ管理人

このようにして任意の場所を切り出すことができます!

以上となります。最後まで見ていただきありがとうございました!
OpenCVによる二値化手法や、Python学習に役立つおすすめ書籍も紹介していますので是非参考にしてみて下さい!

画像処理(OpenCV)の学習におすすめの本

参考:[2022年最新][初心者向け] Pythonに役立つ書籍:厳選12選
参考:[OpenCV] 二値化処理手法を徹底解説!