OpenCVを用いた画像処理について解説します。今回はエッジ検出についてです。
OpenCVのインストール
最初に、OpenCVを使えるようにするためにopencv-pythonをインストールする必要があります。コマンドプロンプトを起動し、以下のコードを実行してください。(すでにインストール済みの方はもちろん不要です。)
pip install opencv-python
pip install opencv-contrib-python
pip install numpy
これで画像処理を行う準備ができました。
OpenCV(Open Source Computer Vision Library)は画像処理用の関数が多数実装されたオープンソースのライブラリです。マルチプラットフォームなので幅広く使われており、これを利用して画像処理を行っていきます。
画像処理
今回はWindowsでVisual Studio Codeを使用してコードを書いていきます。コードについての大まかな説明はコメントアウトを利用して行います。
エッジ検出
エッジ検出とは、画像中の画素値が急激に変化する部分を取り出す処理です。画像内の物体のエッジ(縁)を見つけることが出来ます。また、処理方法が1つではなく、「Sobel」,「Laplacian」,「Canny」と異なる方法が存在します。
5行目:cv2.imread(‘対象となる画像’,0)
これで対象となる画像を読み込みます。0はグレースケールで読み込み、1ならばカラーで読み込むことになります。
8行目:cv2.Sobel(入力画像,計算後の数値タイプ,x方向の差分,y方向の差分)
Sobelは輝度の変化量を計算して勾配を求め、エッジ検出を行っています。
左が元画像で右がエッジ処理後の画像です。これは第3,4引数を(1,0)としており、x方向(水平方向)のエッジを検出しています。(0,1)とすることでy方向(垂直方向)のエッジを検出することが可能です。差分が0のときはエッジとして検出されないのでこのような結果となります。
9行目、13行目:cv2.convertScaleAbs(対象画像)
こちらで画像のコントラストと明るさの調整を行います。
12行目:cv2.Laplacian(入力画像, 計算後の数値タイプ)
Laplacianは輝度の変化率を計算してエッジ検出を行っています。Sobelではエッジの強度と向きを検出できたのに対して、Laplacianではエッジの強度のみの検出となります。
16行目:cv2.Canny(入力画像, 最小閾値, 最大閾値)
Cannyでは最小閾値と最大閾値を変更することで出力画像が変化します。最小閾値を大きくすると強いエッジのみが検出されるようになり、最大閾値を大きくするとノイズが少なくなり、強いエッジのみが検出されるようになります。つまり、最小閾値を小さくし、最大閾値を大きく設定することで、弱いエッジを保持しつつノイズを少なくすることができます。
18行目、19行目:cv2.imshow(“ウィンドウに表示される文字”, 表示させる画像)
これは画像をウィンドウとして表示させるときに使用します。
ウィンドウに表示される文字とは、左上の文字のことです(この場合は「before」と「after」)。
21行目:cv2.waitKey()
これは次の処理を行うまでの待機時間についての命令です。()内に数値を入れて待機時間を設定します。1000で1秒間待機です。()内が0なら、適当なキーが押されるまで待機ということになります。
22行目:cv2.destroyAllWindows()
これで表示させたウィンドウを全て閉じます。つまり、21,22行目は「適当なキーを入力した時、18,19行目の命令で表示させたウィンドウを閉じる」ということです。
↓コピー用プログラム
import cv2
import math
import numpy as np
img_before = cv2.imread('元となる画像',0) #画像の読み込み
#Sobel
img_tmp = cv2.Sobel(img_before, cv2.CV_64F, 1, 0)
img_after = cv2.convertScaleAbs(img_tmp)
#Laplacian
# img_tmp = cv2.Laplacian(img_before, cv2.CV_64F)
# img_after = cv2.convertScaleAbs(img_tmp)
#Canny
# img_after = cv2.Canny(img_before, 70, 300)
cv2.imshow("before",img_before) #元画像を表示させる
cv2.imshow("after",img_after) #エッジ検出後の画像を表示させる
cv2.waitKey(0) #処理待ち
cv2.destroyAllWindows() #表示させた全てのウィンドウを閉じる
使用する画像はプログラムと同じフォルダーに入れて実行してください。
「cv2.imwrite(‘保存名’, 保存する画像)」で画像を保存することもできます。
「Sobel」,「Laplacian」,「Canny」の内、使用しない関数はコメントアウト、もしくは削除して実行してください。
実行方法
作成したプログラムの実行方法についてです。
まずはコマンドプロンプトを開きます。画面左下の検索バーに「cmd」と入力すると出てくると思います。
次にプログラムファイルの位置を知る必要があります。
エクスプローラーを開いてプログラムファイルがあるところまで行き、上部を確認してください。今回はUSBにフォルダーを作成し、(F:)となっています。USB内の「gazousyori」というフォルダー内に「edge-detect.py」という名前のプログラムを作成しました。ここにコマンドプロンプトの「cd」でディレクトリを変更します。言葉で説明するのが難しいので以下の画像を参照してください。
後はエンターを押すだけで実行できます。別例も以下に挙げておきます。
プログラムファイルの保存場所が異なる&Visual Studio Codeから確認したバージョンです。途中で「ドキュメント」と日本語が入っていますが、これはあまり良くありません。プログラムが正常に動かない場合もあります。
コメント