ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

円形オブジェクトの認識

この例では、境界をトレースするルーチンである bwboundaries を使用して、真円度に基づきオブジェクトを分類する方法を示します。

手順 1: イメージの読み取り

pills_etc.png を読み取ります。

RGB = imread('pillsetc.png');
imshow(RGB)

手順 2: イメージのしきい値処理

イメージを白黒に変換して、bwboundaries を使用した境界トレースの準備をします。

I = rgb2gray(RGB);
bw = imbinarize(I);
imshow(bw)

手順 3: ノイズの除去

モルフォロジー関数を使用して、対象オブジェクトに属さないピクセルを除去します。

30 ピクセル未満のすべてのオブジェクトを削除します。

bw = bwareaopen(bw,30);
imshow(bw)

ペンのキャップのギャップを塗りつぶします。

se = strel('disk',2);
bw = imclose(bw,se);
imshow(bw)

regionprops を使用してそれぞれの境界で囲まれた領域を推定できるように、穴を塗りつぶします。

bw = imfill(bw,'holes');
imshow(bw)

手順 4: 境界線の検出

外部境界線のみに焦点を当てます。オプション 'noholes' を指定すると、bwboundaries による内部輪郭の探索が回避されるため、処理が迅速になります。

[B,L] = bwboundaries(bw,'noholes');

ラベル行列を表示して、各境界を描きます。

imshow(label2rgb(L,@jet,[.5 .5 .5]))
hold on
for k = 1:length(B)
  boundary = B{k};
  plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)
end

手順 5: 円形オブジェクトの判別

各オブジェクトの面積および周囲の長さを推定します。これらの結果を使用して、次のようにオブジェクトの丸さを示す簡単なメトリクスを作成します。

metric=4π*areaperimeter2

このメトリクスは円のみの場合に 1 で、他の形状の場合は 1 未満になります。適切なしきい値を設定することにより、識別処理を制御できます。この例では、0.94 のしきい値を使用しているので、錠剤の形状だけが円形として分類されます。

関数 regionprops を使用して、オブジェクトのすべての領域を推定します。関数 bwboundaries によって返されたラベル行列は、関数 regionprops によって再利用できることに注意してください。

stats = regionprops(L,'Area','Centroid');

threshold = 0.94;

% loop over the boundaries
for k = 1:length(B)

  % obtain (X,Y) boundary coordinates corresponding to label 'k'
  boundary = B{k};

  % compute a simple estimate of the object's perimeter
  delta_sq = diff(boundary).^2;    
  perimeter = sum(sqrt(sum(delta_sq,2)));
  
  % obtain the area calculation corresponding to label 'k'
  area = stats(k).Area;
  
  % compute the roundness metric
  metric = 4*pi*area/perimeter^2;
  
  % display the results
  metric_string = sprintf('%2.2f',metric);

  % mark objects above the threshold with a black circle
  if metric > threshold
    centroid = stats(k).Centroid;
    plot(centroid(1),centroid(2),'ko');
  end
  
  text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...
       'FontSize',14,'FontWeight','bold')
  
end

title(['Metrics closer to 1 indicate that ',...
       'the object is approximately round'])

参考

| | | | | | |

関連するトピック