gpt4 book ai didi

python - 计算图像中矩形的数量

转载 作者:行者123 更新时间:2023-12-02 16:09:57 24 4
gpt4 key购买 nike

背景

我有两个图像,并且我想计算两个图像中矩形的数量。

我已经写了一些代码来查找轮廓,并使用它来查找矩形。但是它没有按预期工作,因此我需要一些帮助:

问题

我对为什么代码找到它能找到的矩形数感到困惑。例如,在第一个图像中,它计数为8,我希望是4。

在第二个中,它计数为16,我认为它是正确的(15个内部和1个外部)。

代码

我的代码如下:

import cv2
import numpy as np

pic = 'boxes1'
image = cv2.imread(f'../Computer Vision/{pic}.jpg', 1)

blur = cv2.pyrMeanShiftFiltering(image, 11, 21)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]

rect_list = []

for cont in contours:
peri = cv2.arcLength(cont, True)
approx = cv2.approxPolyDP(cont, 0.015 * peri, True)
if len(approx) == 4:
x,y,w,h = cv2.boundingRect(approx)
rect = x,y,w,h
rect_list.append(rect)
cv2.rectangle(image,(x,y),(x+w,y+h),(36,255,12),2)

cv2.imshow('thresh', thresh)
cv2.imwrite(f'output_{pic}.png', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(len(rect_list))

当前输出

该代码在第一个图像中找到8个矩形,在第二个图像中找到16个矩形。我认为第一个应该是4,第二个可能是正确的(?)(15个内部和1个外部)。

该代码保存以下输出:

最佳答案

观察到一个矩形恰好有四个角,我们可以利用这一事实,简单地计算图像中的角数。然后,图像中的矩形数应为角数除以四。方法如下:

  • 获取二进制图像。 加载图像,灰度,Gaussian blurOtsu's threshold
  • 消除小噪音。 然后我们find contours使用 cv2.contourArea 使用轮廓区域滤波进行滤波,并通过用 cv2.drawContours 填充轮廓来消除噪声。
  • 查找角落。 我们使用已经实现为 cv2.goodFeaturesToTrack 的Shi-Tomasi拐角检测器进行拐角检测。查看this,以获取每个参数的说明。


  • 角落以绿色突出显示

    enter image description here
    Rectangles: 4.0

    enter image description here
    Rectangles: 16.0


    import cv2

    # Load image, grayscale, blur, Otsu's threshold
    image = cv2.imread('1.jpg')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (3,3), 0)
    thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

    # Remove small noise with contour area filtering
    cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
    area = cv2.contourArea(c)
    if area < 150:
    cv2.drawContours(thresh, [c], -1, 0, -1)

    # Find corners and draw onto image
    corners = cv2.goodFeaturesToTrack(thresh,150,0.5,5)
    for corner in corners:
    x,y = corner.ravel()
    cv2.circle(image,(x,y),3,(36,255,12),-1)

    # The number of rectangles is corners / 4
    print('Rectangles: {}'.format(len(corners)/4))

    cv2.imshow('image', image)
    cv2.waitKey()

    关于python - 计算图像中矩形的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60569457/

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