2016-04-20 8 views
0

私は、matlabでバイナリイメージのギャップを埋めることを参照していくつかの領域を見つけましたが、まだ苦労しています。私は次のコードを書いていますが、動作させることはできません。ここに私のバイナリイメージがあります:バイナリイメージのギャップを埋める

Binary_image.pngです。

しかし、私が達成しようとしていることは、次の

Binary_image_afterです。

誰でもこれを行う方法を知っていますか?私はimfillを使って試してきましたが、私はbwlabelの関数でも境界を定義する必要があると思っていますが、私はそのことを知りません。どんな助けでも大歓迎です。

%%Blade_Image_Processing 

clc; 
clear; 

%%Video file information 
obj = VideoReader('T9_720p;60p_60mm_f4.MOV'); 

% Sampling rate - Frames per second 
fps = get(obj, 'FrameRate'); 
dt = 1/fps; 

% ----- find image info ----- 
file_info = get(obj); 
image_width = file_info.Width; 
image_height = file_info.Height; 

% Desired image size 
x_range = 1:image_height; 
y_range = 1:image_width; 
szx = length(x_range); 
szy = length(y_range); 



%%Get grayscale image 
grayscaleimg1 = rgb2gray(read(obj,36)); 
grayscaleimg = imadjust(grayscaleimg1); 
diff_im = medfilt2(grayscaleimg, [3 3]); 
t1=60; 
t2=170; 
range=(diff_im > t1 & diff_im <= t2); 
diff_im (range)=255; 
diff_im (~range)=0; 

% Remove all those pixels less than 300px 
    diff_im = bwareaopen(diff_im,2000); 

    %imshow(diff_im) 

    %imhist(grayscaleimg) 

    %Fill gaps in binary image 
    BW2 = imfill(diff_im,'holes'); 

答えて

1

2つの主な問題があります。目的のオブジェクトは容易に使用できる識別機能を持たず、他のオブジェクトに触れます。第2の問題はおそらく形態学的な開閉によって(おそらく薄い、望ましい物体ではなく、これは常にそうであるか?)最初に問題が残る。あなたのオブジェクトがエッジに触れていて他のオブジェクトがエッジに触れていない、またはその逆の場合は、imfillと減算で何かできます。今のように、MAYBEは次のように動作します:

  • 開閉の接続を解除すると、オブジェクトがばらばらになります。
  • imfillを使用して、この薄い水平なものの残っているものを削除します。
  • 次に、bwlabelを使用して、画像の側面または底面に接触するすべてのものを削除することができます。

正確な解決方法は、写真に何か追加の制約があるかによって大きく異なります。私はそれがワンショットではないと信じています。むしろあなたはそれらの写真を多く持っていて、すべてのものを正しく見つけたいと思っていますか?オブジェクトが常に薄いものだけに触れている場合や、常に上端などに触れている場合など、すべての画像の内容を確認する必要があります。