2015-11-04 6 views
0

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

%im = input image; 
% alpha1 = 0.0001; 
% alpha2 = 0.0001; 
% [row col] = size(im); 
% 
% 
% thr1 = mean(mean(im))-alpha1*std(std(im)); 
% BW = zeros(size(im)); 
% 
% for rr = 1:row 
%  for cc = 1:col 
%   if im(rr,cc)>thr2 
%    BW(rr,cc) = 1; 
%   else 
%    BW(rr,cc) = 0; 
%   end 
%  end 
% end 
% 
% CC = bwconncomp(BW); 
% area_in_pixels = cellfun(@length,CC.PixelIdxList); 
% thr2 = mean(area_in_pixels)-alpha2*std(area_in_pixels); 
% idx = find(area_in_pixels <= thr3); 
% for kk = 1:length(idx) 
% aaa = idx(kk); 
% BW(CC.PixelIdxList{aaa})=0; 
% end 
+0

Это работает? – lhcgeneva

+0

Вы можете заменить свой первый двойной цикл на одну строку: 'BW = im> thr2;' – Tom

+0

Спасибо. но это меняет мой тип данных с двойного на логический – bahar

ответ

0

Вы можете попробовать regionprops вместо этого, чтобы извлечь все объекты на своем изображении. С помощью приведенного ниже кода вы получаете позиции всех объектов, которые меньше, чем порог, который вы можете манипулировать или делать то, что вам нужно сделать потом ... Сравнительно вы можете пройти через разные объекты и извлечь серый уровень, и если он ниже пороговое управление ими.

% Threshold for the size in pixels that you want 
    threshold = 100; 

    % read your image  
    rawimage = imread('yourimage.jpg'); 

    % create a 2D field by summing 
    im = sum(rawimage,3); 

    % label all objects that have 8 neighbours  
    IMAGE_labeled = bwlabel(im,8); 

    % get the properties of all elements 
    shapedata=regionprops (IMAGE_labeled,'all'); 

    % get those elements that are smaller in size (area) than the threshold 
    index = find(cell2mat({shapedata(:).Area})<=threshold); 

    % make a contourplot of im 
    figure 
    contourf(im) 
    hold on 

    % creation of colormap with the size of all identified objects below the thres 
    mycolormap = jet(size(index,2)); 

    % loop over all small objects, extraction of their position in the original file, plotting circles with different colors at the position of each small object 

    imap = 1; 
    mean_of_red = zeros(length(index),1); 
    for i = index 
     plot (shapedata(i).PixelList(:,1),shapedata(i).PixelList(:,2),'o','MarkerFaceColor',mycolormap(imap,:)) 
     mean_of_red(i) = mean(mean(im(shapedata(i).PixelList(:,1),shapedata(i).PixelList(:,1),1))); 
     imap=imap+1; 
    end 
+0

Я думаю, что есть ошибка в вашем 'index = ...', вероятно, это должно быть что-то вроде 'index = find ([formata.Area] gregswiss

+0

@gregswiss: right, thx, исправил его. У меня была более ранняя версия, которая должна возвращать только один объект ... – horseshoe

+0

@horseshoe: Большое вам спасибо. это было так полезно. просто, я не понимаю, что делает последний цикл точно? после обнаружения индексов я хочу удалить связанные компоненты, связанные с этими индексами, в rawimage. как я могу связать эти индексы с их связанными компонентами в rawimage? – bahar

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