2014-12-05 2 views
-1

Я работаю над изображением в Matlab, как показано в ссылке http://lyremjeni.files.wordpress.com/2013/08/tocleanblobs.jpgОтдельные подключенные объекты и отдельные объекты из изображения

Я хочу, чтобы отделить подключенные/сгруппированных сгустки клеток и отдельные сгустки клеток из изображения и отображать их в отдельный цифры. любезно предложите, как я могу достичь этого разделения.

ответ

4

Вот два решения, которые вы можете использовать, 1-й, используя bwconncomp, который находит связанные элементы в двоичном изображении, а второй - imfindcircles, которые считают, что это или нет круги! Поэтому в тех случаях, когда объекты для обнаружения не являются кругами, первое решение было бы предпочтительным.

Я предпочитаю первый, поскольку он различает отдельные круги и кластеры кругов, что и требовалось, тогда как метод, использующий imfindcircles, весьма полезен для идентификации отдельных кругов, поэтому не обязательно кластеры. Вот код:

1- bwconncomp

clear 
close all 
clc 

A = imread('Circles.jpg'); 
BW = im2bw(A); %// Convert to binary with threshold of 0.5. 

CC = bwconncomp(BW); %// Find connected components. 

Это то, что CC выглядит, то есть структуру с парой полей:

CC = 

    Connectivity: 8 
     ImageSize: [256 256] 
     NumObjects: 15 
    PixelIdxList: {1x15 cell} 

Как вы видите, есть 15 объектов обнаружено.

Теперь петля Повсеместно он возражает и сюжет/нарисовать их:

BW2 = zeros(size(BW)); %// Create dummy image for display purposes. 
imshow(BW2) 
hold on 

for k = 1:CC.NumObjects %// Loop through each object and plot it in white. This is where you can create individual figures for each object. 

    PixId = CC.PixelIdxList{k}; %// Just simpler to understand 

    if size(PixId,1) ==1 %// If only one row, don't consider.   
     continue 
    else 
    BW2(PixId) = 255; 
%figure(k) %// Uncomment this if you want individual figures. 
    imshow(BW2) 
    pause(.5) %// Only for display purposes. 
    end 
end 

Если вы запустите код, который вы увидите, что это на самом деле создает только одну цифру; это только для демонстрации, но если вы хотите, чтобы каждый объект фигуры просто добавлял figure в цикле, где я заметил, что создаю его.

2- imfindcircles

Здесь принцип очень прост, так как алгоритм обнаруживает круги и сохраняет их радиус и координаты центра. Затем довольно легко построить/обрезать их, чтобы получить их индивидуально. Как я уже сказал, он не обнаруживает кластеров кругов, но я думал, что это может быть хорошо знать в любом случае.

Здесь я создаю фигуру для каждого обнаруженного круга.

A = imread('Circles.jpg'); 
[centers, radii, ~] = imfindcircles(A,[5 25],'Sensitivity',.95,'ObjectPolarity','bright'); 

A_crop = cell(1,numel(radii)); 
for k =1:numel(radii)  

%// Since imcrop requires a cropping rectangle, we need to fin the x and y coordinates of the lower-left corner, as well as the width and height of the rectangle. 
    x = centers(k,1); 
    y = centers(k,2); 
    r = radii(k); 
    A_crop{k} = imcrop(A,[x-r y-r 2*r 2*r]); %// [x y width height] 
    imshow(A_crop) %// New figure 
    pause(0.5) 
end 

Если вы хотите увидеть все круги очерченные, вы можете использовать это:

imshow(A); 
hold on 

viscircles(centers, radii,'EdgeColor','b'); 
hold off 

дает следующее:

enter image description here

+1

Хорошая работа, мой друг! +1 – rayryeng

+0

Спасибо Рэй! Скажем, вопрос был не самого высокого качества, но было слишком сложно противостоять ему ответить :) –

0

Если вы хотите отделить одиночные пятна от сгруппированные капли (это было то, что я понял из вашего вопроса), попробуйте код ниже.

Это в основном:

  • Сегмент изображение с использованием фиксированного порога (0.5) так как изображение просто черное/белое

  • Найти подключенные компоненты

  • Вычислить метрику для каждого подключенного компонента. Показатель: 4*pi*area/perimeter^2. Этот показатель является только 1 для идеального круга, и меньше, чем 1 для любой другой формы

  • Используйте метрику, чтобы отделить одиночные сгустки из сгруппированных сгустков (одиночные сгустки будут очень похожи на круг, сгруппированные сгустки не будут)

Код:

function[single, grouped] = ipl_separateblobs(I) 

% I is assumed to be a grayscale image 

% Step 1: Convert image from grayscale to binary 
BW = im2bw(I); 

% Step 2: Find connected components 
[L, n] = bwlabel(BW); 
stats = regionprops(L, 'Area', 'Perimeter', 'Image'); 

% Step 3: Separate objects (avoiding very small objects) 
MIN_AREA = 10; 
MIN_CIRCLE_METRIC = 0.75; 
single= []; 
index_s = 0; 
grouped = []; 
index_g = 0; 

for i=1:n 
    if(stats(i).Area >= MIN_AREA) 
     metric = (4*pi*stats(i).Area)/(stats(i).Perimeter^2); 
     if(metric >= MIN_CIRCLE_METRIC)    
      index_s = index_s + 1;    
      single{index_s, 1} = stats(i).Image; 
      single{index_s, 2} = metric;     
     else 
      index_g = index_g + 1; 
      grouped{index_g, 1} = stats(i).Image; 
      grouped{index_g, 2} = metric;     
     end 
    end 
end 

% Display original image 
figure('Name', 'Original image'); 
imshow(I); 

% Display single objects 
figure('Name', 'Single blobs'); 
m = ceil(index_s/3); 
for i=1:index_s 
    subplot(m, 3, i); 
    imshow(single{i,1}); 
    title(['Metric: ' num2str(single{i,2})]);  
end 

% Display grouped objects 
figure('Name', 'Grouped blobs'); 
m = ceil(index_g/3); 
for i=1:index_g 
    subplot(m, 3, i); 
    imshow(grouped{i, 1}); 
    title(['Metric: ' num2str(grouped{i, 2})]); 
end 

end 

Вы, возможно, потребуется настроить значение MIN_AREA и MIN_CIRCLE_METRIC в соответствии с вашими потребностями:

  • Подключенных компоненты, площадь меньше, чем MIN_AREA будет пропущен (чтобы избежать помех)

  • Подключенных компонентов, метрики больше или равно, чем MIN_CIRCLE_METRIC рассматриваются как единый сгусток; в противном случае они считаются сгруппированным блобом.

Пожалуйста, не бойтесь задавать любые сомнения, которые могут возникнуть у вас.

Смежные вопросы