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

我不能使用阈值,因为我必须包含膜内的所有像素(阈值会创建孔,因为膜内的一些像素与膜外的其他像素具有相同的值)。
我曾尝试使用Canny算法和许多边缘检测算法,但结果都不能接受;即使我尝试了一小部分,它们也无法识别薄膜。
我试过另一种方法。
我已经使用marching square确定了外部路径。对于行军方块的每两个点,我已经找到了一段法向线,由这两个点定义的段。我已经分析了沿着这些“正常”段的轮廓,对于每个轮廓,我选择了包含膜的两个点(如图C所示)。结果不是很好,因为我不能覆盖所有的膜,并且很难分析剖面来确定膜的开始和结束位置。这是我得到的:

有没有人能提出一个算法或想法来解决这个问题?
其他相似的图片:



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

发布于 2015-04-08 19:37:18
像这样的东西可以工作吗?这绝对不是一个答案,但我不能把所有的东西都作为评论发布出来。
这段代码是用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;
}考虑到以下几点:

收益率

https://stackoverflow.com/questions/29512484
复制相似问题