gpt4 book ai didi

python - 需要使用 Contour 检测图像的第二个极值点

转载 作者:行者123 更新时间:2023-12-02 16:26:37 25 4
gpt4 key购买 nike

我正在尝试使用 Contour 检测图像的第二个极值点。

我正在尝试像下面那样做。

  • 我正在寻找图像的所有轮廓。
  • 对等高线 NumPy 数组排序
  • 删除 Numpy 数组中的最后一个元素以去除外部轮廓,以免在极值点检测中考虑。
  • 选择极值点

  • 下面是代码:
    import imutils
    import cv2
    import numpy as np

    image = cv2.imread(r"SimpleBoxTest.png")
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (5, 5), 0)

    thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1]
    thresh = cv2.erode(thresh, None, iterations=2)
    thresh = cv2.dilate(thresh, None, iterations=2)

    cnts = cv2.findContours(thresh.copy(), cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)

    c=sorted(cnts, key=cv2.contourArea)
    c = np.delete(c, (-1), axis=0)

    extLeft = tuple(c[c[:, :, 0].argmin()][0])
    extRight = tuple(c[c[:, :, 0].argmax()][0])
    extTop = tuple(c[c[:, :, 1].argmin()][0])
    extBot = tuple(c[c[:, :, 1].argmax()][0])

    下面是错误
    Traceback (most recent call last):
    File "C:/TestCode/DocumentLayoutDetection/extreamPoints.py", line 41, in <module>
    extLeft = tuple(c[c[:, :, 0].argmin()][0])
    IndexError: too many indices for array

    下面的图片只是一个引用图片,我也会尝试其他图片
    Input image

    图 2
    enter image description here

    最佳答案

    您不需要删除最后一个元素,您可以从末尾获取第二个元素。

  • c=sorted(cnts, key=cv2.contourArea) 的结果不是 NumPy 数组,它是 列表 .
    您可以使用 type(c) 检查类型,结果为 <class 'list'> .
    您可以使用 del 删除最后一个元素: del c[-1] ,但你不必这样做。
  • 使用:c = c[-2]用于提取列表的倒数第二个元素。
    现在type(c)<class 'numpy.ndarray'> .
  • 使用 extLeft = c[:, :, 0].min() 查找最小值和最大值和 extRight = c[:, :, 0].max() .

  • 这是代码:
    import imutils
    import cv2
    import numpy as np

    image = cv2.imread(r"SimpleBoxTest.png")
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (5, 5), 0)

    thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1]
    thresh = cv2.erode(thresh, None, iterations=2)
    thresh = cv2.dilate(thresh, None, iterations=2)

    cnts = cv2.findContours(thresh.copy(), cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)

    c=sorted(cnts, key=cv2.contourArea)

    #c = np.delete(c, (-1), axis=0)

    # c is a list, and not a numpy array, so use del instead of np.delete
    # But why?
    # del c[-1]

    # Get one element before the last element in the list
    c = c[-2] # Now c is a numpy.ndarray

    extLeft = c[:, :, 0].min()
    extRight = c[:, :, 0].max()
    extTop = c[:, :, 1].min()
    extBot = c[:, :, 1].max()

    # Draw rectangle for testing
    cv2.rectangle(image, (extLeft, extTop), (extRight, extBot), (0, 255, 0))

    cv2.imshow("image", image)
    cv2.waitKey()
    cv2.destroyAllWindows();

    更新:

    如果您想要找到的所有轮廓中的第二个极值点,您可以迭代 c 中的轮廓:
    # Mark all contours with red:
    cv2.drawContours(image, cnts, -1, (0, 0, 255), thickness=5)

    # Delete last element of the list
    del c[-1]

    # Initialize:
    extLeft, extRight, extTop, extBot = 1e9, -1e9, 1e9, -1e9

    # Iterate list and find the extreme points
    for cc in c:
    extLeft = min(cc[:, :, 0].min(), extLeft)
    extRight = max(cc[:, :, 0].max(), extRight)
    extTop = min(cc[:, :, 1].min(), extTop)
    extBot = max(cc[:, :, 1].max(), extBot)

    # Draw rectangle for testing
    cv2.rectangle(image, (extLeft, extTop), (extRight, extBot), (0, 255, 0), thickness=5)

    不使用 for 循环的解决方案:
  • 您可以使用 np.vstack(c)用于连接列表中的 NumPy 数组。
    然后在连接数组中找到极值点。

  • 代码:
    # Delete last element of the list.
    del c[-1]

    # Concatenate arrays along vertical axis.
    c = np.vstack(c)

    # Find extreme points:
    extLeft = c[:, :, 0].min()
    extRight = c[:, :, 0].max()
    extTop = c[:, :, 1].min()
    extBot = c[:, :, 1].max()

    结果:
    enter image description here

    关于python - 需要使用 Contour 检测图像的第二个极值点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60924331/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com