我想使用 Matlab 2014a 自动测量一批100多张图像中的点对点距离。具体来说,这些图像是管段,我想测量内周和外周之间的距离(管壁厚度)从0到360°,给定的离散步骤获得轮廓图。此配置文件图的目的是查看配置文件是否保持不变或样本之间是否发生变化。
我尝试使用边缘函数(使用sobel,canny等...)来识别图像边框,但此功能还可识别由于管道划痕和显微镜捕获的污垢而导致的一些内边缘。 有谁知道如何识别内边界和外边界并执行点到点距离测量?
我想获得一个在x轴上具有0-2π标度的图,在y轴上获得内周和外周之间的距离。提前谢谢!
以下是link您可以下载的图片示例。
答案 0 :(得分:1)
我一直在看这个,但是我使用ImageMagick和OpenCV而不是Matlab,但是如果这是你的偏好,我相信你可以很容易地将想法转换成Matlab。
寻找圈子 - 好吧,Hough Transforms弄得一团糟,似乎在这个地方创造了一百万个圈子,所以我想这可能不是解决方案。然后我开始思考"去极化"图像并在它创建的直线空间中工作。使用像这样的简单ImageMagick -distort
命令很容易去极化:
convert tubo.tif -distort depolar 0 straight.jpg
这会给你一个像这样的图像:
接下来是将图像切割成与discretisation
对应的垂直条带。我没有看到任何实际数字的提及,所以我将图像划分为10个垂直条带,每个条纹是拉直图像的全高度和宽度的10%。我在ImageMagick中这样做了:
convert straight.jpg -crop 10%x100% out.jpg
给了我10张名为out-0.jpg
,out-1.jpg
... out-9.jpg
这是一个:
然后我调整了10个图像中每个图像的宽度,最小为50像素。我想我会真的调整到1像素宽,然后它会平均条带上的像素,并给我一个从背景到管道然后回到背景的转换点。但你不能在这里看到1像素宽的图像,所以我的宽度为50像素。
之后,我给它制作了动画,这样你就可以看到发生了什么。我是这样做的:
convert -delay 20 -loop 0 out* animated.gif
这给出了这个:
所以整个代码看起来像这样:
convert tubo.tif -distort depolar 0 straight.jpg
convert straight.jpg -crop 10%x100% out.jpg
for f in out* ; do
convert $f -resize 50x! $f
done
convert -delay 20 -loop 0 out* animated.gif
还有很多事情需要考虑......在哪里选择图像中心进行去极化,使用什么阈值,是否使用任何形态来缩小间隙造成的影响,是否任何对比度增强有助于或只是移动边缘。
我注意到的另一件事是原始图像的内部区域(在管道中间)的平均像素值为89,标准差为4.5(意味着它非常均匀),而实际的管道有一个平均值为120,标准偏差更高,为25,因此这可以为如何阈值提供一些见解 - 可能是纹理/同质性。
顺便说一句,ImageMagick和OpenCV很容易安装在带有homebrew
的OSX上。请参阅我的回答here。
答案 1 :(得分:1)
通过考虑局部方差或总变差,管明显可与其背景区分开。通过Matlab中的几行,您可以获得合理的二进制图像:
sx=filter2(ones(15)/15^2,im,'valid');
sx2=filter2(ones(15)/15^2,im.^2,'valid');
varMap=sx2-sx.^2;
bin = imopen(varMap>15,ones(7));
这显然不足以解决您的问题,因为您必须以某种方式检测边缘。我可以推荐以下两种方法之一: 1.假设一些合理的边缘模型,例如椭圆,找到二进制内/外边的候选,并使用线性回归或ransac为模型找到最佳参数。
答案 2 :(得分:0)
您可以使用imfindcircles
检测内圈和外圈。两个圆圈之间的区域可以作为初始分割。您可以将其用作更复杂的分段算法(例如active contours)的初始化,这可以为您提供更精确的边界。