2016-04-20 176 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

存在兩個主要問題:期望對象沒有容易使用的區分特徵,並且觸及其他對象。第二個問題或許可以通過形態學開放/關閉來解決(觸摸物體很薄,不需要物體,情況總是如此?),但第一個問題依然存在。如果你的物體碰到了邊緣,但其他物體沒有碰到邊緣,反之亦然,你可以用imfill和減法做些事情。現在,MAYBE這樣的東西可以工作:

  • 隨着打開/關閉刪除連接,所以你的對象是不相交的。
  • 使用imfill,刪除剩下的這個細水平的東西。
  • 然後,你可以bwlabel並刪除所有接觸圖像的側面或底部的東西 - 在所示的情況下,將只留下你的物體。

確切的解決方案在很大程度上取決於您的照片有哪些額外的限制。我相信這不是一次性的,而是你有更多的這些圖片,並想要正確地找到所有對象?您必須檢查所有圖片的保留情況,例如對象是否總是隻接觸薄片,或者是否只接觸上邊緣等。