计算图像中圆形管道的数量

Posted

技术标签:

【中文标题】计算图像中圆形管道的数量【英文标题】:Counting the number of circular pipes in an image 【发布时间】:2021-10-26 14:54:00 【问题描述】:

我正在尝试构建一个程序来计算给定图像中的管道数量, https://drive.google.com/drive/folders/1iw2W7dUg3ICGRt3hxOynUJCf-KQj2Pka?usp=sharing 是一些示例测试图像。

我尝试过对 Canny's、Hough's 做同样的事情,但它们似乎都无法正确计算它们。我应该采用什么方法?

【问题讨论】:

请先分享您的一些代码和结果来展示您的努力。从示例图片来看,我认为是可以的,虽然不是一两行代码那么简单 【参考方案1】:

有几件事情需要考虑:

    最好用合适的方法找到管道的范围(搜索网络)。 在第二步中,使用 PerspectiveTransform,最好消除图像的旋转,只将管道的范围移动到下一步。 下一步,从现在开始,您可以使用以下算法。

这不是一个完整的算法,不适用于所有测试用例。你必须花时间。阅读并结合不同的图像处理方法,甚至可能是机器学习;更改参数以获得更好的结果。

另一点是尽量保持环境条件不变。

import sys
import cv2
import numpy as np

# Load image
im = cv2.imread(sys.path[0]+'/im.jpeg')
H, W = im.shape[:2]

# Make a copy from image
out = im.copy()

# Make a grayscale version
gry = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

# Make a clean black and white version of that picture
bw = cv2.adaptiveThreshold(
    gry, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 12)
bw = cv2.medianBlur(bw, 3)
bw = cv2.erode(bw, np.ones((5, 5)))
bw = cv2.medianBlur(bw, 9)
bw = cv2.dilate(bw, np.ones((5, 5)))

# Draw a rectangle around image to eliminate errors
cv2.rectangle(bw, (0, 0), (W, H), 0, thickness=17)

# Count number of pipes
cnts, _ = cv2.findContours(bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# Change channels of black/white image
bw = cv2.cvtColor(bw, cv2.COLOR_GRAY2BGR)

# Draw position of pipes
c = 0
for cnt in cnts:
    c += 1
    x, y, w, h = cv2.boundingRect(cnt)
    cv2.circle(out, (x+w//2, y+h//2), max(w, h)//2, (c, 220, 255-c), 2)
    if c >= 255:
        c = 0

# Count and print number of pipes
print(len(cnts))

# Save output images
cv2.imwrite(sys.path[0]+'/im_out.jpg', np.hstack((bw, out)))

【讨论】:

【参考方案2】:

虽然您可能会使用一些临时算法,但我认为您会花更多时间来调整它,而不仅仅是训练和调整模型:

管道似乎没有非常复杂的纹理,因此我将通过从图像中裁剪一些管道来创建一组合成图像,然后对其应用多个变换。例如,您可以在 python 中使用 imgaug (https://imgaug.readthedocs.io/en/latest/) 库。然后,您可以使用 HOG、Haar 特征、LBP 等来获取特征并使用树、线性 SVM 等训练模型 adaboost ......来自 DLib 的对象检测管道应该足够好并且易于使用。一般来说,检测部分需要一个带有滑动窗口的框架。

另一种选择是获取一堆背景以及对裁剪图像进行转换并创建多个带有边界框注释的图像,您可以使用这样的工具:https://github.com/tylerhutcherson/synthetic-images。

然后,您可以使用 YOLOv4、RetinaNet 或 Faster-RCNN 等深度学习模型。请注意,您可能需要更改输出层的步幅,因为对象可能太小。

总而言之,如果我是你,我会从 dlib 的对象检测开始,你应该不会花太长时间来准备好一切。

有一点,考虑到用于训练的特征类型,模型可能会检测到不是真正管道的圆圈,但如果您希望有很多管道,那应该很容易删除。

希望对你有帮助,祝你好运。

【讨论】:

以上是关于计算图像中圆形管道的数量的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB二值图像的处理程序设计 区域测量——面积、周长、圆形度、形状复杂度等的计算

计算图像中闭合轮廓的数量 - MATLAB

使用计算机视觉深入学习和创建现代OCR管道

计算图像中唯一颜色数量的算法

计算图像中白色背景上蓝调线的数量

在matlab中计算边缘像素的数量