本記事ではPythonでOpneCVを使う基本的な方法をまとめてご紹介していきます。
基本的なコード
gistfab591cfdb90caa6e26853aa313bb8ac
説明
基本的なソースコードについては非常に簡単な仕組みになっています。
ただ指定のフォルダ内にあるPNG画像を読み込み、それを指定されたフォルダ内に保存するだけです。
次からはコメントアウト部分に画像処理のコードを入れていきます。
実際のコード
gist57f994b55d9bdcd887802b70c9d75ecc
サンプルとして上記の画像を使用します。
コントラスト調整
- contrast_image = cv2.convertScaleAbs(base_image, alpha=contrast_adjustment_value, beta=0)
まずは元画像のコントラスト調整を行っています。
この処理は画像処理を行う前段階で行っておくべき処理となっています。
この処理の結果は上図です。
クロマキー処理
- hsv_chroma_key_color = cv2.cvtColor(chroma_key_color, cv2.COLOR_BGR2HSV)
- lower_green = np.array([hsv_chroma_key_color[0][0][0] - chroma_key_threshold, 50, 50])
- upper_green = np.array([hsv_chroma_key_color[0][0][0] + chroma_key_threshold, 255, 255])
- hsv_image = cv2.cvtColor(contrast_image, cv2.COLOR_BGR2HSV)
- chromakey_image = cv2.inRange(hsv_image, lower_green, upper_green)
- mask_image = cv2.bitwise_not(chromakey_image)
次に使う場面が多いと考えられるのは、クロマキー処理です。
本記事では緑色を指定していますが、指定色だけ消しています。
また本記事のプログラムでは、このクロマキー処理した画像をマスク画像にするため、二値化を行っています。
クロマキー処理を行った画像が上図です。
ノイズ除去
- for _ in range(noise_removal_iterations):
- kernel = np.ones((5, 5), np.uint8)
- mask_image = cv2.dilate(mask_image, kernel, iterations=1)
- mask_image = cv2.erode(mask_image, kernel, iterations=1)
このままマスク処理を行ってもいいのですが、より精度を上げるためにノイズ除去を行います。
本記事のノイズ除去は膨張・縮小を使うモルフォロジー処理となりますが、他にも様々なノイズ除去方法を行うのもいいかもしれません。
ただし、ノイズ除去を行う回数が多すぎたり、適切な方法を使えないと必要な部分も除去してしまうため注意してください。
ノイズ処理を行ったマスク画像が上図です。
マスク処理
- result_image = cv2.cvtColor(base_image, cv2.COLOR_BGR2BGRA) # RGBA形式に変換
- result_image[:, :, 3] = mask_image # アルファチャンネルにマスク画像を設定
最後に今まで処理してきた画像を使用して、元の画像を切り取ります。
本記事では透明化処理を行っています。
結果は上図のようになります。
一見綺麗に切り取れたように見えますが、境界線をよく見ると緑色の部分が少し残っているのが分かります。
これをどう消していくのかが、OpenCVの応用になるでしょう。
使ってみた感想
とある事情で画像処理機能が欲しくなって作ってみましたが、正直なところあまり私は使いこなせませんでした。
どうしてもAIを使った画像処理と比較すると、精度面で劣ってしまいます。
私も最終的には下記の「Clipdrop」というサービスを使いました。
何よりAIを使った画像処理は、色指定などすることなく勝手に判別して処理してくれるのでかなり便利です。
Python×AIを使った画像処理方法も調べたのですが、かなり複雑そうなのでスッパリ諦めて既存のサービスを使った方がいいかもしれないというのが私の感想となります。
本記事の内容は以上となります。
本当はもっと多くの事を試していたんですが、何度も消しては追加してを繰り返していくうちに、マトモに残っていたものはこれくらいでした。
場合によっては再びOpenCVの残り部分についての記事も執筆するかもしれません。
本記事は以上です。お疲れさまでした。