質問: 特徴点を用いた、画像の比較方法について matlabを用いて、部品の検品を行いたいと考えております。 以下の画像のような、黒い板に穴が開いている部品を検品しようと考えております。 最終目標は、元画像と比較して、穴が開いていない部分や、多く空きすぎている部分を、赤い丸で囲って検出したいと考えております。 以下の画像には、穴が0個の板がありますが、穴が1個、2個の時にも判別したいと考えております。 円が小さいため、画像の穴を円と認識することはできませんでした。 今のところは、局所特徴の検出と抽出する関数を用いて、以下の写真のような特徴点を抽出することができました。 板の角4点がわかるため、これを組み合わせて、指定の場所に穴が開いているか否かを検出しようとしましたが、画像の大きさや写真を撮る角度が微妙に異なるためにうまく検出することができませんでした。 どのような関数を用いると、目標に近づくことができるでしょうか。 また、そもそもこの考え方より、もっと簡単な方法があればご教授いただければ幸いです。 どうかよろしくお願いします。
回答: やったことの概要 画像のサイズが違うので4隅を抽出して、サイズを合わせました。 穴が認識できないとのことだったので、画像を拡大して穴を認識してます。 コード 画像の読み込み&グレーに変換 i1 = imread('sample1.png'); i2 = imread('sample2.jpg'); i1_g = rgb2gray(i1); i2_g = rgb2gray(i2); montage({i1_g,i2_g}); 4隅の抽出 corners1 = detectfastfeatures(i1_g,'mincontrast',0.1); corners2 = detectfastfeatures(i2_g,'mincontrast',0.1); edge1s = corners1(1).location; edge1f = corners1(end).location - edge1s; edge2s = corners2(1).location; edge2f = corners2(end).location -edge2s; i1_g_c = imcrop(i1_g,[edge1s edge1f]); i2_g_c = imcrop(i2_g,[edge2s edge2f]); 抽出&画像の拡大(5倍にしてます) numrow = max(size(i1_g_c,1),size(i2_g_c,1)); numcol = max(size(i1_g_c,2),size(i2_g_c,2)); i1_g_c = imresize(i1_g_c,[numrow numcol]*5); i2_g_c = imresize(i2_g_c,[numrow numcol]*5); 穴の認識&空いていないほうに貼り付け [centers, radii, metric] = imfindcircles(i1_g_c,[6 20]); centersstrong3 = centers(1:3,:); radiistrong3 = radii(1:3); metricstrong3 = metric(1:3); 穴の表示 imshow(i1_g_c) viscircles(centersstrong3, radiistrong3,'edgecolor','b'); 穴が開いていないものに丸を当てはめました これでどこに穴を開ければいいかわかります imshow(i2_g_c); viscircles(centersstrong3, radiistrong3,'edgecolor','r');