算法名称:通过有向线卷积检测二维图像中的细长形状

信息处理 图像处理 计算机视觉 物体识别 霍夫变换 形态操作
2022-02-07 18:57:19

我通过将图像与具有该方向的线进行卷积并计算匹配像素的比率来检测阈值二值图像中具有大致已知方向的形状(通过使用霍夫线变换获得);这条线被扫过图像,命中率高于某个阈值(如 0.9)的线被认为完全属于对象。

动机不仅是要消除孔洞,还要消除整个对象的不连续性;图中显示了如何去除孔,其中灰线部分不匹配,红色部分匹配;蓝线来自霍夫变换:

扫线

这个程序是凭直觉发现的,我想知道它是否有名字,或者可能是基于类似想法的更复杂的算法。在这种情况下,我可以使用优化的实现而不是手写代码(我使用的是 python、OpenCV 和 scikit-image)。

1个回答

你本质上做的是一个匹配的过滤器但是,由于 Hough 变换,您的过滤器(线)是定向的,因此我将其称为定向匹配过滤器。要生成 Bresenham 线并对像素进行采样,您可能需要使用OpenCV 线迭代器简单的用法类似于:

cv::LineIterator it(image, pt1, pt2, 8);
std::vector<cv::Vec3b> buf(it.count);
std::vector<cv::Point> points(it.count);

for(int i = 0; i < it.count; i++, ++it)
{
    buf[i] = *(const cv::Vec3b)*it;
    points[i] = it.pos();
}

空洞检测部分也可以使用卷积实现,如下所示:

  1. 用由定向线组成的水平卷积核对图像进行卷积。使用filter2D
  2. 对结果进行阈值化以识别有孔的区域(使用阈值)。
  3. 执行 blob 过滤并选择所需的孔。

尽管我认为这种方法确实有效并且在许多情况下都可以正常工作,但典型的 blob-person 会以不同的方式处理问题:首先识别图像中的大连接组件,然后过滤掉其余部分。在该单个大组件中,执行形态孔填充。这是一个非常标准的管道,使用这种方法,您将能够找到更多工具(blob 分析)来帮助您。例如,findContours、drawContoursmorphologyEx等OpenCV 方法就派上用场了。

最后,如果您知道孔的形状,您可能会受益于例如椭圆检测以直接找到它。

希望这些帮助。