画像処理は、コンピュータサイエンスの中で、急速に発展している分野です。
今後ますます多くの技術に応用されることが予想されます。
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を使って画像の閾値処理(二値化処理)を実装する方法
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による画像の強度変換操作 OpenCV
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値行列です。
この記事もチェック:PythonでOpenCVの画像処理で加算、減算、乗算、除算をする方法
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)
|
結果として得られる画像は次のようになります。
2. 画像のダイレーション
DilationはErosionの反対です。
イメージの白い部分を増やします。
画像に拡張を適用するには、次のコードを使用します。
結果の画像を保存する完全なコードは次のとおりです。
結果として得られる画像は以下のようになります。
画像からノイズを除去するには、消去と拡張を同時に行います。
この記事もチェック:PythonとOpenCVを使って画像ノイズ除去を実装する方法
まとめ
このチュートリアルは Python での画像処理についてでした。
OpenCVが提供するいくつかの基本的な画像処理操作について説明しました。
OpenCV についてより詳しく学ぶには、公式チュートリアルを参照してください。