2016-06-07 10 views
1

После 2 или 3 дней поиска я все еще не нашел решения моей проблемы.Сегментация MATLAB-mices в изображениях в оттенках серого, которая является инвариантной к теням

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

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

enter image description here

edit1: Спасибо за ответ, что хорошо работает, когда тень не трогать мышь. Это то, что я иначе:

segmented mouse

из этого исходного изображения:

original image

Я извлекая каждый кадр из TIF файла и код для каждого кадра. Это код, я использую:

for k=1:1000 

    %reads image 
    I = imread('souris3.tif',k); 

    %first stage: perform thesholding and fill holes 

    seg = I >20000; 
    seg = imfill(seg,'holes'); 

    %fixes the missing tail problem 
    %extract edges, and add them to the segmentation. 
    edges = edge(I); 
    seg = seg | edges; 

    %fill holes (again) 
    seg = imfill(seg,'holes'); 

    %find all the connected components 
    CC = bwconncomp(seg,8); 

    %keeps only the biggest CC 
    numPixels = cellfun(@numel,CC.PixelIdxList); 
    [biggest,idx] = max(numPixels); 
    seg = zeros(size(edges)); 
    seg(CC.PixelIdxList{idx}) = 1; 

    imshow(seg); 

end 

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

Это ссылка, если вы хотите иметь TIF файл:

souris3.tif

Спасибо за помощь.

ответ

7

я предлагаю следующий подход:

  1. выполнять пороговый на изображении, и получить маску, которая содержит большую часть тела мыши без его хвоста и ног.
  2. выполнить заполнение отверстий с помощью функции MFLAB imfill. На этом этапе сегментация почти идеальна, за исключением той части хвоста, которая отсутствует.
  3. используйте краевую карту, чтобы найти границы хвоста. Это можно сделать, добавив карту кромок в сегментирование и снова выполнить заливку отверстий. на этом этапе сохранить только самый большой подключенный компонент.

Код:

%reads image 
I = rgb2gray(imread('mSWm4.png')); 

%defines thersholds (you may want to tweak these thresholds, or find 
%a way to calculate it automatically). 
FIRST_STAGE_THRESHOLD = 70; 
IM_BOUNDARY_RELEVANCE_THRESHOLD = 10; 

%perform thesholding and fill holes, the tail is still missing 
seg = I > FIRST_STAGE_THRESHOLD; 
seg = imfill(seg,'holes'); 

%second stage fix the missing tail problem: 
%extract edges from relevant areas (in which the matter is not too dark), and add them to the segmentation. 
%the boundries of the image which are close enough to edges are also considered as edges 
edges = edge(I); 
imageBoundries = ones(size(I)); 
imageBoundries(2:end-1,2:end-1) = 0; 
relevantDistFromEdges = bwdist(edges) > IM_BOUNDARY_RELEVANCE_THRESHOLD; 
imageBoundries(bwdist(edges) > IM_BOUNDARY_RELEVANCE_THRESHOLD) = 0; 
seg = seg | (edges | imageBoundries); 

%fill holes (again) and perform noise cleaning 
seg = imfill(seg,'holes'); 
seg = getBiggestCC(imopen(seg,strel('disk',1))); 

getBiggestCC функции:

function [ res ] = getBiggestCC(mask) 
CC = bwconncomp(mask,8); 
numPixels = cellfun(@numel,CC.PixelIdxList); 
[~,idx] = max(numPixels); 
res = zeros(size(mask)); 
res(CC.PixelIdxList{idx}) = 1; 
end 

результаты

Результаты каждого этапа:

enter image description here

Результаты изображения 1 результатов:

enter image description here

изображения 2 результатов:

enter image description here

Другой вид (сегментация красным цветом):

enter image description here

+0

Спасибо! Он хорошо работает, когда тень не касается мыши. У меня нет только одного изображения, кроме отдельных, и иногда появляется тень. –

+0

Вы можете скачать файл tif по ссылке –

+0

Спасибо! Если я найду другие проблемы, я скоро приду к вам –