Обработка изображений (подсчет ячеек и анализ свойств) с использованием MATLAB с ярким наложением «сетка»

#matlab #image-processing

#matlab #обработка изображений

Вопрос:

Я нахожусь на ранних стадиях проекта, который пытается проанализировать изображения ячеек с точки зрения размера ячейки (красиво и просто) и морфологии (потенциально менее легко, пытаясь найти «некруглые» ячейки, с которыми, как я подозреваю, могут столкнуться imfindcircles). В рамках этого мне нужно обрабатывать изображения в пакетном режиме, поскольку их слишком много для подсчета вручную, и именно здесь MATLAB вступает в игру. testimage.bmp — пример изображения, на которое я смотрю: Изображение ячейки

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

 clearvars; close all;
im = imread('testimage.bmp');
imshow(im);
rmin = 6;
rmax = 11;
sensitivity = 0.95;
[brightcenter,brightradii] = imfindcircles(im, [rmin rmax], 'ObjectPolarity', 'bright', 'Sensitivity',sensitivity,'Method','TwoStage');
[darkcenter,darkradii] = imfindcircles(im, [rmin rmax], 'ObjectPolarity', 'dark', 'Sensitivity',sensitivity,'Method','TwoStage');
figure(2)
imshow(im)
viscircles(brightcenter, brightradii, 'Color', 'b');
viscircles(darkcenter,darkradii);
nbright = length(brightcenter);
ndark = length(darkcenter);
  

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

Как вы можете видеть, он обнаруживает много кругов на сетке. К сожалению, уменьшение чувствительности приводит к тому, что ячейки не будут найдены до устранения ложных срабатываний. Однако я попытался повозиться с пороговым значением и сначала превратить его в черно-белое изображение, поскольку некоторые ячейки светлые, а некоторые темные, что, опять же, означает, что пороговые уровни достаточно широки, чтобы сетка все еще была там, и я оказался в той же ситуации, что и раньше. Интуитивно изображение выглядит очень четким, поэтому я полагаю, что мне не хватает очень очевидной функции, и вполне возможно, что это не imfindcircles(), который я использовал до сих пор для поиска ячеек на изображении и сохранения их свойств.

Если у кого-нибудь есть какие-либо данные о том, как точно подсчитать ячейки, это было бы оценено! Следующий бит после их обнаружения (с учетом радиусов и морфологии) Я предполагаю, что это будет достаточно просто, поскольку я понимаю, что в MATLAB есть инструменты анализа, которые позволяют мне определять радиусы, округлость и т. Д.

Спасибо, как всегда 🙂

Комментарии:

1. Вы пробовали использовать EdgeThreshold свойство imfindcircles ? Все ваши ячейки показывают относительно хороший градиент по краям окружностей, хотя кажется, что ложных срабатываний нет…

Ответ №1:

Перед использованием необходимо удалить строки imfindcircles .

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

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

 im = double(imread('wbyai.png'));
a = kron(1:15, [1 1]);
sob_filter = [a fliplr(a); zeros(1,60); -a fliplr(-a)];
im_hor = imfilter(im, sob_filter );
im_ver = imfilter(im, sob_filter');

im2 = im;
im2(find(abs(im_hor) > 4000)) = round(mean(im(:)));   % give a value that similar to background
im2(find(abs(im_ver) > 4000)) = round(mean(im(:)));
figure; subplot(121); imshow(im, []); subplot(122); imshow(im2, []);
  

введите описание изображения здесь