如何在Matlab中测量这些黑色区域
上面的图像已经过处理,以去除背景并增加与如何在Matlab中测量这些黑色区域,matlab,image-processing,Matlab,Image Processing,上面的图像已经过处理,以去除背景并增加与im2bw的对比度。现在我想识别并测量图像顶部和底部中心的两个拉长的黑色区域。结果是: 如果我使用imfill(I,'holes'),其中一个不会被识别 我还想确定边界,以便我可以测量这些区域的面积并找到它们各自的“加权质心” 我想要实现的是允许我测量不同帧中拉长的黑色区域的方向之间的角度,如下图所示(红线表示前一帧中顶部黑色区域的位置) 在这个答案中,我将使用一个MATLAB图像分析工具箱(披露:我是作者)。但是,应用的过滤器非常简单,使用其他工具箱
im2bw
的对比度。现在我想识别并测量图像顶部和底部中心的两个拉长的黑色区域。结果是:
如果我使用imfill(I,'holes')
,其中一个不会被识别
我还想确定边界,以便我可以测量这些区域的面积并找到它们各自的“加权质心”
我想要实现的是允许我测量不同帧中拉长的黑色区域的方向之间的角度,如下图所示(红线表示前一帧中顶部黑色区域的位置)
在这个答案中,我将使用一个MATLAB图像分析工具箱(披露:我是作者)。但是,应用的过滤器非常简单,使用其他工具箱实现它应该没有问题 原始图像非常嘈杂。简单地对该图像进行阈值化会产生非常难以处理的带噪二值图像。我建议您先过滤原始图像以突出显示感兴趣的结构,然后再进行阈值设置和测量 因为我们对检测直线感兴趣,所以我们将使用拉普拉斯高斯滤波器。重要的是调整sigma参数以匹配待检测线的宽度。应用拉普拉斯过滤器后,深色线条将显示为亮,而亮线条将显示为暗。图像中间的亮点也会增强,但会出现黑暗。
img=readim('https://i.stack.imgur.com/0LzF3m.png');
img=img{1};%PNG文件的所有三个通道都相同,取一个
out=拉普拉斯(img,10);
这张图像直接进入阈值
out=out>0.25;
最后,我们将测量这两条线的方向,即投影最大的角度
msr=measure(out,[],'feret');
角度=msr.Feret(:,4)
输出(角度以弧度表示,0向右,pi/2向下):
角度=
-1.7575
-1.7714
在这个答案中,我将使用一个MATLAB图像分析工具箱(披露:我是作者)。但是,应用的过滤器非常简单,使用其他工具箱实现它应该没有问题
原始图像非常嘈杂。简单地对该图像进行阈值化会产生非常难以处理的带噪二值图像。我建议您先过滤原始图像以突出显示感兴趣的结构,然后再进行阈值设置和测量
因为我们对检测直线感兴趣,所以我们将使用拉普拉斯高斯滤波器。重要的是调整sigma参数以匹配待检测线的宽度。应用拉普拉斯过滤器后,深色线条将显示为亮,而亮线条将显示为暗。图像中间的亮点也会增强,但会出现黑暗。
img=readim('https://i.stack.imgur.com/0LzF3m.png');
img=img{1};%PNG文件的所有三个通道都相同,取一个
out=拉普拉斯(img,10);
这张图像直接进入阈值
out=out>0.25;
最后,我们将测量这两条线的方向,即投影最大的角度
msr=measure(out,[],'feret');
角度=msr.Feret(:,4)
输出(角度以弧度表示,0向右,pi/2向下):
角度=
-1.7575
-1.7714
您应该发布原始图像。与原始图像相比,您在顶部发布的阈值图像丢失了很多信息,并且可以在原始图像上更轻松地进行此分析。@CrisLuengo我已将其添加到顶部,感谢您指出这一点!你应该发布原始图像。与原始图像相比,您在顶部发布的阈值图像丢失了很多信息,并且可以在原始图像上更轻松地进行此分析。@CrisLuengo我已将其添加到顶部,感谢您指出这一点!谢谢你。如何修改代码以允许输入图像来自视频帧,例如:obj=VideoReader('video1.avi');视频=对象读取();img=视频(:,:,:,1)
另外,4在msr.Feret
中代表什么?@usumdelphini:你可以做img=video(:,:,1,1)代码>如果它来自灰度照相机。如果是颜色,可以简单地选择噪声最小的通道,或者将3个通道平均起来。DIPimage中的laplace
函数可以将标准数组作为输入。Feret测量功能可为每个对象返回5个值。第四个值是获得最大投影的角度。如果你感兴趣的话,我会解释使用的算法。去除整个视频的背景可以去除部分噪声。这可以很容易地在imagej中完成,然后我可以将结果输入到matlab中进行处理,正如您在这里建议的那样。如果有一个可以在matlab中完成整个过程的程序就好了。有什么建议吗?谢谢你。如何修改代码以允许输入图像来自视频帧,例如:obj=VideoReader('video1.avi');视频=对象读取();img=视频(:,:,:,1)
另外,4在msr.Feret
中代表什么?@usumdelphini:你可以做img=video(:,:,1,1)代码>如果它来自灰度照相机。如果是颜色,可以简单地选择噪声最小的通道,或者将3个通道平均起来。DIPimage中的laplace
函数可以将标准数组作为输入。Feret测量功能可为每个对象返回5个值。第四个值是获得最大投影的角度。如果你感兴趣的话,我会解释使用的算法。去除整个视频的背景可以去除部分噪声。