【Python×OpenCV】画像の余白を自動トリミング

 

依頼背景&プログラム概要

今回、依頼者様から下記ご相談を受けました。

現在、複数の画像が余白区切りで繋がった1枚の画像を手動で1枚1枚トリミングして保存しています。

この作業を何とか自動化したいと思い、NeeNet様にご連絡差し上げました。

ご検討のほどよろしくお願いします。

文字だと、少しイメージし辛いと思うので、最終的に作成したプログラムの実行結果からお見せします。

つまり、ECサイトの商品ページにあるような縦長の1枚の画像を、個別の画像として保存したいというご依頼です。

今回、上記画像の灰色部分の矢印の処理をPythonとOpenCVを使って自動化しました。

適用した手法

今回使用した技術は、いわゆる「境界線抽出」です。

人間が見れば、明らかに画像と余白の境目が分かります。

このくらいはっきりしていれば、機械でやるのも特にAIを使わずに古典的な画像処理の方法を適用することで自動化することができます。

今回は画像処理ライブラリとしてOpenCVを採用することにしたので、OpenCVを簡単に活用できるPythonを用いることにしました。

 

方法としては、まずは「2値化処理」を行います。

すなわち、余白の部分とそうでない部分をはっきりさせます。

上記処理は入力した画像を”グレースケール化”し、黒と白に分ける閾値を定めることで出来ます。

まず、2値化処理をした結果が次の通りです。

この時点で何となく自動処理できそうなイメージがつきますよね。

この2値化処理したデータを用いて、さらに「境界線抽出」を行います。

境界線抽出を良く知らない方は、OpenCVのfindContours関数について調べてみて下さい。

公式ドキュメントはこちらになります。

境界線抽出したデータを掲載したいのすが、縦長になると分かり辛いので、上の部分だけを一部表示させます。

赤い枠で囲われた部分が境界線抽出の処理によって抽出されたものです。

ここでよく見ると、洋服の白い部分といった「期待していない部分」まで抽出されてしまっていることが分かります。

また、1枚目と2枚目の画像にはどうやら薄く洋服メーカーのロゴが入っていたようで、その部分も検出されています。

このままトリミングを実行してしまうと、期待している動作とは少しことなる結果になりそうです。

ここで、洋服やロゴを含めないアルゴリズムを考えると、下記の2つが挙げられます。

  • もっとも外側の枠で囲まれたもの(外接矩形)を境界線とする
  • 境界線で囲まれていたとしても、一定サイズを満たしていなければ無視する

 

今回はこの2つを組み合わせることで、期待している動作を実現しました。

実行結果

再掲になりますが、実行結果は次の通りです。

綺麗にトリミングできていることが分かりますでしょうか。

右の5枚の画像以外に出力される無駄な画像はありません。

作成所感

私はもともと画像処理に一定の知見があったので、今回はスムーズに作成することができました。

OpenCVはとても便利な画像処理ライブラリなので、プログラミングに詳しく無い方も「何ができるのか」といった技術の把握のためにユースケースを探してみると良いかと思います。

もちろんAIを使わないとできない画像処理も多いですが、今回のケースのようにOpenCVを使った古典的な画像処理手法のみで完結するものもあります。

ちなみに、その他の古典的画像処理の例として、不鮮明な画像を鮮明にする「ヒストグラム平滑化」をC言語で1から実装したこともあります。

ご依頼について

今回のような画像処理やPythonでのOpenCVを使ったご依頼があれば是非一度ご相談ください。

もちろん内容によってはお断りするものもあるかと思いますが、ご相談・お見積りは無料にて承っておりますので、お気軽にご連絡下さい。

お問い合わせはこちらのページからご確認頂けます。