我正在努力解决一个非常棘手的问题。
我有一些图像(免疫荧光图像)代表了一些蛋白质,我需要识别外部的#34;这些蛋白质的膜。 问题显示在下面的图像中。 外膜由图像B中的红色路径表示,我必须识别它(外膜不均匀,但沿路径有不同的厚度)
我不能使用阈值,因为我要在膜内包含所有像素(阈值会产生孔,因为膜内部的某些像素具有膜外其他像素的相同值)。
我尝试使用Canny的算法和许多边缘检测算法,但结果是不可接受的;即使我尝试了一小部分,它们也无法识别膜。
我尝试过另一种方式。
我已经使用行进方格确定了外部路径。 对于行进方块的每两个点,我发现一个段正常,这两个点由这两个点定义。 我已经按照这些"正常"分析了这个配置文件。对于每个轮廓,我选择了两个包含膜的点(如图C所示)。 结果并不好,因为我无法覆盖所有的膜,并且不容易分析轮廓以确定膜的开始和结束位置。 这是我获得的: 任何人都可以建议一个算法或一些想法来解决这个问题吗?
其他类似图片:
答案 0 :(得分:1)
对于你的示例图像,Gimp的模糊选择工具似乎很好地找到了蛋白质的外部(见下文 - 但可能就是这种情况,因为它已经缩小了吗?你能发布原始图像样本吗?)。所以我会尝试类似下面的内容
答案 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;
}
鉴于以下内容:
产量