如何识别一组像素近似为矩形?

4 math graphics image image-processing computer-vision

将左侧像素组视为矩形的数学逻辑是什么?

参考图像

nat*_*ncy 7

这是评论中想法的实现。方法是:

  1. 找到旋转后的矩形边界框
  2. 计算这个旋转边界框的面积和轮廓的面积
  3. 比较两者。如果轮廓面积至少为旋转边界框面积的 80%(或任意阈值),那么我们将其视为矩形

这是图像处理管道的可视化

输入图像->阈值->检测到的旋转矩形边界框->掩模

Contour area: 17719.0
Mask area: 20603.0
Compared area percentage: 86.002%
It is a rectangle!
Run Code Online (Sandbox Code Playgroud)

对于另一张图像

输入图像->阈值->检测到的旋转矩形边界框->掩模

Contour area: 13395.5
Mask area: 19274.5
Compared area percentage: 69.499%
It is not a rectangle!
Run Code Online (Sandbox Code Playgroud)

您没有指定语言,因此这里有一个使用 Python OpenCV 的简单实现

import cv2
import numpy as np

# Load image, convert to grayscale, Otsu's threshold for binary image
image = cv2.imread('1.png')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours, find rotated rectangle, find contour area
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
contour_area = cv2.contourArea(cnts[0])
print('Contour area: {}'.format(contour_area))
rect = cv2.minAreaRect(cnts[0])
box = np.int0(cv2.boxPoints(rect))
cv2.drawContours(image, [box], 0, (36,255,12), 3)

# Find area of rotated bounding box and draw onto mask image
mask_area = cv2.contourArea(box)
cv2.drawContours(mask, [box], 0, (255,255,255), -1)
print('Mask area: {}'.format(mask_area))

# Compare areas and calculate percentage
rectangular_threshold = 80
percentage = (contour_area / mask_area) * 100
print('Compared area percentage: {:.3f}%'.format(percentage))
if percentage > rectangular_threshold:
    print('It is a rectangle!')
else:
    print('It is not a rectangle!')

# Display
cv2.imshow('image', image)
cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)

  • @SneakyPolarBear 嘿你是对的!该部分完全是多余的。您可以直接找到该区域并将其绘制到蒙版上,而无需执行所有这些额外步骤。我想面具也是不必要的,但我会把它留在可视化中 (2认同)