OpenCVの使い方19 ~ Canny法
今回はOpenCVを用いたエッジ検出法としてCanny法にについて紹介する。
1. Canny法
Canny法はエッジ、輪郭検出をするときに使われる。
処理の流れとしては、平滑フィルタ(ガウシアン)、輝度勾配・方位、非極大抑制、ヒステリシスしきい値という4つの処理によって得られる。
前回と同様に以下の解像チャートでCanny法を適用する。
import cv2 import numpy as np from matplotlib import pyplot as plt from google.colab import files uploaded_file = files.upload() orig = cv2.imread(uploaded_file_name) src = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB) gray = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY) plt.imshow(orig, cmap='gray',vmax=255,vmin=0) plt.title('Original')
2. Canny法によるエッジ検出
Canny法を適用するにはcv2.Canny(img,minval,maxval)
を用いる。imgは適用する画像、minvalおよびmaxvalはヒステリシスしきい値処理のための引数になっている。とりあえずminval=100,maxval=200として解像チャート画像orig
にCanny法を適用する
edges = cv2.Canny(orig,100,200) plt.figure(figsize=(8,16)) plt.subplot(1,2,1) plt.imshow(orig,cmap='gray') plt.title('Original') plt.subplot(1,2,2) plt.imshow(edges,cmap='gray') plt.title('Canny edge')
左側は元の解像チャートの画像で右側はCanny法を適用した画像になるが、はっきりと輪郭が抽出できていることがわかる。
次にしきい値をminval=50, maxval=80に変更する。
edges2 = cv2.Canny(orig,50,80) plt.figure(figsize=(8,16)) plt.subplot(1,2,1) plt.imshow(orig,cmap='gray') plt.title('Original') plt.subplot(1,2,2) plt.imshow(edges2,cmap='gray') plt.title('Canny edge')
大きな影響はないが、しきい値を小さくしたことで中心の解像パターンの薄い文字の輪郭が抽出できている。
3. カラー画像へCanny法を適用
解像チャートはモノクロ画像だったが、カラー画像に対しても同じように適用できる。一番上のコードを再度実行し、RGBに変換したsrc = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB)
を元画像として表示する。
Canny法はBGRまたはRGBのどちらの画像に適用しても良いが、今回はBGRのまま(orig)適用する。
edges = cv2.Canny(orig,100,200) plt.figure(figsize=(8,16)) plt.subplot(1,2,1) plt.imshow(src,cmap='gray') plt.title('Original') plt.subplot(1,2,2) plt.imshow(edges,cmap='gray') plt.title('Canny edge')
Canny法を適用することにより、線画のような画像が得られた。
次にしきい値をminval=50, maxval=80に変更する。
edges = cv2.Canny(orig,50,80) plt.figure(figsize=(8,16)) plt.subplot(1,2,1) plt.imshow(src,cmap='gray') plt.title('Original') plt.subplot(1,2,2) plt.imshow(edges,cmap='gray') plt.title('Canny edge')
しきい値を低い値に設定したことにより、抽出される輪郭が多くより細かい線画のようになっている。
4. まとめ
今回は輪郭・エッジ検出としてCanny法の適用方法や処理結果について紹介した。
geogebraによる幾何学2~三角形の内角和
今回はGeoGebraを使って三角形の内角の和が180°になるという幾何の中で最も有名な定理を示してみる。
まず適当な3点をGeogebra上に定義する。例えば2点A,Bをx軸上、残り1点CはXY平面状のどこか。
次にそれぞれ3点を直線で結んで三角形を完成させる。
角度を計測する関数angle (または角度計測ツール)を用いて三角形の内角をa1 = angle (B,A,C), a2 = angle (C,B,A), a3 = angle (A,C,B)として内角の和は suma = a1+a2+a3という式を定義する。
テキストの挿入を用いて三角形の内角の和であるパラメータsumaを表示させて、三角形上の点A,B,Cいずれかを動かしても180°のままであることがわかる。
ちなみに点を移動させるごとに角度を計測できているかどうか確認するために2角の和: sumb = a1 + a2も表示させているが、こちらは点を動かすごとに結果が変わるので、角度計測の機能は働いていることがわかる。
以上上記の操作を行ったGeogebraの共有リンク