【OpenCV】風景写真のエッジ(輪郭)検出をしてみた

プラグラミング言語「PYTHON」を使ってみよう!!

業務自動化・効率化の実例を踏まえ、解説できればと思っています。対象は、プログラムを学び始めた初心者向けとなります。

今回の内容

  • openCVを使用して物体のエッジ(輪郭)を検出する



使用するのはopenCV

使用するのは、画像処理ライブラリのopenCVです。ここではopenCVがインストールされているのを前提として書き進めていきます。

サンプルコード

import cv2
img = cv2.imread('osaka.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 100)
cv2.imwrite('osaka_NR.jpg', edges)

コメント

  • 1行目 OpenCVをインポート
  • 2行目「img = imread〜」jpegファイル読み込み
  • 3行目「gray = 〜」写真をグレースケールにする
  • 4行目「cannyフィルタ」でエッジ検出をする
  • 5行目「cv2.imwrite〜」エッジ検出したファイルを保存

画像はグレースケールにする必要があるため、3行目でグレー処理をしています。(写真読み込み時にグレースケール読み込みをする方法でも問題ありません。)

OpenCVでの代表的なエッジ検出方法は3つあります。

・ Sobelフィルター
・ ラプラシアンフィルター
・ Canny法

解析するための画像微分の方法などが異なっているようですが、特に拘りがなければCanny法がいちばんいい感じに仕上げてくれると思います。

元画像によっては、4行目にある「edges = cv2.Canny(gray, 50, 100)」←赤字の数値(エッジを判定する閾値)を調整する必要があります。

エッジ検出①:ビルが建ち並ぶ都会の風景


ビルが建ち並ぶ都会の風景をエッジ検出してみました。


それぞれのビルの輪郭を検出できていますが、ちょっと全体的にごちゃごちゃとしてて荒い印象もありますね。

エッジ検出②:単純な建物


直線がメインの単純な建物で検出してみましょう。


これくらいであれば良い感じに検出できそうです。

エッジ検出③:イラスト


イラストでも試してみましょう。


いちばんきれいに輪郭が検出できましたね。やはりはっきりした線だとやりやすいです。



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