Python:使用OpenCV返回图像中任意/齿形的位置和大小

Python:使用OpenCV返回图像中任意/齿形的位置和大小,python,opencv,image-processing,object-detection,scikit-image,Python,Opencv,Image Processing,Object Detection,Scikit Image,我对图像处理和目标检测非常陌生。我想提取/识别下图中牙齿的位置和尺寸: 以下是我迄今为止使用OpenCV所做的尝试: import cv2 import numpy as np planets = cv2.imread('model.png', 0) canny = cv2.Canny(planets, 70, 150) circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,40, param1=10,param2=16,minRadiu

我对图像处理和目标检测非常陌生。我想提取/识别下图中牙齿的位置和尺寸:

以下是我迄今为止使用OpenCV所做的尝试:

import cv2
import numpy as np

planets = cv2.imread('model.png', 0)
canny = cv2.Canny(planets, 70, 150)
circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,40, param1=10,param2=16,minRadius=10,maxRadius=80)

circles = np.uint16(np.around(circles))

for i in circles[0,:]:
   # draw the outer circle
   cv2.circle(planets,(i[0],i[1]),i[2],(255,0,0),2)

   # draw the center of the circle
   cv2.circle(planets,(i[0],i[1]),2,(255,0,0),3)

cv2.imshow("HoughCirlces", planets)
cv2.waitKey()
cv2.destroyAllWindows()
这是我应用canny过滤器后得到的结果:

这是最终结果:

我不知道从这里到哪里去。我想确认一下所有的牙齿。我该怎么做


非常感谢您的帮助。

请注意,牙齿结构或多或少是一条抛物线(倒置)。如果你能猜出那些斑点(牙齿)的质心的抛物线形状,那么你的问题可以简化到一个合理的程度。我已经显示了一条穿过牙齿中心的红线

我建议您采取以下方法:

  • 对图像进行二值化(背景=0,否则为1)。你可以用
  • 计算所有非零像素的质心。这是图像中的中心蓝色圆圈。称之为
    结构\u质心
    。请参见:
  • 对整个图像进行极轴切片,以
    结构\u质心位置为中心。我已经展示了这样的极片(三角形半透明)的卡通图像。覆盖整个360度。请参见:
    
  • 确定每个极性切片的非零像素的质心位置。请看这些:
  • 包含这些质心的数组提供了牙齿平均位置的轨迹(路径)。称之为
    质心路径
  • 在能够检测到的最接近
    质心路径的圆上运行消除/选择算法。使用阈值距离删除异常值
    这会给你们一个很好的圆齿近似值


    我希望这能有所帮助。

    能给我一个代码示例吗?我还是个新手。。谢谢你,这些是步骤,这就是我能给你的。但是我为您制定的步骤,您可以对每一个步骤进行操作,并且应该能够找到有关stackoverflow的现有解决方案(最有可能)。但这样的解决方案可能需要几个小时。所以,祝你一切顺利。您可能还想考虑使用<代码> SkVase<代码>,以防您是新的<代码> OpenCV。您会发现另一个有用的库是
    sklearn
    (可能:取决于用例)。@SolidSnake Ok。我添加了更多的链接,为您指出每个步骤可能存在的解决方案。但坦率地说,这可能是一个不错的项目,可能需要时间。在我看来,这超出了我的回答范围。最好。@ SolidSnake。如果你认为这个想法/答案有帮助,请考虑<代码>投票表决< /代码>和/或<代码>接受< /代码>。谢谢你。我试着听从你的建议,但不幸的是我一事无成。没有明显的答案,因为牙齿的形状不一致。此外,当我将图像转换为二进制/阈值或使用其他技术(如canny或edging)时,大多数情况下形状都是不完整的,因此它们看起来不像完整的圆形/水滴形状。我曾尝试使用轮廓和凸出来检测这些形状,但它们总是返回不完整的结果。我想知道有没有办法检测这些不完整的形状?