つれづれなる備忘録

日々の発見をあるがままに綴る

今週のお題「忘れたいこと」

f:id:ATATAT:20211221180342p:plain

今週のお題「忘れたいこと」

今週のお題「忘れたいこと」ということで、ドラマや映画の結末を忘れることができれば再放送など新鮮な気持ちで楽しめると思う。

特にミステリーとか刑事ものは犯人がわかっていると、犯人を予想しながら見るという楽しみは減ってしまう。(古畑任三郎のように最初から犯人がわかっている場合もあるが)

相棒のように放送回数が多いものだと、再放送見ていても犯人を忘れてしまっていることもたまにあるが、大抵は一度みたものであればタイトルと犯人をセットで覚えてしまっている。

OpenCVの使い方19 ~ Canny法

 今回はOpenCVを用いたエッジ検出法としてCanny法にについて紹介する。

1. Canny法

Canny法はエッジ、輪郭検出をするときに使われる。

labs.eecs.tottori-u.ac.jp

処理の流れとしては、平滑フィルタ(ガウシアン)、輝度勾配・方位、非極大抑制、ヒステリシスしきい値という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法を適用した画像になるが、はっきりと輪郭が抽出できていることがわかる。

"Canny法を解像チャートに適用"
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')

大きな影響はないが、しきい値を小さくしたことで中心の解像パターンの薄い文字の輪郭が抽出できている。

"Canny法のしきい値変更"
Canny法のしきい値変更

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法を適用することにより、線画のような画像が得られた。

"Canny法をカラー画像に適用"
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')

しきい値を低い値に設定したことにより、抽出される輪郭が多くより細かい線画のようになっている。

"Canny法のしきい値変更"
Canny法のしきい値変更

4. まとめ

 今回は輪郭・エッジ検出としてCanny法の適用方法や処理結果について紹介した。

geogebraによる幾何学2~三角形の内角和

今回はGeoGebraを使って三角形の内角の和が180°になるという幾何の中で最も有名な定理を示してみる。

atatat.hatenablog.com

"三角形の内角和"
三角形の内角和

まず適当な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の共有リンク

www.geogebra.org