首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IF图像中细胞膜的识别

IF图像中细胞膜的识别
EN

Stack Overflow用户
提问于 2015-04-08 18:43:51
回答 2查看 188关注 0票数 2

我正在与一个非常困难的问题作斗争。

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

我不能使用阈值,因为我必须包含膜内的所有像素(阈值会创建孔,因为膜内的一些像素与膜外的其他像素具有相同的值)。

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

我试过另一种方法。

我已经使用marching square确定了外部路径。对于行军方块的每两个点,我已经找到了一段法向线,由这两个点定义的段。我已经分析了沿着这些“正常”段的轮廓,对于每个轮廓,我选择了包含膜的两个点(如图C所示)。结果不是很好,因为我不能覆盖所有的膜,并且很难分析剖面来确定膜的开始和结束位置。这是我得到的:

有没有人能提出一个算法或想法来解决这个问题?

其他相似的图片:

EN

回答 2

Stack Overflow用户

发布于 2015-04-08 19:43:22

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

  1. 使用flood fill的变体找到外边界上相邻的两个点的外边界
  2. ,确定法线并行进,直到值停止上升,然后直到值停止下降。

票数 1
EN

Stack Overflow用户

发布于 2015-04-08 19:37:18

像这样的东西可以工作吗?这绝对不是一个答案,但我不能把所有的东西都作为评论发布出来。

这段代码是用C++编写的,要运行它,你需要安装OpenCV,如果你有visual studio,可以通过NuGet来完成。

下面的代码是我从here得到的。

代码语言:javascript
运行
复制
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;
}

考虑到以下几点:

收益率

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29512484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档