2015-04-08 2 views
2

Я борюсь с очень сложной проблемой.Идентификация клеточной мембраны в изображении IF

У меня есть некоторые изображения (изображения иммунофуоресценции), которые представляют собой некоторые белки, и мне нужно идентифицировать «внешнюю» мембрану этих белков. Проблема показана на изображениях ниже. Наружная мембрана представлена ​​красная дорожка в изображении B, и я должен идентифицировать его (внешняя мембрана не является однородной, но оно имеет различную толщину вдоль пути)

enter image description here

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

Я попытался использовать алгоритм Canny и множество алгоритмов обнаружения границ, но результаты неприемлемы; они не могут идентифицировать мембрану, даже если я пробую небольшую часть.

Я пробовал другой путь.

Я определил внешний путь, используя марш-квадрат. Для каждой двух точек марширующего квадрата я нахожу отрезок, нормальный два сегмента, определяемого этими двумя точками. Я проанализировал профиль вдоль этих «нормальных» сегментов, и для каждого профиля я выбрал две точки, содержащие мембрану (как на рисунке C). Результат не является хорошим, потому что я не могу покрыть всю мембрану, и нелегко аннулировать профиль, чтобы решить, где начинается и заканчивается мембрана. Это то, что я получаю: enter image description here Может ли кто-нибудь предложить алгоритм или какую-то идею решить эту проблему?

Другие подобные изображения: enter image description here enter image description here enter image description here

+0

Вы всегда цветное изображение (мембрана) на черном фоне? – npinti

+0

Нет, к сожалению, фон не черный, а темно-зеленый, и он не является однородным. – Martina

+0

Вы заглянули в OpenCV? Он предоставляет [реализацию] (http://opencvexamples.blogspot.com/2013/10/void-canny-inputarray-image-outputarray.html#.VSUIzfmUdHM) алгоритма Canny. Может быть, вы можете попробовать и обострить изображение перед обработкой? – npinti

ответ

0

Would что-то нравится эта работа? Это отнюдь не ответ, но я не могу публиковать все как комментарий.

Этот код находится на C++, и для его запуска вам потребуется установить OpenCV, который, если у вас есть визуальная студия, может быть выполнен через NuGet.

Код, полученный мной от here.

int main() 
{ 
    Mat image; 
    image = imread("path to image", 1); 
    Mat original = image.clone(); 
    //Sharpen the image. This should ease edge detection. The the higher the second value, the sharper the image will be. 
    cv::addWeighted(image, 20.0, image, -0.5, 0, image); 
    //Blur the image slightly. This should handle internal edges. The higher the last value will be, the more blurred the image will be. 
    cv::GaussianBlur(image, image, cv::Size(0, 0), 2); 
    namedWindow("Display window", CV_WINDOW_AUTOSIZE); 

    Mat gray; 
    cvtColor(image, gray, CV_BGR2GRAY); 
    Canny(gray, gray, 100, 200, 3); 
    /// Find contours 
    vector<vector<Point> > contours; 
    vector<Vec4i> hierarchy; 
    RNG rng(12345); 
    findContours(gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
    /// Draw contours 
    Mat drawing = Mat::zeros(gray.size(), CV_8UC3); 
    Scalar color = Scalar(0, 0, 255); 
    for (int i = 0; i< contours.size(); i++) 
    {  
     drawContours(original, contours, i, color, 2, 2, hierarchy, 0, Point()); 
    } 

    imshow("Result window", original); 
    waitKey(0); 
    return 0; 
} 

Учитывая ниже:

Source Image

Урожайность

Resultant Image

+0

Результат кажется хорошим, но у меня возникли трудности с написанием этого кода на языке C#, чтобы проверить его на других изображениях. Я использую emgu. – Martina

+0

@Martina: Можете ли вы сказать, какие ошибки вы испытываете? Этот код можно было бы расширить, чтобы опробовать ряд файлов в определенной папке и сохранить их где-нибудь, если это поможет. – npinti

+0

Я не могу перевести функцию cv :: GaussianBlur (изображение, изображение, cv :: Размер (0, 0), 2); в C#. Я использую GpuInvoke.GaussianBlur (...), но я не уверен в использовании параметра. Я совершенно не знаком с OpenCv и Emgu. – Martina

1

Для примера изображения, Gimp-нечеткие выбирать инструменты, кажется, найти вне белка достаточно хорошо (см. ниже - но, возможно, это так, потому что оно уже уменьшено? Можете ли вы отправить образцы оригинального изображения?).Так что я хотел бы попробовать что-то вроде следующего

  1. Используйте вариацию flood fill найти внешнюю границу
  2. Для двух точек рядом друг с другом на внешней границе, определить нормальные и маршировать, пока значения не перестанут идти затем до тех пор, пока значения не прекратятся.

Gimp Fuzzy Select

+0

Привет, Стефан, я не могу размещать изображения, потому что у меня репутация до 10 лет. Я пробовал Gimp с оригинальное изображение, но результат не тот, который я ожидаю. Кроме того, фон моего изображения не черный, и он не является однородным. Если я использую что-то вроде алгоритма заливки заливки, мне тоже нужно использовать порог. Пока я только нахожу внешнюю границу с маршевой квадратурой, но она очень неточна и в некоторых точках включает фон. Спасибо – Martina

+0

Было бы хорошо немного уменьшить изображение, избавившись от некоторого шума? Может быть, поэтому нечеткий выбор работал нормально? Постскриптум Ваша репутация, кажется, выше 10 сейчас :) –

+0

Я сделал это, но инструмент нашел внешнюю границу и что-то внутри ... Я разместил некоторые другие изображения! – Martina

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