繁体   English   中英

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

[英]Python: Return position and size of arbitrary/teeth shapes in image using OpenCV

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

图像处理

这是我到目前为止使用 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()

这是我应用精明过滤器后得到的: 应用精明过滤器

这是最终结果: 检测到的牙齿

我不知道 go 从这里到哪里。 我想把所有的牙齿都鉴定出来。 我怎样才能做到这一点?

我真的很感激任何帮助..

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

在此处输入图像描述

我建议您按以下方式处理它:

  1. 二值化图像(背景=0,否则为 1)。 您可以使用sklearn.preprocessing.binarize
  2. 计算所有非零像素的质心。 这是图像中的中心蓝色圆圈。 调用这个structure_centroid 看到这个: 如何在二维 numpy 数组中居中非零值? .
  3. 制作整个图像的极坐标切片,以structure_centroid的位置为中心。 我已经展示了这种极片的卡通图像(三角形半透明)。 覆盖完整的 360 度。 请参阅: polarTransform
  4. 确定每个极片的非零像素质心的 position。 见这些:
  5. 包含这些质心的数组为您提供牙齿平均位置的轨迹(路径)。 调用这个centroid_path
  6. 在您能够检测到的最接近centroid_path的圆圈上运行消除/选择算法。 使用阈值距离删除异常值。

这应该给你一个很好的与圆圈的牙齿近似值。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM