我有一个像讲话泡泡的形状 . 我只想检测这个形状的椭圆,就像绿色环绕的图像一样 .
我尝试了封闭的形态,但也消除了气泡的某些部分 . 我使用了一个矩阵为20,20的内核 . 形状变得更加矩形 . 也许我必须更改内核矩阵更像这样:
0 1 0
1 1 1
0 1 0
我也试图绘制一个凸包,但它也没有效果 . 并且内部凸壳是不可能的 . 这是我绘制凸包的代码:
for i in range (max_index):
hull = cv2.convexHull(contours[i])
cv2.drawContours(image, [hull], 0, (0, 255, 0), 2)
我使用参数 cv2.RETR_EXTERNAL
和 cv2.CHAIN_APPROX_NONE
检索了轮廓
1 回答
这是我能得到的最好的:
这不是最聪明的方法 . 尽管代码冗长,但我在这里做的事实上很简单 .
首先,我得到灰色图像并添加大量模糊,并以您尝试的相同方式,应用阈值并查找轮廓 . 然后我拿出最大的轮廓,找到适合这个轮廓的椭圆
fitEllipse
. 这都是getEllipse
函数 .在第一轮中,椭圆将会歪斜,因为尾部会挡住 . 所以,我使用这个不太好的椭圆来处理原始图像并再试一次 .
函数grayEllipse按椭圆过滤图像 . 因此,我使用第一次尝试的椭圆来处理原始图像并突出显示第一个椭圆内的点 . 我在第二轮中使用此图像作为输入 .
通过重复这个过程,我第二次得到的最后一个椭圆就不那么歪斜了 .
这是代码: