我是openCV(使用Python)和图像处理的新手,并试图启动我自己的项目来学习如何工作。我试图从张开嘴的图像中选择牙齿。我能想到的最好的解决方案是将它与牙齿模板相匹配,并尝试根据我从口腔图像中获得的轮廓来匹配形状。这可能不是最好的解决方案,但看起来确实很容易。
到目前为止,我的代码看起来像这样:
img = cv2.imread('resources/1.jpg', cv2.IMREAD_COLOR)
compare = cv2.imread('resources/template.jpg', cv2.IMREAD_GRAYSCALE)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 11, 17, 17)
edges = cv2.Canny(gray, 20, 10)
compare = cv2.Canny(compare, 200, 200)
contours, _ = cv2.findContours(gray.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
compare_contours, _2 = cv2.findContours(compare.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
for c2 in compare_contours:
ret = cv2.matchShapes(c, c2, 1, 0.0)
if ret < 0.5:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
cv2.drawContours(img, [approx], -1, (0, 255, 0), 7)
img是嘴巴的图像,比较是我用photoshop选择的相同图像的牙齿,所以我希望至少匹配那个。我目前的问题是匹配的唯一轮廓似乎是图像的框架。
有人可以指出我做错了什么或建议我更好的方法吗?图像大小是否与图像大小有关,如果是这样,调整图像大小的最佳方法是什么?
感谢您的时间!
答案 0 :(得分:2)
为了匹配场景中的物体并且遮挡很少,我建议尝试keypoints extraction then matching,例如SIFT(及其朋友ORB,SURF ......)
我尝试使用this SO answer和您的数据进行SURF模板匹配和可视化的超快速复制/粘贴代码,这很有希望:
它已经显示了4个合理的比赛! =)
你需要做一些深入研究才能掌握算法的基础知识,但基本理念仍然不变:
N
列表。这些值表示感兴趣点周围的图像统计(例如局部形状直方图,边缘信息......)M
维度中进行距离计算,在场景中查找类似模板的关键点:每个关键点都像是3D中的一个点,匹配2个关键点是相似的只是计算点的距离3D并说“足够接近”!。我针对您的数据尝试了您的代码,这是我通过可视化edges
和compare
得到的:
cv2.imshow("Edges",edges)
cv2.waitKey(0)
cv2.imshow("compare",compare)
cv2.waitKey(0)
正如您所看到的,edges
图片中存在大量不相关的短边。
这通常是参数选择过低的精确参数选择的副作用。
这可能会大大影响形状匹配,因为OpenCV会尝试匹配“edge for edge”,而开放边缘地图可能会给出compare
图像的不同结果。
请参阅此python recipe以查看阈值选择和自动阈值选择器的影响。在任何情况下都非常有用的阅读=)
让我们围绕您正在进行的约束进行思考,看看是否出现了识别牙齿的解决方案:
您正在查看包含多个感兴趣特征的图像(1口=数十颗牙齿),但正在尝试找到任何匹配项。没有“错误的答案”,没有狡猾的牙齿状物体可以辨别出来(与真正相关的SO question不同。)
牙齿:
您的图片: