Pythonによるデータ分析・機械学習ブログ

Pythonによるデータの前処理・グラフ化、機械学習、統計解析、画像処理、Webスクレイピング、自然言語処理の基礎について紹介していきます。

MENU

【第9回】OpenCVを用いた画像内のオブジェクト除去

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

OpenCVには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

画像処理をしていると画像内に不要なものがあるケースがあり、それを除去したくなりますよね。そんな時はOpenCVを用いてオブジェクト除去を実施してみましょう。

本記事ではOpenCVを用いた画像内のオブジェクト除去の方法を簡単に紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事で使用する画像は以下の長野県信州市にある元善光寺の入り口の画像です。

 

2. オブジェクト除去

本記事では上図の元善光寺の看板の「元善光寺」の文字を除去してみたいと思います。

一般的には、除去部分を記したマスク画像を用意して、cv2.inpaint()を用いてオブジェクト除去をします。

まずは除去部分を記したマスク画像を用意します。今回は手動にてマスク画像を生成しました。除去したい箇所を白くし、そのまま残したい部分は黒くします。自動的に行いたい場合はcv2.threshold()で二値化すると良いと思います。今回用意したマスク画像は以下です。

 

続いて、cv2.inpaint()を用いてオブジェクト除去を行いたいと思います。

img = inpaint(src, inpaintMask, inpaintRadius, flags)

引数は以下の表の内容です。

引数 内容
src オブジェクトを除去したい画像データ
inpaintMask 修復用マスク画像
inpaintRadius 近傍円形領域の半径(周辺のピクセルをいくつ利用するか)
flags INPAINT_TELEA(Alexandru Telea法)
INPAINT_NS(Navier Stokes法)

 

それではオブジェクト除去をしていきましょう。

上記のコードを実行した結果は以下の様になります。「元善光寺」の文字が除去されたのがわかると思います。もう少しきれいに除去するには前処理や引数の調整などが必要そうですね。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事ではOpenCVを用いた画像内のオブジェクト除去の方法を簡単に紹介しました。本記事では元善光寺の看板の画像からマスク画像を手動で生成し、cv2.inpaint()を用いて「元善光寺」の文字を除去しました。画像内の不要なものが写り込み、それを除去したいケースが多いかと思いますので、こちらの手法を活用していきましょう。マスク画像の自動生成もOpenCVで行えると、かなり簡単にオブジェクト除去ができますので、そちらも一緒に考えると良いかと思います。

【第8回】OpenCVを用いた画像内の顔認識・目認識、全身認識

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

Opencvには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

物体認識技術の内、人物検知・検出技術を用いて人流の分析、防犯対策、人物安全対策などを実施するケースが多くなっており、物の認識・検出はOpenCVを用いることが実施できるよういなっています。

本記事では、OpenCVを用いた画像内の顔認識、目認識、全身認識の手法の一例を紹介します。

SAMURAI TERAKOYA

 

1. 顔認識器・目認識器・全身認識器ファイルの用意

今回使用する識別モデルはHaar Cascadeで、物体検出に使われる識別器の1つです。こちらの識別モデルはOpenCVでも扱うことができます。

まずは以下のページから顔認識器である「haarcascade_frontalface_alt.xml」、目認識器である「haarcascade_eye.xml」、全身認識器である「haarcascade_fullbody.xml」を適当なフォルダにダウンロードしてください。

github.com

 

2. 認識対象の画像の用意

今回使用する画像は画像処理のチュートリアルでよく使用されているLennaの写真を用います。

参考:The Rest of the Lenna Story

 

3. 顔認識

それでは顔認識を実施していきます。

以下の例では、cv2.CascadeClassifier()で顔認識ファイルを読み込み、cascade.detectMultiScale(img)で画像に対して顔領域を探索して認識した情報を[左上のx座標(x)、左上のy座標(y)、幅(w)、高さ(h)]で返します。その後、cv2.rectangle()を用いて顔認識した座標に対して四角形を描画しています。

ここで、cv2.rectangle()について紹介します。四角形を描画するcv2.rectangle()は以下の様に用います。

cv2.rectangle(img, pt1, pt2, color, thickness=***)

引数は以下の様になります。

引数 内容
img 対象の画像
pt1 四角形の左上の座標(タプル型)
pt2 四角形の右下の座標(タプル型)
color 線の色、(青, 緑, 赤)の順で記載
thickness 線の太さ

 

それでは顔認識した結果を見てみましょう。出力結果は以下のようになります。顔の部分を四角形で囲われていますね。

 

4. 目認識

続いて目の認識を行います。基本的には顔認識のコードと同じです。ただし、今回は目認識ファイル「haarcascade_eye.xml」を用いるのでその部分だけ異なります。

コード例を以下に示します。

出力結果は以下の様になります。

 

5. 全身認識

続いて全身の認識を行います。基本的には顔認識のコードと同じです。ただし、今回は目認識ファイル「haarcascade_fullbody.xml」を用いるのでその部分だけ異なります。

コード例を以下に示します。

今回は以下の画像を対象に全身認識します。(こちらはアメリカ・ワシントン州にあるオリンピック国立公園で撮影した写真です。)

それでは出力結果を見てみましょう。全身が写っている部分に四角の枠が描画されていて、全身認識されているのがわかると思います。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、OpenCVを用いた画像内の顔認識、目認識、全身認識の手法の一例を紹介しました。これらの技術を応用して人流の分析、防犯対策、人物安全対策などを実施することができますが、深層学習を用いた他の手法でも物体認識や物体検出技術があるので、そちらも確認したうえで、活用していきましょう。

 

【第7回】OpenCVを用いた画像のコーナー検出

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

Opencvには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

OpenCVの機能にコーナー検出という手法があり、コーナー検出は動き検出,画像マッチング,画像追跡などで活用されています。

本記事では、OpenCVを用いた画像のコーナー検出の方法について紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事で使用する画像は以下の黒色背景に白色の三角形、四角形、五角形、六角形、円がある画像です。

 

2. コーナー検出

コーナー検出にはcv2.goodFeaturesToTrack()を用います。cv2.goodFeaturesToTrack()は以下の様に用います。

 cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance,  blockSize=***, useHarrisDetector=***, k=***)

cv2.goodFeaturesToTrack()の引数は以下の表のようになります。

引数 内容
image 対象の画像
maxCorners 検出するコーナーの最大数
qualityLevel コーナーの最低限許容される品質を特徴付けるパラメータ。0~1の値
minDistance 検出したコーナー間の最小のユークリッド距離
blockSize 微分共分散行列を計算するための平均ブロックのサイズ
useHarrisDetector Harris検出器を使用するかどうかを示すパラメーター
k Harris検出器の自由パラメータ(Harris検出器を使用する場合)

Harrs検出器を使いたい場合には、useHarrisDetector=Trueにし、kに値を設定してください。

 

本記事では、コーナー検出後にコーナーを赤い円で印をつけます。その円を描画するにはcv2.circle()を用います、cv2.circle()は以下の様に用います。

img = cv2.circle(img, center, radius, color, thickness)

cv2.circle()の引数は以下の表のようになります。

引数 内容
img 円を描画したい画像
center 描画したい円の中心位置
radius 描画したい円の半径
color 描画したい円の色
thickness 描画したい円の太さ。負の場合、中塗り。

 

それでは、cv2.goodFeaturesToTrack()を用いてコーナーを検出し、検出したコーナーにcv2.circle()で円を描画していきます。以下の例では、検出するコーナーの最大値は40、ブロックサイズは3、コーナーの検出品質パラメータは0.2、最小のユークリッド距離は5に設定してコーナーを検出し、検出したコーナーに半径6、太さ2、赤色の円を描画します。

出力結果は以下の様になります。コーナーに円が描かれていますね。適当にパラメータを設定した際には描画できませんでしたが、調整することですべてのコーナーで円を描画できました。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

OpenCVを用いた画像のコーナー検出の方法について紹介しました。動き検出,画像マッチング,画像追跡などを実施したい方はまずはこのコーナー検出を実施できるようになりましょう。

【第6回】OpenCVを用いた画像のモザイク処理

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

Opencvには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

画像に写したくないもの、写ってはいけないものがある際にモザイク処理を実施することがあり、そういった場合にはモザイク処理が重要になっていきます。

本記事では、OpenCVを用いた画像のモザイク処理の方法について紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事で使用する画像は以下の富士山の画像です。

 

2. モザイク処理

モザイク処理をするにはcv2.resize()を用います。cv2.resize()は以下の様に用います。

img = cv2.resize((src, dsize, , interpolation=***)

または

img = cv2.resize((src, dsize=None, fx=***, fy=***, interpolation=***)

引数は以下の様になります。

引数 内容
src 処理したい画像
dsize リサイズ後の画像のサイズ
fx x方向の倍率
fy y方向の倍率
interpolation 補間方法

interpolationには以下の表に示す種類があります。

interpolation 内容
cv2.INTER_NEAREST 最近傍補間
cv2.INTER_LINEAR バイリニア補間
cv2.INTER_CUBIC バイキュービック補間
cv2.INTER_AREA ピクセル領域の関係を利用したリサンプリング
cv2.INTER_LANCZOS4 Lanczos 補間

 

本記事のリサイズ処理ではcv2.INTER_NEARESTを引数interpolationに指定して実行します。

それではリサイズ処理を実施したいと思います。一度補間を適用しながら小さいサイズにリサイズをして、その後補間を適用しながら元の画像のサイズにリサイズする流れになります。

この時、最初のリサイズの倍率が小さいほど、モザイクの濃さが濃くなります。つまり、リサイズの倍率が0に近いほどモザイクが濃くなり、1に近いほどモザイクが薄くなります。そのため、ここではx、y方向の倍率を0.2、0.4、0.6、0.8の4種類を用意してモザイク処理を実施してみます。

出力結果は以下の様になります。確かに倍率が小さいほどモザイクが濃くなっているのがわかりますね。

【fx,fy = 0.2】

【fx,fy = 0.4】

【fx,fy = 0.6】

【fx,fy = 0.8】

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、OpenCVを用いた画像のモザイク処理の方法を紹介しました。画像に写したくないもの、写ってはいけないものがある際にモザイク処理を実施すると思います。普段、それほど使用する機会はないと思いますが、こういった手法があると覚えておくと良いと思います。

【第5回】OpenCVを用いた画像のモルフォロジー処理:ノイズ除去・エッジ抽出

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

Opencvには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

本記事では、ノイズ除去・エッジ抽出を目的としたOpenCVを用いた画像のモルフォロジー処理について紹介します。具体的には、ノイズ除去として、膨張処理、収縮処理、オープニング、クロージング、エッジ抽出としてモルフォロジー勾配の手法について紹介します。

SAMURAI TERAKOYA

 

1. ノイズ除去

ここでは、膨張処理と収縮処理を確認後、それらを用いたオープニングとクロージングの処理の方法を示します。

1.1 膨張処理・縮小処理で使用する画像

ペイントで簡単に作成してみました。

 

1.1 膨張処理

膨張処理には、cv2.dilate()を用います。以下の様に使用します。

img = cv2.dilate(src, kernel, iterations=***)

引数は以下の様になります。

引数 内容
src 処理したい画像
kernel カーネルの大きさ(構造要素を用います)
iterations 処理の適用回数

ここで、kernelの構造要素の種類を見ていきます。kernelの構造要素の設定はcv2.getStructuringElement()を用います。cv2.getStructuringElement()は以下の様に用います。

kernel = getStructuringElement(shape, ksize)

引数 内容
shape 構造の形状
ksize カーネルの大きさ

shapeは以下の様な種類があります。

shape 構造要素
cv2.MORPH_RECT 矩形
cv2.MORPH_ELLIPSE 楕円
cv2.MORPH_CROSS 十字

それぞれ試しに構造要素を見てみましょう。

出力結果は以下の様になります。各形状合わせて要素に1が格納されているのがわかると思います。

 

それでは構造要素を紹介したので、実際に膨張処理を実施していきたいと思います。

出力結果は以下の様になります。白い部分が膨張して太くなっているのがわかると思います。

 

1.2  収縮処理

膨張処理には、cv2.erode()を用います。以下の様に使用します。

img = cv2.erode(src, kernel, iterations=***)

引数は以下の様になります。

引数 内容
src 処理したい画像
kernel カーネルの大きさ(構造要素を用います)
iterations 処理の適用回数

 

それでは縮小処理を実施してみましょう。

出力結果は以下の様になります。白い部分が縮小されて細くなっているのがわかると思います。

 

1.3 オープニング

オープニングとは、収縮をN回行った後に膨張をN 回行う処理です。縮小により白い部分のノイズを除去し、その後膨張させることで白い太い部分を元に戻します。

オープニングとクロージングではcv2.morphologyEx()を用います。cv2.morphologyEx()は以下の様に用います。

img = cv2.morphologyEx(src, op, kernel, iterations)

引数 内容
src 処理したい画像
op モルフォロジー処理の種類
kernel カーネルの大きさ(構造要素を用います)
iterations 処理の適用回数

オープニングでのモルフォロジー処理の種類はcv2.MORPH_OPENを用います。

それではオープニングを実行していきましょう。以下の例では収縮を3回行った後に膨張を3回行っています。

出力結果は以下の様になります。文字は比較的そのままで細かい点や細い線が消えているのがわかると思います。

 

1.4 クロージングで使用する画像

続いてクロージングでは穴埋め作業を行いため、文字内に黒い部分を設けた画像を使用します。以下がその画像です。Pythonの白い文字の内側に黒い点や線があるのがわかると思います。

 

1.5 クロージング

クロージングとは、膨張をN回行った後に収縮をN 回行う処理です。膨張を行うことで白い部分を膨張膨張させて黒いノイズ部分を除去し、その後縮小を行うことで白い部分は元の画像のように戻します。

オープニングと同様にクロージングではcv2.morphologyEx()を用います。

クロージングでのモルフォロジー処理の種類はcv2.MORPH_CLOSEを用います。

それではクロージングを実行していきましょう。以下の例では膨張を3回行った後に収縮を3 回行っています。

出力結果は以下の様になります。文字は比較的そのままで白いPython文字内の黒い細かい点や細い線が消えているのがわかると思います。

 

3. エッジ抽出:モルフォロジー勾配

最後に、モルフォロジー勾配でエッジ抽出を行いたいと思います。モルフォロジー勾配はN回膨張させた画像からN回縮小した画像を引いた画像を生成する処理になります。

モルフォロジー勾配の処理のイメージを以下の図に示します。

 

それではモルフォロジー勾配を実施したいと思います。モルフォロジー勾配の処理ではcv2.morphologyEx()を用います。

img = cv2.morphologyEx(src, op, kernel, iterations)

引数 内容
src 処理したい画像
op モルフォロジー処理の種類
kernel カーネルの大きさ(構造要素を用います)
iterations 処理の適用回数

モルフォロジー勾配でのモルフォロジー処理の種類はcv2.MORPH_GRADIENTを用います。

モルフォロジー勾配の処理で使用する画像は以下になります。

それでは処理を実施するプログラムを以下に示します。膨張と縮小の処理は3回実施しています。

出力結果は以下の様になります。モルフォロジー勾配の処理により元の「Python  OpenCV」の白色の文字のエッジ(輪郭)が抽出されていますね。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、ノイズ除去・エッジ抽出を目的としたOpenCVを用いた画像のモルフォロジー処理について紹介しました。具体的には、ノイズ除去として、膨張処理、収縮処理、オープニング、クロージング、エッジ抽出としてモルフォロジー勾配の手法について紹介しました。これらの処理は画像処理でよく使う手法になるので、ぜひ覚えましょう。事例的には、ひびが入っている物体の画像からオープニングなどでノイズを除去して、モルフォロジー勾配によるエッジ抽出でそのひびを確認するなどが挙げられると思います。

【第4回】OpenCVを用いた画像のエッジ検出

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

Opencvには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

本記事では、Opencvを用いた画像のエッジ検出について紹介します。具体的には、Sobel処理、ラプラシアン処理、Canny処理の手法について紹介します。

SAMURAI TERAKOYA

1. 本記事で使用する画像

ポルトガルリスボンで撮影した以下の画像を本記事で使用します。

 

2. Sobel処理(cv2.Sobel())

Sobel処理ではcv2.Sobel()を用います。cv2.sobel処理は以下の様に使用します。

dst = cv2. Sobel(src, ddepth, dx, dy, ksize=***)

それぞれ以下の項目になります。

引数 内容
src 処理したい画像
ddepth ビット深度
dx x方向の微分次数
dy y方向の微分次数
ksize カーネルサイズ

ここで、ビット深度ddepthの設定内容を示します。ビット深度とは1ピクセル当りに割り当てるデータ量のことです。それぞれ指定して一度実行してみてほしいですが、大抵ddepth=-1とすると比較的きれいにエッジ検出できました。

ddepth 内容
-1 元の画像の配列を使用
cv2.CV_8S int8
cv2.CV_8U unit8
cv2.CV_16S int16
cv2.CV_16U unit16
cv2.CV_32S int32
cv2.CV_32F float32
cv2.CV_64F float64

それではコード例を記載いたします。まずは、読み込んだ画像をグレースケール化してその後、Sobel処理をします。以下の例では、cv2.Sobel()の引数として、ddepthは元の画像の配列を使用、x方向の微分次数は1、y方向の微分次数は1、カーネルサイズは3を指定しています。

出力結果は以下になります。

 

3. ラプラシアン処理(cv2.Laplacian())

ラプラシアン処理ではcv2.Laplacian()を用います。cv2.Laplacian()は以下の様に使用します。

dst = cv2.Laplacian(src, ddepth, ksize=***)

それぞれ以下の項目になります。

引数 内容
src 処理したい画像
ddepth ビット深度
ksize カーネルサイズ

それではコード例を記載いたします。まずは、読み込んだ画像をグレースケール化してその後、ラプラシアン処理をします。以下の例では、cv2.Lappacian()の引数として、ddepthは元の画像の配列を使用、カーネルサイズは3を指定しています。

出力結果は以下の様になります。

 

4. Canny処理(cv2.Canny())

ラプラシアン処理ではcv2.Canny()を用います。cv2.Canny()は以下の様に使用します。

dst = cv2.Canny(image, threshold1, threshold2)

imageは元の画像です。threshold1とthreshold2は閾値であり、画素値の微分がthreshold2よりも大きい場合にエッジと判断し、threshold2を下回ってもthreshold1よりも大きく、かつthreshold2よりも大きい値の箇所と繋がっていればエッジと判断します。

それではコード例を記載いたします。まずは、読み込んだ画像をグレースケール化してその後、Canny処理をします。以下の例では、cv2.Canny()の引数として、threshold1は150.0、threshold2は280.0を指定しています。このthresholdは自分で調整する必要があります。

出力結果は以下の様になります。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、Opencvを用いた画像のエッジ検出について紹介します。具体的には、Sobel処理、ラプラシアン処理、Canny処理の手法について紹介しました。一般的にきれいにエッジ検出をするにはCanny処理だと言われています。

今回の写真に関しても比較的きれいにエッジ検出できていると思います。一方でSobel処理やラプラシアン処理ではノイズが入っていたことにより、きれいにエッジ検出できなかったと考えられます。その点を踏まえながら適切なエッジ検出を実施していく必要があります。

【第3回】OpenCVを用いた画像の平滑化処理

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

Opencvには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

本記事では、Opencvを用いた画像の平滑化処理について紹介します。具体的には、ブラーフィルター、メディアンフィルター、ガウシアンフィルターの手法について紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事で使用する画像を読み込んで表示するコードを記載します。画像の読込にはcv2.imread()を用います。画像の表示にはcv2.imshow() を用います。cv2.waitkey()で表示する時間を指定することができ、cv2.waitkey(0)とすることでキーボードが押されるまで表示されます。cv2.destroyAllWindows() は現在までに作られた全てのウィンドウを閉じます。

さらに、今回はグレースケールにした画像をヒートマップで表示する場面もあるので、ここで元画像をグレースケールにしてヒートマップで示します。

 

2. ブラーフィルター(cv2.blur())

ブラーフィルターは平滑化処理の一つで、平滑化を行うと画像がぼやけます。ブラーフィルターではcv2.blur()を用い、第一引数にフィルターを掛けたい画像、第二引数にボックスサイズを指定します。

ここで計算方法を簡単に示します。わかりやすいようにグレースケールした画像とその画像をブラーフィルター処理後の画像の画素値を確認します。以下の場合3×3のボックスサイズとし、その9つの画素値の平均値をその中央のマスの値に置き換える処理になります。表示用のプログラムとその結果と計算内容を以下の図に示します。

 

以下の例では、5×5ピクセル、15×15ピクセル、25×25ピクセルのボックスフィルタを使用しています。例えば、5×5ピクセルではある1マスの値とその周りの24マスの値の平均値をとってある1マスの値に置き換えます。出力結果を見るとボックスの大きさが大きくなるほどぼやけが増しているのがわかると思います。

【5×5】

【15×15】

【25×25】

 

3. メディアンフィルター(cv2.medianBlur())

メディアンフィルターは平滑化処理の一つで、平滑化を行うと画像がぼやけます。メディアンフィルターではcv2.medianBlur()を用い、第一引数にフィルターを掛けたい画像、第二引数にボックスサイズを指定します。

ここで計算方法を簡単に示します。わかりやすいようにグレースケールした画像とその画像をブラーフィルター処理後の画像の画素値を確認します。以下の場合3×3のボックスサイズとし、その9つの画素値の中央値をその中央のマスの値に置き換える処理になります。表示用のプログラムとその結果と計算内容を以下の図に示します。



以下の例では、3×3ピクセル、5×5ピクセル、11×11ピクセルのある1マスとその周りのマスの中央値をとって、ある1マスの値に置き換えます。出力結果を見るとボックスの大きさが大きくなるほどぼやけが増しているのがわかると思います。

【3×3】

【5×5】

【11×11】

 

4. ガウシアンフィルター(cv2.GaussianBlur())

ガウシアンフィルターは平滑化処理の一つで、平滑化を行うと画像がぼやけます。ガウシアンフィルターではcv2.GaussianBlur()を用い、第一引数にフィルターを掛けたい画像、第二引数にボックスサイズ、第三引数にガウス関数のσを指定します。

ガウス関数の分布を調べていただくとわかるように、ボックスプロット内にて中央になるほど重み付けが大きく、外側ほど重み付けが小さくなるようにして計算するフィルタです。

以下の例では、3×3ピクセル、5×5ピクセル、11×11ピクセルに対してガウシアンフィルターをかけます。出力結果を見るとボックスの大きさが大きくなるほどぼやけが増しているのがわかると思います。

【3×3】

【5×5】

【11×11】

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、Opencvを用いた画像の平滑化処理であるブラーフィルター、メディアンフィルター、ガウシアンフィルターの手法について紹介しました。