在IF图像中鉴定细胞膜

时间:2015-04-08 10:43:51

标签: algorithm image-processing bitmap

我正在努力解决一个非常棘手的问题。

我有一些图像(免疫荧光图像)代表了一些蛋白质,我需要识别外部的#34;这些蛋白质的膜。 问题显示在下面的图像中。 外膜由图像B中的红色路径表示,我必须识别它(外膜不均匀,但沿路径有不同的厚度)

enter image description here

我不能使用阈值,因为我要在膜内包含所有像素(阈值会产生孔,因为膜内部的某些像素具有膜外其他像素的相同值)。

我尝试使用Canny的算法和许多边缘检测算法,但结果是不可接受的;即使我尝试了一小部分,它们也无法识别膜。

我尝试过另一种方式。

我已经使用行进方格确定了外部路径。 对于行进方块的每两个点,我发现一个段正常,这两个点由这两个点定义。 我已经按照这些"正常"分析了这个配置文件。对于每个轮廓,我选择了两个包含膜的点(如图C所示)。 结果并不好,因为我无法覆盖所有的膜,并且不容易分析轮廓以确定膜的开始和结束位置。 这是我获得的: enter image description here 任何人都可以建议一个算法或一些想法来解决这个问题吗?

其他类似图片: enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

对于你的示例图像,Gimp的模糊选择工具似乎很好地找到了蛋白质的外部(见下文 - 但可能就是这种情况,因为它已经缩小了吗?你能发布原始图像样本吗?)。所以我会尝试类似下面的内容

  1. 使用flood fill的变体来查找外边框
  2. 对于外边框上彼此相邻的两个点,确定法线并进行游行直到值停止上升,然后直到值停止下降。
  3. Gimp Fuzzy Select

答案 1 :(得分:0)

这样的事情会起作用吗?这绝不是一个答案,但我不能将所有内容都作为评论发布。

此代码使用C ++,要运行它,您需要安装OpenCV,如果您有visual studio,可以通过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