Matlab 円の認識


matlabを使うことにより、多くの画像処理を簡単にすることができる。
その中で今回の記事は円の認識の方法についてまとめていきたいと思う。
1. 画像(ペイント)から読み取る
2. 画像ファイルを読み取って認識
3. リアルタイムで画像処理
この3段階で進めていく。(まず、1だけ投稿。2,3は時間に余裕があったら投稿していきたいです)
参考記事 Acquisition Using the Image Acquisition Tool(英語版)

使用環境

  • matlab 2019a
  • windows 10

1. 画像(ペイント)から読み取る

下の画像内の円を認識していく。楕円も含んでいるため、どこまでが円と認識されるかのテストも含めてやってみる。(fig1.png)

1.1画像を読み込む(+前処理)

matlab
 rgb=imread(fig1.png);

本来はこの段階で、カラー画像からグレースケールへの変換➀やグレースケールから2値化のバイナリイメージを生成➁して、画像処理を進めていく方が計算量は少なくなるが、今回は変換は省略する。(変換する関数は以下の通りである)

matlab
gray=rgb2gray(rgb) % ➀ カラー→グレー
BW=imbinarize(gray) % ➁ グレー→2値化

1.2円の探索

ハフ変換を用いる方法でimfindcircles関数を使う
参考記事 imfindcircles関数
使用例は以下の通り

matlab
 [centers, radii] = imfindcircles(A, [Rmin Rmax])

(入力引数)
(1) A <-探索したい画像(イメージ)を入力
(2)[Rmin Rmax] <- 探索する円の半径の範囲: 閉区間[Rmin,Rmax]を表し,Rmin<=r<=Rmaxに当てはまる半径rの円を探す
注意)あまり範囲を広くとりすぎると精度が落ちるので
 ・Rmax < 3×Rmin
 ・(Rmax - Rmin)<100
に収まるように範囲設定すること。(ただし本記事ではソースコードの簡略化のため、分割せずに書いている)

もし、難しいようであれば。以下のように範囲を分割した方がよい。

matlab
    [CENTERS1, RADII1, METRIC1] = IMFINDCIRCLES(A, [20 60]);
    [CENTERS2, RADII2, METRIC2] = IMFINDCIRCLES(A, [61 100]);

(出力引数)
(1) centers <- 円の中心の座標
(2) radii<- 推定半径

1.3 円の作成

viscircles関数を使って、上記で特定した円を書いていく。

matlab
 viscircles(centers, radii,'Color','g')

オプションとして、'Color'を加えると、円の色を変更することができ(設定しなければ赤色)、bで青色、gで緑色というように指定できる。

1.4 まとめ

全体のコードをまとめると以下のようになり、下の図のように緑色の囲われた3つの円を認識することができた。

matlab
%コードまとめ
 %画像を読み込む
 rgb=imread(fig1.png);
 [centers, radii] = imfindcircles(rgb, [10 100])
 imshow(rgb);
 hold on;
 viscircles(centers, radii,'Color','g')


上図のように、緑色の囲われた円3つを認識できた!