python - 在opencv numpy中找到轮廓的边界点

标签 python numpy opencv contour

enter image description here在这里完成 open cv 和 numpy 的菜鸟。这是图片:这是我的代码:

import numpy as np
import cv2

im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
imgray = cv2.medianBlur(imgray, ksize=7)

ret, thresh = cv2.threshold(imgray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
_, contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

print ("number of countours detected before filtering %d -> "%len(contours))
new = np.zeros(imgray.shape)

new = cv2.drawContours(im,contours,len(contours)-1,(0,0,255),18)

cv2.namedWindow('Display',cv2.WINDOW_NORMAL)
cv2.imshow('Display',new)
cv2.waitKey()

mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[contours[len(contours)-1]],0,255,-1)
pixelpoints = cv2.findNonZero(mask)
cv2.imwrite("masked_image.jpg",mask)

print(len(pixelpoints))
print("type of pixelpoints is %s" %type(pixelpoints))

像素点的长度接近 200 万,因为它包含了轮廓覆盖的所有点。但我只需要那个轮廓的边界点。我该怎么做?我尝试了 opencv 文档中的几种方法,但元组和排序操作总是出错。请...帮助?

我只需要轮廓的边界点:(

最佳答案

这就是轮廓边界点的意思吗?
(I used your image above to try)

您看到的白线是我在绘制的蓝色轮廓上用白色标出的点。右下角有一个小点,因为我认为它很可能是你的黑色背景不是真正的黑色,所以当我进行阈值处理和填充来得到这个时,
enter image description here

在同一个地方有一个白色的小 Blob 。但是,如果您尝试使用参数并进行更适当的阈值处理和填充,那应该不是问题。 在 openCV 的 drawContours 函数中,cnts 将包含轮廓列表,每个轮廓将包含一个点数组。每个点也是 numpy.ndarray 类型。如果您想将每个轮廓的所有点放在一个地方,以便它返回一组边界点(如上图中的白点轮廓),您可能希望将它们全部附加到一个列表中。你可以试试这个:

#rgb is brg instead
contoured=cv2.drawContours(black, cnts, -1, (255,0,0), 3)

#list of ALL points of ALL contours
all_pixels=[]

for i in range(0, len(cnts)):
    for j in range(0,len(cnts[i])):
        all_pixels.append(cnts[i][j])

当我尝试

print(len(all_pixels))

它返回了我 2139 积分。

如果您想出于可视化目的标记点(例如,像我的白点),请执行此操作:

#contouredC is a copy of the contoured image above
contouredC[x_val, y_val]=[255,255,255]

如果你想要更少的点,只需在迭代时使用阶梯函数将白色点画出来。像这样的东西:
enter image description here

在 python 中,for 循环很慢,所以我认为有更好的方法用 np.where() 函数或其他东西替换嵌套的 for 循环。如果/当我弄清楚时会更新这个。此外,这需要更好的阈值化和二值化技术。 Floodfill 技术引用自:Python 2.7: Area opening and closing binary image in Python not so accurate .

希望对您有所帮助。

关于python - 在opencv numpy中找到轮廓的边界点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49915894/

相关文章:

python - Numpy:如何模拟晶格中的传播

python - 如何使用 Python 获取当前周数?

python - pyMySQL 设置连接字符集

python - VSCode pytest 测试发现失败

python - 在 python 中加载图像进行处理的最快方法

android - 检测皮肤并捕捉图像

python - 如何设置 raw_input 的时间限制

python - 生成范围 (1, 2, 3...99; 1, 2, 3...99; ) 内的唯一数字序列,没有重复项

python - 如何为 python 版本 2 和 3 构建 OpenCV?

android - 在 android 上的 opencv 中创建 yuv mat