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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:使用OpenCV返回图像中任意/牙齿形状的位置和大小相关的知识,希望对你有一定的参考价值。

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

Image processing

这是到目前为止我使用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过滤器后得到的结果:applied canny filter

这是最终结果:detected teeth

我不知道从这里去哪里。我想弄清楚所有牙齿。我该怎么办?

非常感谢您的帮助。

答案

请注意,牙齿结构或多或少是抛物线(上下颠倒)。如果您能以某种方式猜测定义这些斑点(齿)的质心的抛物线形状,那么您的问题就可以在一定程度上得到简化。我显示了一条穿过牙齿中心的红线。

enter image description here

我建议您按照以下方式进行处理:

  1. Binarize您的图像(背景= 0,否则为1)。
  2. 计算所有非零像素的质心。这是图像中的中心蓝色圆圈。将此称为structure_centroid
  3. structure_centroid的位置为中心,制作整个图像的极片。我已经展示了这种极片的卡通图像(三角形半透明)。覆盖整个360度。
  4. 为这些极片中的每​​一个确定非零像素的质心的位置。
  5. 包含这些质心的数组为您提供了牙齿平均位置的轨迹。将此称为centroid_path
  6. 在最接近centroid_path的圆上运行消除/选择算法。使用阈值距离降低异常值。

这应该使您的牙齿与圆圈很好地近似。

我希望这会有所帮助。

以上是关于Python:使用OpenCV返回图像中任意/牙齿形状的位置和大小的主要内容,如果未能解决你的问题,请参考以下文章

使用Python,OpenCV旋转图像任意角度(完整和局部丢失~)

使用Python,OpenCV进行图像平移转换

检测二维图像中的标记[Python/OpenCV]

opencv python将图像读取为RGB

Python OpenCV 实现图像滤波

OpenCV-Python系列八:提取图像轮廓