我正在尝试仅从裁剪的口腔图像中提取牙齿部分,但阈值和遮罩方式遗漏了一些牙齿,如提取的牙齿图像所示
我使用python获取阈值图像,然后根据阈值图像查找轮廓并提取检测到的轮廓, 根据该守则:
labels = measure.label(threshold, connectivity=2, background=0)
mask = np.zeros(threshold.shape, dtype="uint8")
for label in np.unique(labels):
if label == 0:
continue
labelMask = np.zeros(threshold.shape, dtype="uint8")
labelMask[labels == label] = 255
numPixels = cv2.countNonZero(labelMask)
if numPixels > 600:
mask = cv2.add(mask, labelMask)
cv2.imshow("mask", mask)
_, contours, _ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(equa, contours, -1, (0, 0, 255), 2)
cv2.imshow("thre",equa)
img_contours= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2]
img_contours = sorted(img_contours, key=cv2.contourArea)
for i in img_contours:
if cv2.contourArea(i) > 1000:
break
mask = np.zeros(mask.shape[:2], np.uint8)
cv2.drawContours(mask, [i],-1, 255, -1)
new_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("Image with background removed", new_img)
那么,究竟有没有办法拔牙并获得所有牙齿,或者填补拔牙之间的空隙呢
依我看,你这个问题的答案基本上是否定的
二值图像的信息含量较低,牙齿缺失与牙齿周围和牙齿之间的正常间距之间没有差异
由于没有牙齿形状的先验信息,任何低级视觉操作(过滤器)都无法提供帮助。通过映射具有牙齿布局的几何模型,您可能会得到一些改进,但这不会反映手头的特定解剖结构,并且很难实现
在二值化之前,您一定要解决这个问题
我建议使用不同的方法: 转换到HSV颜色空间并仅使用色调通道,然后执行一些阈值和变形以获得遮罩
在阈值化之前,可能需要模糊
h
通道对于h通道上的阈值设置,我建议您使用GUI进行一些交互式调整
您可以使用
thh_blur
作为掩码,看看它是否对您有好处,或者使用一些e变形:最后使用
morphed_th
作为掩码:我得到了下面的图像
我不知道它是否对你有好处,因为它在较暗的角落漏掉了侧牙,但你可以从
s
通道中提取它们并添加到面具中如果您想消除ET(较暗区域)之间的间隙,您可以遵循或多或少相同的逻辑,从
res
开始作为输入图像,播放通道、阈值等添加左侧需要使用参数。
这是代码。对另一侧执行同样的操作
这就是我得到的
为了更好地理解我为什么这样做,请绘制每个步骤。也许这可以让您找到更好的解决方案。
相关问题 更多 >
编程相关推荐