PythonでOpenCVを使って画像処理 |エッジ検出、画像縮小・拡大、モルフォロジカル処理を解説

スポンサーリンク

画像処理は、コンピュータサイエンスの中で、急速に発展している分野です。

今後ますます多くの技術に応用されることが予想されます。

Pythonでの画像処理は、コンピュータビジョンや人工知能のような、より高度な分野への応用の余地もあります。

画像処理は、画像に対して実行できる操作の集合体です。

多くの場合、これらの操作は、画像を学習しやすい形式に変換するために必要です。

これらの操作には、グレースケールへの変換、回転、切り抜き、エッジ検出などがある。

適切な定義は以下の通りです。

画像処理とは、画像をより美しくするため、あるいは画像から有用な情報を抽出するために、画像に対して何らかの処理を行うことです。

この記事では、重要な画像処理操作のいくつかを見ていきます。

この記事では、画像処理のタスクを達成するためにOpenCVを使用します。

このチュートリアルは、前回のPythonで画像を読み取るチュートリアルに続くものです。

では、まずOpenCVを使って画像をPythonにインポートする方法から学びましょう。

その前に、OpenCVをシステムにインストールする必要があります。

スポンサーリンク

Python の画像処理ライブラリのインストール – OpenCV


OpenCVは,以下のpipコマンドでインストールすることができます

pip install opencv-python
import cv2

インストールが完了したら、インポートして使い始めることができます。

OpenCVをpythonノートブックにインポートするためのコードは以下の通りです。

edges = cv2.Canny(image,50,300)

Pythonによるエッジ検出機能

OpenCVには,画像中のエッジを検出するオプションもあります.エッジ検出は特徴記述、画像分割、画像強調、画像復元、パターン認識、画像圧縮などに広く利用されています。

ここでは、キャニーエッジ検出器を用いてエッジ検出を行うことにします。

キャニーエッジ検出では、エッジ検出を行うために、最大値と最小値が必要です。

最大値以上の強度勾配を持つエッジは確実にエッジであり、最小値以下のエッジは確実に非エッジであるため、破棄されます。

エッジ検出を行うには、以下のコード行を使用します。

import cv2
image = cv2.imread("sample.jpg")
edges = cv2.Canny(image,50,300)
cv2.imwrite('sample_edges.jpg',edges)

最初の引数は画像の変数名です。

結果の画像を保存するための完全なコードは次のとおりです。

res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

結果画像は次のようになります。

kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(image,kernel,iterations = 30)

Python で画像のサイズを変更する


リサイズは,画像を扱う際に必要となるもう1つの重要な操作です.

OpenCV は,画像のサイズを変更する方法を提供しています.画像のサイズを変更するには,以下のコードを使用します.

import cv2
import numpy as np
image = cv2.imread("sample.jpg")
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(image,kernel,iterations = 30)
cv2.imwrite('sample_erode.jpg',erosion)

ここで,fx は横軸のスケーリングファクター,fy は縦軸のスケーリングファクターです.

機能によって,異なる補間方法が利用可能です.

縮小には cv2.INTER_AREA を、拡大には cv2.INTER_CUBIC & cv2.INTER_LINEAR を利用できます。

モフォロジカル画像処理演算

OpenCVでは,画像に対してErosion, Dilation, Opening, Closingなどのモルフォロジカルな操作を行うこともできます.

モルフォロジー演算は,形状に基づくものです.画像にモルフォロジーを適用するためには、構造化要素が必要です。

構造化要素は、2次元の2値行列です。

1. 画像の侵食

画像処理における侵食の基本概念は、土壌侵食のようなものです。

前景のオブジェクトの境界を侵食します。

侵食は、画像内の白い領域を減少させます。

画像に浸食を適用するには、以下のコード行を使用します。

kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(image,kernel,iterations = 30)

最初の行はカーネルを宣言し、2番目の行はカーネルを使用してエロージョンを実行します。

結果の画像を保存するための完全なコードは :

import cv2
import numpy as np
image = cv2.imread("sample.jpg")
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(image,kernel,iterations = 30)
cv2.imwrite('sample_dilate.jpg',dilation)

結果として得られる画像は次のようになります。

Install Opencv
Install Opencv

2. 画像のダイレーション

DilationはErosionの反対です。

イメージの白い部分を増やします。

画像に拡張を適用するには、次のコードを使用します。

Edge Detection
Edge Detection

結果の画像を保存する完全なコードは次のとおりです。

Erosion
Erosion

結果として得られる画像は以下のようになります。

Dilation
Dilation

画像からノイズを除去するには、消去と拡張を同時に行います。

まとめ

このチュートリアルは Python での画像処理についてでした。

OpenCVが提供するいくつかの基本的な画像処理操作について説明しました。

OpenCV についてより詳しく学ぶには、公式チュートリアルを参照してください。

タイトルとURLをコピーしました