我目前正在研究一种使用定量图像分析来查找塑料细丝直径的测量系统。下面是原始图像和处理后的二进制图像,使用 DipLib(PyDIP 变体)来执行此操作。
问题
好吧,在我个人看来,这看起来很棒。下一个问题是我正在尝试计算二进制图像中灯丝的顶部边缘和底部边缘之间的距离。使用 OpenCV 非常简单,但是由于 DipLib 的 PyDIP 变体功能有限,我遇到了很多麻烦。
潜在解决方案
从逻辑上讲,我认为我可以只扫描像素列并查找像素从 0 变为 255 的第一行,反之亦然。然后我可以取这些值,以某种方式创建一条最佳拟合线,然后计算它们之间的距离。不幸的是,我正在努力解决这个问题的第一部分。我希望有经验的人可以帮助我。
背景故事
我正在使用 DipLib,因为 OpenCV 非常适合检测,但不适用于量化。我在这里看到了其他示例,例如使用测量功能从类似设置中获取直径的示例。
我的代码:
import diplib as dip
import math
import cv2
# import image as opencv object
img = cv2.imread('img.jpg')
# convert the image to grayscale using opencv (1D tensor)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# convert image to diplib object
dip_img = dip.Image(img_gray)
# set pixel size
dip_img.SetPixelSize(dip.PixelSize(dip.PixelSize(0.042*dip.Units("mm"))))
# threshold the image
dip_img = dip.Gauss(dip_img)
dip_img = ~dip.Threshold(dip_img)[0]
给 Cris Luengo 的问题
首先,在这一行:
# binarize
mask = dip.Threshold(edges)[0] '
你怎么知道输出图像包含在索引 [0] 中,因为关于 PyDIP 的文档很少,我想知道如果我自己做的话,我可能会在哪里发现这一点。我可能只是没有找对地方。我意识到我这样做是在我的原始帖子中,但我肯定只是在一些示例代码中发现了这一点。
在这些行中的第二个:
normal1 = np.array(msr[1]['GreyMajorAxes'])[0:2] # first axis is perpendicular to edge
normal2 = np.array(msr[2]['GreyMajorAxes'])[0:2]
据我了解,您正在找到两条线的主轴,它们只是特征向量。我在这里的经验非常有限——我是一名本科工程专业的学生,所以我从抽象的意义上理解特征向量,但我仍在学习它们的用途。我不太明白的是,这条线msr[1]['GreyMajorAxes'])[0:2]
只返回两个值,这只会定义一个点。如果它只是一个点,这如何定义与检测到的线垂直的线?第一个点引用为(0,0)还是图像的中心或其他什么?此外,如果您有任何相关资源可以阅读有关在图像处理中使用特征值的信息,我很想再深入一点。谢谢!
第三
正如您设置的那样,如果我理解正确,mask[0]
包含顶线并mask[1]
包含底线。因此,如果我想考虑灯丝的弯曲,我可以采用这两个矩阵并为每个正确的得到最佳拟合线?目前我只是稍微减少了我的捕获区域,主要是不需要担心任何弯曲,但这不是一个完美的解决方案 - 特别是如果灯丝下垂很多并且弯曲是不可避免的。让我知道你的想法,再次感谢你的时间。