1

forループの中にいくつかの画像を呼び出してから、これらの画像を処理しています。その後、私はstep機能を使って、これらのフレームとそのマスクをビデオプレーヤー内に表示しています。マスクイメージ内のオブジェクトに境界を追加するにはどうすればよいですか?また、どのように境界を太くし、マスクの各ブロブの重心をマスク画像にプロットすることができますか?以下は、コードの概略図です。step()関数内で呼び出されるビデオフレームの境界線とセントロイドをプロットする方法

videoPlayer = vision.VideoPlayer(); 
    maskPlayer = vision.VideoPlayer(); 
    for ii = 1:nfiles 
    filenameii = [............] 
    frame= imread(filenameii); 
    mask = dOB(frame,BackgroundImg); 
% some processing on the images 
    mask= bwareaopen(mask,27); 
    boundaries = bwboundaries(mask,'noholes'); 
    B=boundaries{1}; 
    Centroid = regionprops(mask,'centroid'); 
    Centroids = cat(1, Centroid.Centroid); 
    plot(B(:,2),B(:,1),'g','LineWidth',3); 
    plot(Centroids(:,1), Centroids(:,2), 'r+', 'MarkerSize', 10); step(videoPlayer,frame); 
    step(maskPlayer, mask); 

P.S:私はhold onを使用して図に表示する方法を知っているが、私はビデオプレーヤーでそれを表示する前に、これは画像上で直接行わたいと思います。どんな指導も高く評価されます。

答えて

2

ビデオプレーヤに表示する前に、まずマスクのピクセルをペイントしてください。あなたが持っているものは動作しますが、マスクプレーヤーのフィギュアの内側に境界がプロットされます。したがって、検出した境界線をbwboundariesから取り出し、これらの座標から線形インデックスを作成し、イメージの値を白に設定します。さらに簡単な方法は、検出したマスクを取得し、bwperimを使用して、ブロブの境界を含むマスクを自動的に生成することです。また、マスクの穴を埋めるようになっているので、後処理の出力にimfillを直接使用すると、座標の代わりに画像が得られます。このマスクを使用してイメージに直接インデックスを付け、BLOBの境界の座標を目的の色に設定します。周囲を太くしたい場合は、適切な大きさの四角形の構造要素を使用してimdilateを使用して単純な画像拡大を行うと役立ちます。この構造要素の近傍のサイズを、必要な周囲の太さに定義するだけです。最後に、重心をマスクに挿入したい場合や、MATLABコンピュータビジョンシステムツールボックスを使用している場合は、insertMarker関数を使用して、各重心の点集合を使用して画像に直接入れることができます。ただし、マスクをlogicalから画像に適したデータ型に変更する必要があります。 が動作するはずです。したがって、イメージをこの型にキャストし、すべての非ゼロ値に255を掛けて、マスクに白色の色が維持されるようにします。 insertMarkerの場合は、サイズが10の赤いプラスを挿入するため、insertMarkerにそれを反映させる必要があります。また、カラーイメージを作成したいので、あなたのマスクを人工的に色づけし、必要な色のために各平面ごとにこの絵を個別に作成する必要があります。緑が欲しいので、RGB値は(0,255,0)に相当します。

したがって、これを行うようにコードを変更しました。さらに、元の代わりにで塗りつぶしたのセントロイドを計算しました。私たちは、それはあなたが目指しているものでない限り...ギャップを持つオブジェクトの重心を報告誤ってしたいのですが、あなたがいないと仮定していることはできないだろう:

videoPlayer = vision.VideoPlayer(); 
maskPlayer = vision.VideoPlayer(); 

% New - Specify colour you want 
clr = [0 255 0]; % Default is green 

% New - Define thickness of the boundaries in pixels. 
thickness = 3; 

% New - Create structuring element 
se = strel('square', thickness); 

for ii = 1:nfiles 
    filenameii = [............] 
    frame = imread(filenameii); 
    mask = dOB(frame, BackgroundImg); 
    % some processing on the images 
    mask = bwareaopen(mask,27); 
    %boundaries = bwboundaries(mask,'noholes'); 
    %B=boundaries{1}; 

    % New code - fill in the holes 
    mask = imfill(mask, 'holes'); 

    Centroid = regionprops(mask,'centroid');  

    % New code - Create a boundary mask 
    mask_p = bwperim(mask, 8); 

    % New code - Make the boundaries thicker 
    mask_p = imdilate(mask_p, se); 

    % New code - create a colour image out of the mask 
    [red, green, blue] = deal(255*uint8(mask)); 

    % Paint the perimeter of the blobs in the desired colour 
    red(mask_p) = clr(1); green(mask_p) = clr(2); blue(mask_p) = clr(3);   

    Centroids = cat(1, Centroid.Centroid); 
    %plot(B(:,2),B(:,1),'g','LineWidth',3); 
    %plot(Centroids(:,1), Centroids(:,2), 'r+', 'MarkerSize', 10); 

    % New - Make mask into RGB image for marker painting and to 
    % show to the user 
    mask_p = cat(3, red, green, blue); 

    % New - Insert the centroids directly in the mask image 
    mask_p = insertMarker(mask_p, Centroids, '+', 'color', 'r', 'size', 10); 

    step(videoPlayer, frame); 

    % New - Show new mask in the player 
    step(maskPlayer, mask_p); 
end 
+0

おかげでたくさんご回答のため。これは、プレーヤーのブロブの境界線を表示しますが、バイナリイメージではなく境界線を持つ元のイメージを表示します。境界をバイナリイメージの周りに表示したい。なぜそれがそうだと教えてくれますか?また、私はbwboundariesとbwperimの使用の違いを知りたいと思います。 – BlueBee

+0

ああ、私はあなたが元のイメージではなく、バイナリイメージでそれを望んだと思っていました。私は私のポストを更新します。 'bwboundaries'と' bwperim'の違いは、 'bwboundaries'があなたに'(x、y) '点の集合としてブロブの周囲を与えることです。 'bwperim'はブロブの周囲をイメージとして返します。このイメージは、図を表示するためにピクセルをペイントするために不可欠です。 – rayryeng

+0

ありがとう、その作業は完璧です:)。境界/境界の幅を広げることは可能ですか?また、別のウィンドウに現在表示されているように、重心をマスク画像の上にプロットする方法もあります。 – BlueBee

関連する問題